Unicorn: 下一代 CPU 仿真器框架 www.unicorn- engine.org NGUYEN Anh Quynh <aquynh- at- gamil.com> Syscan360 Beijing October 21 st, 2015
自我介绍 Nguyen Anh Quynh (aquynh - at- gmail.com) 计算机科学博士, 安全研究员 操作系统 虚拟机器 二进制分析 入侵取证等 Capstone 独立框架 (capstone- engine.org)
议程 1. CPU 仿真器 背景介绍 现存 CPU 仿真器的问题 2. Unicorn 引擎 : 要求 想法 设计和实现 Unicorn 的目标 设计和实现 利用 Unicorn API 编写应用程序 3. 现场演示 4. 总结
CPU 仿真器 定义 模拟物理 CPU 仅使用软件 仅集中于 CPU 操作, 但是忽略机器设备 应用程序 无需有真实的 CPU 去模拟代码 跨构架的主机游戏模拟器 安全地分析恶意代码, 检测病毒签名 逆向时确认代码语义
举例 模仿理解代码语义
CPU 仿真器的内部构造 给定的以二进制形式输入代码 解码二进制到单独的指令 每一条指令的精确模拟 指令集和 CPU 构架的手册是必须的 处理内存访问和 I/O 请求 每一步后更新 CPU 上下文 ( 寄存器和内存等 )
举例模拟 X86 32 位指令 例如 :50 push eax 加载 eax 寄存器 复制 eax 值到栈底 减少 esp 除以 4, 和更新 esp 例如 :01D1 添加 eax, ebx 加载 eax 和 ebx 寄存器 添加 eax 和 ebx 值, 然后复制结果到 eax 相应的更新标志 OF SF ZF AF CF PF
创建 CPU 仿真器的挑战 大量的工作! 对 CPU 架构有很好的理解 对指令集有很好的理解 带有各种副作用的指令 ( 有些是未文档的, 例如 :Intel X86) 很难支持现有的所有类型的代码
这个 CPU 仿真器好吗? 多架构? X86 Arm Arm64 Mips PowerPC Sparc 等 多平台? 支持 *nix Windows Android ios 等 更新? 紧跟最新的 CPU 扩展 独立? 支持建立独立的工具 性能好吗? JIT 编译器技术 vs 还是翻译器技术?
现有的 CPU 仿真器 多架构 : 现有工具仅支持 X86 已更新 : 现有工具不支持 X86_64 1. 设计可以, 但是不起作用 2. 仅集中于检测 Windows shellcode 3. Python 4. 仅用于 IDA
梦想一个好的仿真器 多架构 Arm Arm64 Mips PowerPC Sparc X86 (+X86_64) 以及更多 多平台 :*nix Windows Android ios 等 更新 : 最新的所有硬件架构的扩展 同各种语言实现方式无关 底层框架来支持各种操作系统和工具 使用 C 语言为核心, 支持多种绑定语言 良好的性能与 JIT 编译器技术 动态编译 vs 翻译 允许不同级别的测量和追踪手段 独步式 / 指令 / 内存访问
问题 即使在 2015 年也没有合理的 CPU 仿真器! 显然没有人想去解决这个问题 生命中没有光明 直到 Unicorn 降临!
Unicorn == 新一代 CPU 仿真器
Unicorn 的目标 多架构 Arm Arm64 Mips PowerPC Sparc X86 (+X86_64) 以及更多 多平台 :*nix Windows Android ios 等 更新 : 最新的所有硬件架构的扩展 核心在于 C 语言, 同时支持多种绑定语言 良好的性能与 JIT 编译器技术 允许各级仪器 独步式 / 指令 / 内存访问
Unicorn vs 其他 多架构 : 现有工具仅支持 X86 更新 : 现有工具不支持 X86_64
建立 Unicorn 引擎的挑战 大量的工作! 许多硬件架构 许多指令 带有各种副作用的指令 ( 有些是未文档的, 例如 :Intel X86) 很难支持现有的所有类型的代码 资源有限 开始作为一个私人的有趣业余的项目
Unicorn 设计
野心和想法 几个月内拥有所有的功能, 而不是几年! 在初始阶段站在巨人的肩膀上 开源项目去获得社区参与与贡献 想法 :Qemu!
介绍 Qemu Qemu 项目 开源项目 (GPL 许可证 ) 用于系统仿真器 : hep://www.qemu.org 巨大的社区和高度活跃 多架构 X86 Arm Arm64 Mips PowerPC Sparc 等 18 个架构 多平台 Compile on *nix + cross- compile for Windows
Qemu 架构 Courtesy of cmchao
为什么要 Qemu? 支持各种架构和更新快 已经用纯 C 语言实现了, 所以容易实现 Unicorn 的核心 已经支持 JIT 在 CPU 仿真下
我们做到了吗?
建立 Unicorn 的挑战 (1) Qemu 代码库是个挑战 不仅模拟 CPU, 而且设备模型和 ROM / BIOS 完全模拟物理机器 Qemu 代码库是超级大和杂乱的就像意大利面一样 :- ( 难以阅读, 因为代码是由许多不同的开发者贡献的 Unicorn 的工作 只保留 CPU 仿真代码和移除其他 ( 设备 ROM/BIOS 迁移等 ) 坚持支持像 Qobject 和 Qom 子系统 重写一些组件但是保持 CPU 仿真代码的完整性 ( 以便将来与 Qemu 同步
建立 Unicorn 的挑战 (2) Qemu 是一组仿真器 用于单个架构的一组仿真器 在编译时独立建造 所有架构代码共享大量的内部数据结构和全局变量 Unicorn 想要一个仿真器, 支持所有的架构 :- ( Unicorn 的工作 隔离的常用变量和数据结构 确保线程安全的设计 重构允许同时多个实例的 Unicorn 改进构建系统去支持按需多个架构
建立 Unicorn 的挑战 (3) Qemu 没有测量和追踪手段 仅在静态编译时提供 JIT 利用大量快速路径技巧优化性能, 使代码插装极其困难 Unicorn 的工作 从头构建动态细粒度测量追踪层 支持各种级别的追踪和测量 单步或特定指令 (TCG 级别 ) 内存访问的测量和追踪 (TLB 级别 ) 在模拟中动态读写寄存器或者内存 处理异常 中断 系统调用 (arch- level) 通过用户提供回调
建立 Unicorn 的挑战 (4) Qemu 存在泄漏内存的现象 代码中到处都是对象打开后 ( 内存分配 ) 没有正常关闭 ( 内存释放 ) 的现象 作为工具来说还可以, 但是对于框架是不能接受的 Unicorn 的工作 发现和修复所有的内存泄露问题 重构各种子系统去跟踪和清理悬挂指针
Unicorn vs Qemu Qemu 的分支, 但是已远远超过了它 独立的框架 可以在没有上下文的前提下模拟原始的二进制 在内存中规模更加紧凑 轻便 线程安全与多个架构支持在一个单一的二进制 为动态测量和追踪提供接口 提供绑定 (Python, Java, Go,.NET as of version 0.9) 对漏洞攻击抵抗力更强 ( 更安全 ) CPU 仿真成分从未被成功攻击过 作为一个 API 容易去测试
Qemu 漏洞
运用 Unicorn 编写应用程序
介绍 Unicorn API 干净 简单 轻便和直观的构架无关 API 提供 C 格式的核心 API 打开和关闭 Unicorn 实例 启动和停止仿真 ( 基于结束地址 时间或者指令数 ) 读取和写入内存 读取和写入寄存器 内存管理 : 挂钩内存事件 在运行时动态 dump 内存 挂钩无效内存访问的内存事件 在运行时动态 dump 内存 ( 处理无效的 / 失踪的内存 ) 可以使用用户自定义的回调来测量指令 单步以及内存事件等 核心外围可由 Python/Java/Go/.NET 构建
用 C 语言示例代码
用 Python 示例代码
现场演示
现状和未来工作 现状 2015 年 10 月 15 日, 发布 0.9 版本 支持 Arm, Arm64, Mips, M68K, Sparc, X86 (+X86_64) Python/Java/Go/.NET 绑定可用 基于 Qemu2.2.1 未来工作 支持 Qemu 所有剩余的架构 (PPC/alpha/s360x/microblaze/sh4/etc - 总共 18 个 ) 社区承诺所有的 bindings! 与 Qemu2.4.1 同步 ( 目前最新版 ) Unicorn 的未来由 Qemu 积极发展来保证!
总结 Unicorn 是一个创新的新一代 CPU 仿真器 多架构 + 多平台 干净 简单 轻便和直观的构架无关 API 通过纯正 C 语言已经实现, 多种绑定可用 高性能与 JIT 编译器技术 支持细粒度各种级别的测量和追踪 设计级的线程安全 开源 GPL 许可证 未来更新保证所有的架构 我们非常重视致力于这个项目使它成为最好的 CPU 仿真器
提问和回答 Unicorn: 新一代 CPU 仿真器框架 hep://www.unicorn- engine.org NGUYEN Anh Quynh <aquynh - at- gmail.com>
参考文献 Qemu: hep://www.qemu.org libemu: hep://libemu.carnivore.it PyEmu: hep://code.google.com/p/pyemu libcpu: heps://github.com/libcpu/libcpu IDA- x86emu: hep://www.idabook.com/x86emu/index.html Unicorn engine Homepage: hep://www.unicorn- engine.org Mailing list:hep://www.freelists.org/list/unicorn- engine Twieer: @unicorn_engine
致谢 感谢 Nguyen Tan Cong 帮助我演示 shellcode! 感谢其他测试人员帮助改进我们的代码!