我最初的观点是要为Linux平台构建比PTRACE系统调用更强大,更通用的功能。 PTRACE的问题在于它只能在您自己的系统和体系结构上运行。

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

在寻找理想的候选对象时,我发现了QEmu监视器界面和一些使用QEmu作为OS /体系结构模拟器来收集跟踪的项目: br />头像

DECAF(TEMU的前身)
PANDA

S2E(似乎是Avatar的子组件?)

TEMU(Bitblaze)

我想要的功能类似于PTRACE接口(冻结执行,逐步运行,内存和寄存器读写)等,都具有多个OS和多个建筑。

我的问题:


我忘了列表中的一些类似项目吗?
QEmu监视器接口可以提供与系统/体系结构无关的PTRACE接口吗?就是我想要的?而且,如果没有,我在QEmu中实现它时可能遇到的主要问题是什么?


评论

你实现了吗?您可以以此来更新您的经历吗?

#1 楼

PANDA开发人员在这里。我认为实际上,您想要的大多数东西都由QEMU的本机gdbstub支持。如果使用-s -S选项启动QEMU,它将在端口1234上侦听传入连接,并提供所需的功能,包括:


使用si命令的单步操作
使用info reg和(例如)set $edi = 0x40c8c39注册获取/设置

x命令读取存储器内容
使用set *(char *) 0x1a5f2c0 = 0xd9修改存储器

使用(例如)break *0x826e2671的断点


因此,使用一些gdb脚本,我认为您应该能够使用普通的gdb和QEMU获得所需的功能。 target remote :1234命令使用Windows 7 32位VM和gdb。

评论


此设置可以告诉我一条指令是读取还是修改内存(以及读/写的值?)。我想PANDA可以做到,对吧?

– gogo_gorilla
16 Mar 15 '16 at 19:51

您可以像通常使用gdb一样设置内存或指令断点。您将无法使用这种方法观看每个内存的读取,但是可以使用PANDA。

–布伦丹·多兰·加维特(Brendan Dolan-Gavitt)
16年3月15日在20:21

我在这里发布了一个有关PANDA的相关问题:reverseengineering.stackexchange.com/questions/12313/…

– gogo_gorilla
16年4月1日在8:35

#2 楼

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

更新:

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

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