使用 QEmu 监视器接口从二进制文件中提取执行跟踪?

逆向工程 动态分析 奇木
2021-06-09 03:17:39

我最初的观点是构建比PTRACELinux 平台系统调用更强大和更通用的东西问题PTRACE在于它只能在您自己的系统和架构上运行。

一个想法是运行具有不同操作系统和(可能)不同架构的虚拟机(或者更好的模拟器)。

在寻找理想的候选人时,我发现了QEmu 监视器接口和几个使用QEmu作为操作系统/架构模拟器来收集跟踪的项目:

我想要的功能类似于PTRACE界面(冻结执行、逐步运行、内存和寄存器读取和写入,...),所有这些都具有多种操作系统和多种架构。

我的问题:

  • 我是否忘记了清单中的一些类似项目?
  • QEmu 监视器界面可以PTRACE像我想要的那样提供与系统/架构无关的界面吗?如果没有,在 QEmu 中实现它时我可能遇到的主要问题是什么?
2个回答

熊猫开发者在这里。我认为实际上 QEMU 的原生 gdbstub 支持大多数你想要的东西。如果您使用这些-s -S选项启动 QEMU ,它将在端口 1234 上侦听传入连接,并提供您想要的功能,包括:

  • 单步使用si命令
  • 使用info reg注册获取/设置(例如)set $edi = 0x40c8c39
  • 使用x命令读取内存内容
  • 使用修改内存 set *(char *) 0x1a5f2c0 = 0xd9
  • 断点使用(例如) break *0x826e2671

所以使用一些 gdb 脚本,我认为你应该能够通过普通的 gdb 和 QEMU 获得你想要的功能。

所有这些都只是使用 Windows 7 32 位 VM 和 gdb 使用target remote :1234命令进行了测试。

过去的TEMU用户在这里。也许您应该尝试更多地了解 TEMU(我没有),以防止重复已经完成的工作。PTRACE 只记录系统调用转换,但如果你使用 QEMU,更好的粒度是基本块。不确定 TEMU 是否有能力做到这一点,其想法是每个基本块都可以唯一标识所采用路径的一部分,而无需深入了解寄存器/值级别的较低级别的细节。即,噪音更少,但比系统调用更精致。知道基本块的每个入口和出口点的寄存器的完整状态,几乎可以确定地确定整个执行跟踪的路径是什么,减去所有中间寄存器值,如果需要,可以推导出。(“几乎”,因为像中断这样的异步事件可能发生)。

更新:

还有另一个选项: QEmu + Lttng,但由于默认 Qemu 不提供该功能,您必须下载 QEMU 源代码,并编译它以启用 lttn-ust 跟踪。

http://linuxmogeb.blogspot.sg/2014/08/how-to-trace-qemu-using-lttng-ust.html