1、Unicorn只是一个CPU模拟器,它主要针对的是模拟CPU指令。Unicorn无法识别高级概念,例如动态库、系统调用、I/O处理或类似PE、MachO或ELF这样的可执行文件格式。因此,Unicorn只能够模拟原始设备指令,无法适用于操作系统上下文场景。
2、Qiling是一个高级框架,它可以利用Unicorn来模拟CPU指令,但是它同样可以理解操作系统上下文,它集成了可执行文件格式加载器、动态链接、系统调用和I/O处理器。更重要的是,Qiling可以在不需要原生操作系统的环境下运行可执行文件源码。
Qiling vs Qemu用户模式
Qemu用户模式跟我们的Qiling类似,它可以跨架构模拟整个可执行文件的源码。但是,Qiling的不同之处在于:
1、Qiling是一个真正的分析框架,它允许我们构建自己的动态分析工具(使用Python)。除此之外,Qemu只是一款工具,而不是一个框架。
2、Qiling可以执行动态指令,并且能够在运行时进行代码修补,这一点Qemu就无法做到了。
3、Qiling支持跨平台,但是Qemu用户模式只能在与源代码环境相同的操作系统上使用。
4、Qiling支持更多的平台,包括Windows、macOS、Linux&BSD,但Qemu用户模式只支持Linux&BSD。
工具安装
广大研究人员可以使用下列命令安装Qiling(注意:安装前请搭建好Python 3环境):
python3 setup.py install
工具使用样例
在下面的例子中,我们将演示如何使用Qiling框架来在一台Linux设备上模拟目标Windows可执行文件:
fromqiling import*#sandbox to emulate the EXEdefmy_sandbox( path, rootfs): #setup Qiling engineql =Qiling(path, rootfs) #now emulate the EXEql.run if__name__=="__main__": #execute Windows EXE under our rootfsmy_sandbox([ "examples/rootfs/x86_windows/bin/x86-windows-hello.exe"], "examples/rootfs/x86_windows")
在下面的例子中,我们将演示如何使用Qiling框架对Windows crackme进行动态修复,并在“Congratulation”对话框中显示相关信息:
fromqiling import*defforce_call_dialog_func( ql): #get DialogFunc addresslpDialogFunc =ql.unpack32(ql.mem_read(ql.sp -0x8, 4)) #setup stack memory for DialogFuncql.stack_push( 0) ql.stack_push( 1001) ql.stack_push( 273) ql.stack_push( 0) ql.stack_push( 0x0401018) #force EIP to DialogFuncql.pc =lpDialogFunc defmy_sandbox( path, rootfs): ql =Qiling(path, rootfs) #NOP out some codeql.patch( 0x004010B5, b'\x90\x90') ql.patch( 0x004010CD, b'\x90\x90') ql.patch( 0x0040110B, b'\x90\x90') ql.patch( 0x00401112, b'\x90\x90') #hook at an address with a callbackql.hook_address( 0x00401016, force_call_dialog_func) ql.run if__name__=="__main__": my_sandbox([ "rootfs/x86_windows/bin/Easy_CrackMe.exe"], "rootfs/x86_windows") 工具演示视频 Qiling DEMO 1:动态修复Windows crackme Wannacry DEMO:如何使用Qiling分析Wannacry恶意软件 QltoolQiling还提供了一个名为qltool的强大工具,它可以帮助我们快速模拟出目标Shellcode或可执行文件的源码。
下面这条命令可以直接对目标源码进行模拟:
$ ./qltool run -f examples/rootfs/arm_linux/bin/arm32-hello --rootfs examples/rootfs/arm_linux/
如需模拟Shellcode,则需要运行下列命令:
$ ./qltool shellcode --os linux --arch x86 --asm -f examples/shellcodes/lin32_execve.asm 许可证协议
Qiling项目的开发与发布遵循。
项目地址Qiling:【GitHub传送门】