Skip to content
xwings edited this page Jul 6, 2025 · 2 revisions

Frequently Asked Questions (FAQ)

Here are some common questions and answers about the Qiling Framework.

Q: What is the difference between Qiling and Unicorn?

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.

Q: What is a rootfs and why do I need one?

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.

Q: Can Qiling emulate programs with GUIs?

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.

Q: Is Qiling deterministic?

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.

Q: How can I improve emulation performance?

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() and ql.restore() to avoid the cost of re-initializing the emulation for each run.

Q: I found a bug or a missing API. What should I do?

A: Please open an issue on our GitHub repository. We actively welcome bug reports and contributions from the community.

Clone this wiki locally