MASTG-TECH-0036: 基于仿真的分析
Android 模拟器基于 QEMU,一种通用开源机器模拟器。 QEMU 通过将访客指令即时转换为主机处理器可以理解的指令来模拟访客 CPU。 每个访客指令的基本块都被反汇编并转换为称为 Tiny Code Generator (TCG) 的中间表示。 TCG 块被编译成一个主机指令块,存储在一个代码缓存中,然后执行。 执行基本块后,QEMU 对下一个访客指令块重复此过程(或从缓存加载已转换的块)。 整个过程称为动态二进制转换。
由于 Android 模拟器是 QEMU 的一个分支,因此它具有所有 QEMU 功能,包括监控、调试和跟踪工具。 可以使用 -qemu
命令行标志将 QEMU 特定参数传递给模拟器。 您可以使用 QEMU 的内置跟踪工具来记录已执行的指令和虚拟寄存器值。 使用 -d
命令行标志启动 QEMU 将导致它转储正在执行的访客代码块、微操作或主机指令。 使用 -d_asm
标志,QEMU 会记录所有访客代码的基本块,因为它们进入 QEMU 的转换函数。 以下命令将所有转换后的块记录到一个文件
emulator -show-kernel -avd Nexus_4_API_19 -snapshot default-boot -no-snapshot-save -qemu -d in_asm,cpu 2>/tmp/qemu.log
不幸的是,使用 QEMU 生成完整的访客指令跟踪是不可能的,因为代码块仅在翻译时写入日志,而不是从缓存中提取时写入日志。 例如,如果一个块在循环中重复执行,则只有第一次迭代会被打印到日志中。 除了破解源代码之外,无法在 QEMU 中禁用 TB 缓存。 然而,该功能足以完成基本任务,例如重建本地执行的密码算法的反汇编。