我正在寻找一种巧妙的方法来捕获和摆弄Linux进程的CPUID指令。使用ptrace()并修补由进程创建的所有可执行mmap区域中的所有cpuid操作码,将它们替换为int3。效果不是很好,因为CPUID操作码字节经常作为其他较长操作码的一部分出现。
因此,基本上我正在寻找一些方法,允许我不在特定的内存地址上设置断点,而是在每次调用操作码时设置断点。有没有人知道该怎么做?
发布于 2009-09-18 01:27:15
一般而言,在任意x86代码上执行此操作并捕获所有转折点的唯一方法是:
PTRACE_SINGLESTEP,见下文);或者第一种方法可能更好。
(尝试使用单步执行对操作码进行反编译而不是即时反编译是行不通的,因为它不会捕获诸如自修改代码或跳到另一条指令中间之类的情况)。
要实现单步执行方法,每次跟踪进程停止时,您将使用PTRACE_GETREGS来获取该子进程的寄存器,然后使用子进程的%eip寄存器值作为地址传递给PTRACE_PEEKTEXT,从而获得要执行的下一个字。检查这个字,看看它是否是CPUID指令-如果是,通过调整子寄存器集(包括使%eip超过CPUID指令)来模拟该指令。然后调用PTRACE_SINGLESTEP让这个过程继续。
发布于 2009-09-17 18:41:11
据我所知,要做到这一点没有容易的好方法。
一种糟糕的方式可能是使用GDB的python脚本API自动单步执行程序,在执行之前检查每条指令。
另一种令人讨厌的方法可能是获取开源x86仿真器Bochs的源代码,并对其进行修改,使其在执行感兴趣的指令时执行您想要的操作。
https://stackoverflow.com/questions/1440280
复制相似问题