一个真正的可插桩二进制仿真框架
Qiling 是一个高级二进制模拟框架,具有以下特性:
Qiling 也已在多个国际会议上亮相。
2022 年:
2021 年:
2020 年:
2019 年:
Qiling 基于 Unicorn Engine。
访问我们的 网站 获取更多信息。
本程序为自由软件;您可以依据自由软件基金会发布的 GNU 通用公共许可证(GPL)第二版或(根据您的选择)任何后续版本的条款重新分发和/或修改它。
有许多开源模拟器,但与 Qiling 最接近的两个项目是 Unicorn 和 QEMU user mode。 本节将说明 Qiling 相对于它们的主要差异。
Qiling 构建于 Unicorn 之上,但两者本质不同。
QEMU user mode 与我们的模拟器所做的工作类似,即以跨架构的方式模拟整个可执行二进制文件。 然而,Qiling 在以下几个方面与 QEMU user mode 有显著差异:
请参阅 setup guide 文件了解如何安装 Qiling Framework。
下面的示例演示了如何以最直接的方式使用 Qiling 框架模拟 Windows 可执行文件。
from qiling import Qiling
if __name__ == "__main__":
# 初始化 Qiling 实例,指定要模拟的可执行文件及模拟系统根目录。
# 注意:当前工作目录假定为 Qiling 主目录
ql = Qiling([r'examples/rootfs/x86_windows/bin/x86_hello.exe'], r'examples/rootfs/x86_windows')
# 开始模拟
ql.run()
from qiling import Qiling
def force_call_dialog_func(ql: Qiling):
# 从当前栈帧获取 DialogFunc 地址
lpDialogFunc = ql.stack_read(-8)
# 为 DialogFunc 设置栈内存
ql.stack_push(0)
ql.stack_push(1001) # IDS_APPNAME
ql.stack_push(0x111) # WM_COMMAND
ql.stack_push(0)
# 压入返回地址
ql.stack_push(0x0401018)
# 从 DialogFunc 地址恢复模拟
ql.arch.regs.eip = lpDialogFunc
if __name__ == "__main__":
# 初始化 Qiling 实例
ql = Qiling([r'rootfs/x86_windows/bin/Easy_CrackMe.exe'], r'rootfs/x86_windows')
# NOP 掉一些代码
ql.patch(0x004010B5, b'\x90\x90')
ql.patch(0x004010CD, b'\x90\x90')
ql.patch(0x0040110B, b'\x90\x90')
ql.patch(0x00401112, b'\x90\x90')
# 在某个地址处钩子,设置回调函数
ql.hook_address(force_call_dialog_func, 0x00401016)
ql.run()
以下 YouTube 视频展示了上述示例的工作原理。
Qiling Framework 在 x86_64 Ubuntu 主机上热修补并模拟了一个 ARM 路由器的 /usr/bin/httpd。
该视频演示了 Qiling 的 IDA Pro 插件如何使 IDA Pro 与 Qiling 插桩引擎一起运行。
使用 Qiling Framework 和 IDA Pro 解决一个简单的 CTF 挑战
Qiling Framework 模拟 MBR
Qiling 还提供了一个便捷的工具 qltool,用于快速模拟 shellcode 和可执行二进制文件。
使用 qltool,可以轻松执行:
使用 shellcode:
$ ./qltool code --os linux --arch arm --format hex -f examples/shellcodes/linarm32_tcp_reverse_shell.hex
使用二进制文件:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --rootfs examples/rootfs/x8664_linux/
启用 GDB 调试器与二进制文件:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --gdb 127.0.0.1:9999 --rootfs examples/rootfs/x8664_linux
收集代码覆盖率(目前仅支持 UEFI):
$ ./qltool run -f examples/rootfs/x8664_efi/bin/TcgPlatformSetupPolicy --rootfs examples/rootfs/x8664_efi --coverage-format drcov --coverage-file TcgPlatformSetupPolicy.cov
输出 JSON 格式(主要针对 Windows):
$ ./qltool run -f examples/rootfs/x86_windows/bin/x86_hello.exe --rootfs examples/rootfs/x86_windows/ --console False --json
从我们的网站 https://www.qiling.io 获取最新信息。
通过电子邮件 [email protected] 联系我们, 或通过 Twitter @qiling_io。
请参阅 CREDITS.md。