-
Notifications
You must be signed in to change notification settings - Fork 749
FAQ
Here are some common questions and answers about the Qiling Framework.
A: Unicorn is a raw CPU emulator. It knows how to execute instructions for different architectures, but it has no concept of operating systems, file formats, or system calls. Qiling is a full-fledged binary emulation framework that is built on top of Unicorn. Qiling adds the OS layer, handling syscalls, API calls, file loading (ELF, PE, Mach-O), and providing a much higher-level interface for binary analysis.
Q: Do I need to have the exact OS to emulate a binary? (e.g., do I need Windows to emulate a Windows EXE?)
A: No. This is one of the key advantages of Qiling. You can emulate a binary from any supported OS on any host OS. For example, you can run a Windows malware sample on a Linux machine, or analyze a MIPS-based IoT firmware on your macOS laptop.
A: A rootfs
(root filesystem) is a directory that contains the necessary system files and libraries for the emulated program to run. When a program is executed, it expects to find standard libraries (like libc.so
on Linux or kernel32.dll
on Windows) and system files. The rootfs
provides this environment. Qiling provides pre-built root filesystems for various OSes and architectures on its releases page.
A: No. Qiling is a command-line and library-based tool. It does not emulate graphical user interfaces. It can run programs that have GUIs, but it only emulates the CPU instructions and the program's interaction with the OS kernel and core libraries, not the visual components.
A: Yes, for a given version of Qiling and its dependencies, the emulation is deterministic. This means that running the same binary with the same inputs will always produce the exact same execution path. This is a critical feature for reproducible analysis and for fuzzing.
A: Emulation is inherently slower than native execution. However, you can improve performance by:
-
Disabling verbose logging: Setting
verbose=QL_VERBOSE.OFF
significantly speeds up emulation. -
Using selective hooking: Avoid using
hook_code
to trace every instruction, as it has a high overhead. Use more targeted hooks (address hooks, syscall hooks) instead. -
Using the snapshot feature: For repetitive tasks like fuzzing, use
ql.save()
andql.restore()
to avoid the cost of re-initializing the emulation for each run.
A: Please open an issue on our GitHub repository. We actively welcome bug reports and contributions from the community.
- Home
- Getting Started
- Core Concepts
- Usage
- Features
- Tutorials
- Development
- Resources