逆向工程网络安全虚拟化物联网【免费下载链接】qilingA True Instrumentable Binary Emulation Framework项目地址https://gitcode.com/gh_mirrors/qi/qiling点击查看免费下载导读本文围绕开源仓库根目录下的 ARCHITECTURE.md 展开系统讲解 QilingA True Instrumentable Binary Emulation Framework的分层架构、核心组件、从初始化到执行的完整运行流程、Hook 拦截体系以及面向未来演进的混合内核架构Hybrid Kernel Architecture扩展方案。读完本文你将能理解 Qiling 如何在 Unicorn 裸 CPU 模拟之上叠加 OS 抽象层掌握Qiling主入口类的关键属性与用法、select_arch/select_os等运行时组件选择机制并能够借助 KernelProxy 将缺失的 Linux 系统调用转发给真实内核执行。一、总体架构从 Unicorn 到完整 OS 模拟Qiling 构建在 Unicorn CPU 模拟引擎之上通过增加系统级抽象系统调用、虚拟文件系统、二进制加载器实现无需真实硬件即可完整执行二进制程序。其分层结构自上而下为┌──────────────────────────────────────────────────┐ │ User Script / qltool │ ├──────────────────────────────────────────────────┤ │ Qiling Core (core.py) │ │ hooks · state snapshots · patches │ ├────────────┬─────────────┬───────────────────────┤ │ OS Layer │ Loader │ Memory Manager │ │ (QlOs) │ (QlLoader) │ (QlMemoryManager) │ │ syscalls │ ELF/PE/ │ map · read · write │ │ APIs │ MachO/etc │ MMIO callbacks │ ├────────────┴─────────────┴───────────────────────┤ │ Architecture Layer (QlArch) │ │ registers · disassembly · calling conventions │ ├──────────────────────────────────────────────────┤ │ Unicorn Engine (CPU) │ │ instruction-level emulation │ └──────────────────────────────────────────────────┘各层的职责可以概括为用户脚本 / qltool使用 qltool 命令行或 Python 脚本驱动模拟会话Qiling Core由 qiling/core.py 中的Qiling类承担负责装配所有组件、管理 hook、状态快照与二进制补丁OS Layer / Loader / Memory Manager对应QlOs、QlLoader、QlMemoryManager分别处理系统调用与 API、二进制格式解析、内存映射与读写Architecture LayerQlArch提供寄存器访问、反汇编Capstone与调用约定Unicorn Engine提供最底层的指令级模拟能力。二、仓库目录结构qiling/包按关注点划分模块与架构分层一一对应qiling/core.pyQiling类——主入口与编排器core_hooks.py 与 core_hooks_types.py 实现 hook 系统core_struct.py 提供字节序感知的 struct 打包工具qiling/const.py枚举定义QL_ARCH、QL_OS、QL_ENDIAN等exception.py 为自定义异常体系utils.py 提供select_arch/select_os等组件选择函数host.py 抽象宿主机平台qiling/arch/架构实现x86/x86-64/8086、ARMv7、ARMv8、MIPS32、RISC-V 32/64、PowerPC 32、Cortex-M、寄存器管理register.py、CPU 模型models.pyqiling/os/操作系统实现包含抽象基类 os.py、内存管理器 memory.py、函数调用接口 fcall.py、syscall/API 映射 mapper.py、虚拟路径解析 path.py、文件描述符抽象 filestruct.py、线程原语 thread.py以及 posix/linux/freebsd/macos/qnx/windows/uefi/dos/mcu/blob 各具体 OS 子目录qiling/loader/二进制格式加载器ELF、PE、PE-UEFI、Mach-O、DOS COM/EXE、MCU 固件、裸 blobqiling/cc/各架构调用约定intel 的 cdecl/stdcall/ms64、arm 的 aarch32/aarch64、mips o32、riscv ABI、ppc ABIqiling/hw/MCU 外设模拟GPIO、定时器、UART、SPI、I2C、网络、ADC/DAC、中断控制器、Flash、DMA 等qiling/debugger/调试子系统含 gdb/GDB 远程协议服务器与 qdb/Qiling 原生调试器支持逆向调试qiling/extensions/可选扩展multitask.py 基于 gevent 的多线程、trace.py 指令跟踪、sanitizers/ 内存消毒器、afl/ AFL 模糊测试集成、r2/ Radare2 集成、idaplugin/ IDA Pro 插件qiling/profiles/默认 OS 配置文件.ql格式如 linux.ql 定义栈/堆地址、内核参数。仓库根目录还包含 CLI 工具 qltool、TUI 界面 qltui.py、examples/ 示例脚本与 tests/ 测试套件。三、核心组件剖析3.1Qiling主类core.py每个模拟会话都会创建一个Qiling实例它拥有并串联所有其他组件。典型构造方式ql Qiling( argv[/path/to/binary, arg1], # 二进制路径 参数 rootfs/path/to/rootfs, # 虚拟文件系统根目录 ostypeQL_OS.LINUX, # 目标 OS省略时自动探测 archtypeQL_ARCH.X8664, # 目标架构省略时自动探测 )结合 core.py 源码Qiling继承自QlCoreHookshook 管理与QlCoreStructs字节序感知的 struct完整构造参数还包括env环境变量、codeshellcode 字节与argv互斥、cputypeCPU 型号、verbose日志级别、profile配置文件路径或映射、console、log_devices、multithread、filter、stop、endian、thumb、libcache等。其中code与argv互斥这一约束在源码中有显式校验core.py。Qiling的关键属性如下表Property类型说明ql.archQlArchCPU 架构——寄存器、反汇编ql.osQlOs操作系统——系统调用、I/O、APIql.loaderQlLoader二进制加载器——解析并映射可执行文件ql.memQlMemoryManager内存管理——map/read/write/MMIOql.ucunicorn.Uc底层 Unicorn 引擎实例此外还有ql.pathargv 中指定的二进制路径、ql.rootfs虚拟根目录模拟程序被限制在其中的路径源码提示 除非完全信任模拟程序否则不要使用宿主机根目录、ql.profileConfigParser对象qiling/profiles/*.ql、ql.hw裸机硬件管理器仅 baremetal 模式可用等属性。3.2 架构层qiling/arch/QlArch是抽象基类每个架构子类负责配置Unicorn 引擎的 mode 与架构常量通过ql.arch.regs按名称读写寄存器反汇编器Capstone与汇编器Keystone栈操作push/pop指针宽度感知字节序与位宽16/32/64。已支持架构x86、x86-64、8086、ARM、ARM64、MIPS、RISC-V32/64、PowerPC、Cortex-M。ARM 额外支持 endian 与 Thumb 模式参数见 utils.py select_arch 中为 ARM 传入endian/thumb、为 MIPS 传入endian的处理。3.3 OS 层qiling/os/QlOs是抽象基类每个 OS 子类提供系统调用/中断分发将 CPU 中断路由到处理函数I/O 流stdin、stdout、stderr可拦截替换虚拟文件系统通过rootfs进行路径映射函数调用接口ql.os.fcall读取参数、设置返回值API 拦截set_api()用于 hook 库函数。POSIX 子系统qiling/os/posix/Linux、FreeBSD、macOS、QNX 共享的 syscall 实现具体处理器位于os/posix/syscall/下另含kernel_proxy/混合内核代理见后文。Windowsqiling/os/windows/通过 hook DLL 导入表模拟 Win32/Win64 API支持注册表registry.py、线程thread.py、句柄handle.py、纤程fiber.py以及大量 DLL 级 API 实现ntdll.py、user32.py、kernel32、advapi32.py等。UEFIqiling/os/uefi/模拟 UEFI Boot Servicesbs.py、Runtime Servicesrt.py与 SMMsmm.py使用 GUID 数据库与协议框架。3.4 加载器层qiling/loader/QlLoader是抽象基类。加载器负责解析二进制格式、将段映射进内存、解析符号、加载依赖、设置初始 CPU 状态PC、SP。加载器与格式/使用方的对应关系Loader格式使用方QlLoaderELFELFLinux、FreeBSD、QNXQlLoaderPEPE/COFFWindows、UEFIQlLoaderMachoMach-OmacOSQlLoaderDOSCOM/EXEDOSQlLoaderMCUFirmwareCortex-M MCUQlLoaderBlobRaw bytesShellcode / blob3.5 内存管理器qiling/os/memory.pyQlMemoryManager在 Unicorn 内存模型之上封装了更高级的操作见 memory.py 定义清单map(addr, size, perms)/unmap(addr, size)——区域管理read(addr, size)/write(addr, data)——数据访问read_ptr(addr)/write_ptr(addr, val)——指针宽度感知的读写read_cstring(addr)——读取以\0结尾的字符串map_mmio(addr, size, handler)——内存映射外设的 MMIO 回调支持此外还有search按字节串/正则搜索内存、find_free_space/map_anywhere空闲区域查找与映射、save/restore内存状态快照、get_mapinfo等实用能力。3.6 调用约定qiling/cc/每种架构都有调用约定类抽象参数传递与返回值处理。QlOs.fcall接口基于这些类提供与平台无关的统一方式读取函数参数fcall.py 提供readParams/writeParams/call/call_native等能力。四、执行流程4.1 初始化Qiling.__init__Qiling(argv, rootfs) │ ├─ Detect arch/OS from binary headers (ql_guess_emu_env) │ ELF magic → parse e_machine, OSABI │ PE magic → parse Machine, Subsystem │ MachO magic → parse CPU type │ ├─ Create QlArch (select_arch) → initializes Unicorn engine ├─ Create QlLoader (select_loader) ├─ Create QlMemoryManager ├─ Create QlOs (select_os) │ └─ loader.run() ├─ Parse binary format (headers, segments, sections) ├─ Map segments into memory ├─ Load shared libraries / DLLs ├─ Setup stack, heap, TLS, auxiliary vectors └─ Set initial PC (entry point) and SP源码印证core.py若未显式提供archtype则调用ql_guess_emu_env(self.path)根据文件魔数自动猜测架构与 OS——ELF 解析e_machine/OSABIPE 解析Machine/SubsystemMach-O 解析 CPU 类型若已给架构但未给 OS则通过arch_os_convert由架构推断 OS随后依次创建QlArch、QlLoader、QlMemoryManager、QlOs最后调用self.loader.run()完成加载并调用_init_stop_guard()写入退出守卫。4.2 执行ql.run()ql.run(begin, end, timeout, count) │ ├─ Apply binary patches (ql.patch) ├─ Write exit trap (guard address) │ └─ os.run() └─ uc.emu_start(entry_point, exit_point) │ ├─ Unicorn executes instructions │ ├─ Hooks fire on: │ ├─ Every instruction (hook_code) │ ├─ Basic blocks (hook_block) │ ├─ Memory access (hook_mem_read/write) │ ├─ Interrupts (hook_intno) → syscall dispatch │ ├─ Specific addresses (hook_address) │ └─ Specific instructions (hook_insn) │ └─ Stops when PC reaches exit point, timeout, ql.emu_stop(), or unhandled exceptionrun() 源码 展示了四个参数的语义begin/end指定模拟起始/结束地址timeout以微秒为单位的时长上限默认不限count为指令数上限默认不限。执行前会先初始化调试器若设置、应用二进制补丁do_bin_patch、写入退出陷阱write_exit_trap随后调用self.os.run()进入uc.emu_start。4.3 系统调用处理当被模拟程序发出系统调用int 0x80、syscall、svc等时CPU interrupt/instruction → Unicorn interrupt hook → QlOs syscall dispatcher → Look up handler by syscall number → Handler reads args via calling convention → Emulates syscall behavior → Sets return value in registers具体到 posix.py 的 load_syscall先通过syscall_abi.get_id()读取系统调用号经syscall_mapper映射为名称再在posix_syscall_hooks三个拦截点QL_INTERCEPT.ENTER/EXIT/CALL中查找用户注册的 hook未注册则回落到 OS 专属或 POSIX 共享的syscall模块中查找同名处理函数最终通过syscall_abi.get_params(...)按调用约定读取参数、执行处理器、以set_return_value(retval)写回返回值。五、组件动态选择机制组件在运行时依据QL_ARCH与QL_OS枚举动态选择qiling/utils.py 提供select_arch(archtype, cputype, endian, thumb)→ 架构类源码select_os(ostype)→ OS 类源码select_loader(ostype, libcache)→ 加载器类源码select_debugger(options)→ 调试器类源码支持gdb与qdb两种调试器及其参数解析。这套机制使统一代码库得以支持多样的平台组合例如 Linux/FreeBSD/QNX 共用 ELF 加载器Windows 与 UEFI 共用 PE 加载器而select_arch内部按架构映射到QlArchX86/QlArchARM/QlArchMips等具体类。arch_convert/os_convert还提供了别名转换如amd64→x8664、darwin→macos。六、Hook 系统core_hooks.py 对 Unicorn 回调机制进行了封装包括UC_HOOK_CODE、UC_HOOK_BLOCK、UC_HOOK_INTR、UC_HOOK_INSN、UC_HOOK_MEM_*等底层常量见 源码导入段。Hook 类型与触发时机Hook 类型触发时机hook_code每条指令可限定地址范围hook_block每个基本块入口hook_address到达特定地址hook_intnoCPU 中断/异常hook_insn特定指令类型如syscallhook_mem_read内存读hook_mem_write内存写hook_mem_invalid非法内存访问Hook 可限定地址范围并可通过返回带QL_HOOK_BLOCK掩码的整数来阻断后续 hook 链的执行见回调协议注释 core_hooks.py。七、关键扩展点自定义系统调用——通过ql.os.set_syscall(name_or_num, handler, intercept)替换或扩展任意系统调用intercept支持QL_INTERCEPT.CALL替换、ENTER前置、EXIT后置三种语义posix.pyAPI hooking——ql.os.set_api(name, callback)拦截库函数调用二进制补丁——ql.patch(offset, data, targetNone)运行时打补丁target为None时作用于主可执行文件否则作用于指定库core.py状态快照——ql.save()/ql.restore()做检查点save可按需选择包含寄存器reg、内存mem、硬件hw仅裸机、FD 表fd、Unicorn 上下文cpu_context、OS 状态os、加载器状态loader并可选写入快照文件core.py调试器挂接——GDB 远程协议qiling/debugger/gdb/或原生 QDB 调试器qiling/debugger/qdb/覆盖率/追踪——extensions/tracing/、extensions/trace.py模糊测试——通过extensions/afl/集成 AFL硬件外设——在hw/中注册自定义 MCU 外设。八、混合内核架构Hybrid Kernel Architecture详细实现计划与任务跟踪见 TODO.md。8.1 要解决的问题Qiling 以 Python 逐系统调用地重新实现 Linux 内核行为这对简单操作文件 I/O、内存管理、stat可行但无法覆盖完整内核面网络无 epoll套接字代理到宿主机套接字且无隔离无真实 TCP 状态机、无多播、无 raw/netlink 套接字多线程gevent 协程为协作式、单线程无抢占、无真实并发futex 退化为 gevent Event使用 pthreads、互斥锁、条件变量的程序行为不正确信号signal()、sigaction()、kill()大多为桩实现无信号投递、无EINTR、无SA_RESTART长尾capabilities、cgroups、namespaces、io_uring、seccomp、eBPF——内核 API 面庞大且持续增长。8.2 解决方案混合架构保留 Unicorn 做 CPU 模拟、Qiling 做插桩但将复杂内核子系统通过kernel proxy辅助进程卸载给真实 Linux 内核简单系统调用仍由 Python 模拟。Syscall interrupt → load_syscall() [UNCHANGED — existing dispatch in posix.py] → check posix_syscall_hooks[CALL] → proxy hook registered? → forward to kernel proxy → no proxy hook? → existing Python handler [UNCHANGED]由用户显式选择转发哪些缺失的系统调用非自动行为——默认情况下 Qiling 行为与今天完全一致。集成复用现有的set_syscall()CALL hook 机制posix.py因此load_syscall()与所有现有分发代码完全不变。proxy KernelProxy(ql) proxy.forward_syscall(epoll_create, returns_fdTrue) proxy.forward_syscall(epoll_ctl) proxy.forward_syscall(epoll_wait) ql.run()该方案已在源码中落地qiling/os/posix/kernel_proxy/ 包含KernelProxy类init.py、参数类型描述argtypes.pyINT/FD/PtrIn/PtrOut/PtrInOut、IPC 客户端/服务端ipc.py、代理 FDproxy_fd.py并有测试 tests/test_kernel_proxy.py。实现细节对应init.py 源码KernelProxy(ql)构造时要求宿主机为 Linux否则抛出QlErrorArch并启动一个代理子进程python -m qiling.os.posix.kernel_proxy.proxy socket_fd通过 Unix socketpair 通信代理进程proxy.py加载 libc通过libc.syscall()执行真实 Linux 系统调用以内核约定的负数 errno 返回结果支持raw_syscall整型参数直传与raw_syscall_ex带缓冲区打包in_bufs初始化入参、out_specs回写输出forward_syscall(name, returns_fdFalse, arg_typesNone)在注册时解析访客架构的系统调用号_resolve_syscall_nr并为该调用注册一个QL_INTERCEPT.CALLhookreturns_fdTrue时返回值被包装成ql_proxy_fd对象存入 Qiling FD 表_alloc_fd由于 FD 表本身已是多态的ql_socket、ql_file、ql_pipe现有ql_syscall_read/ql_syscall_close等处理器会自动经由代理 FD 的.read()/.close()方法分发无需改动arg_types支持FD访客 FD 翻译为代理 FD、PtrIn/PtrOut/PtrInOut访客内存缓冲区与代理侧互拷默认全部按INT直传大小可用 lambda 动态计算如epoll_wait的PtrOut(sizelambda a: a[2] * 12)代理进程支持FD_OP消息READ/WRITE/CLOSE/DUP/FCNTL/IOCTL使ql_proxy_fd能在代理侧执行文件描述符操作proxy.py。8.3 分阶段实施计划阶段范围风险目标0概念验证低用户手动转发特定系统调用——零现有代码改动1网络基础低-中socket 系统调用专用 hook、ql_proxy_fd、TCP 可用2完整网络中epoll、poll/select、网络命名空间3真实线程高每线程一个 Unicorn、共享内存、真实 futex4信号中真实信号投递、EINTR、处理器执行5集成低API 打磨、回退、平台支持、基准测试阶段 0 赋予用户明确控制权——由用户指定要转发的缺失系统调用阶段 1-2 为网络引入指针感知转发与预置 forwarder阶段 3线程风险最高延后到网络稳定后再做。每个阶段保持向后兼容——混合模式为可选默认行为不变。8.4 备选方案评估在 Unicorn 中运行真实内核Unicorn 不模拟硬件中断控制器、MMU 页表、定时器需要重建 QEMU system 模式基于 ptrace 执行原生运行并拦截系统调用速度快但无跨架构支持、指令级 hook 有限User-Mode LinuxUML将内核作为用户态进程运行仅 x86、维护乏力、系统调用桥接复杂自动转发所有未实现系统调用方便但不可预测——难以调试可能转发本不应转发的调用安全、状态泄漏风险。显式用户控制更安全。最终选择混合方案是因为它在不修改现有分发路径的前提下既保留了 Qiling 的核心价值插桩 跨架构模拟又在最关键处获得真实内核行为。九、测试体系测试位于 tests/ 目录按平台组织test_elf.py、test_pe.py、test_macho.py、test_dos.py、test_mcu.py等以 examples/rootfs/ 下的二进制作为测试夹具。此外还有针对本架构文档新增能力的test_kernel_proxy.py、针对调试器的test_debugger.py/test_qdb.py、模糊测试的test_afl.py、UEFI 的test_uefi.py等。十、支持的平台组合架构x86、x86-64、8086、ARM、ARM64、MIPS、RISC-V32/64、PowerPC、Cortex-M操作系统Linux、FreeBSD、macOS、Windows、UEFI、DOS、QNX、MCU裸机、Blob。结语Qiling 的架构核心在于分层 可插拔Unicorn 提供指令级模拟底座QlArch/QlOs/QlLoader/QlMemoryManager各司其职Qiling主类统一装配utils.py的运行时选择机制让任意 OS×Arch 组合得以从统一代码库动态组装。在此基础上Hook 系统与 kernel proxy 分别提供了Python 侧插桩与真实内核卸载两种互补的扩展路径前者面向逆向分析与模糊测试后者则为完整网络、线程、信号等复杂内核语义指明了演进方向——而这正是 TODO.md 所跟踪的混合内核架构路线图的目标。赞分享逆向工程网络安全虚拟化物联网【免费下载链接】qilingA True Instrumentable Binary Emulation Framework项目地址https://gitcode.com/gh_mirrors/qi/qiling点击查看免费下载相关推荐Kode-CLI 系统架构深度解析从五层分层设计到工具执行、权限与扩展机制Kode CLI 系统架构深度解析从五层分层设计到工具执行、权限与扩展机制 本文以 Kode CLI 的官方架构文档 docs/develop/architAI 应用开发工具AI AgentCLI如何使用摸鱼低代码的7大AI助手自然语言直接操作业务系统的完整指南如何使用摸鱼低代码的7大AI助手自然语言直接操作业务系统的完整指南 摸鱼低代码是一款让开发像摸鱼一样轻松的低代码/无代码平台内置 7 大 AI 助手 深入解析Darwin-XNUmacOS/iOS内核的混合架构设计深入解析Darwin XNUmacOS/iOS内核的混合架构设计 Darwin XNU内核作为苹果生态系统的核心采用独特的混合架构设计巧妙融合了Mach微操作系统驱动开发上一篇Skinview3D 开源项目教程下一篇SimplENet 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?