我有一个程序,它可以在运行时修改自己的代码。当我试图在代码中设置断点时,它永远不会中断,因为代码的修改会以某种方式删除断点。
我听说过硬件断点,但它是用gdb编写的,我的硬件不支持它们。有没有其他方法可以破解自修改代码?
发布于 2012-07-23 04:14:04
GDB有两种方式放置断点。一种是通过设置特定的特殊寄存器来指示CPU在执行该行时中断(引发中断,然后内核将其转换为给调试器的信号)。这些就是GDB所说的“硬件断点”。如果它们在您的硬件上不受支持,则它们不受支持。
另一种方法是实际修改代码,并将中断行的第一条指令替换为引发所述中断的命令。例如,在英特尔X86下,引发中断的命令是两个字节长,但引发中断3的命令只有一个字节长。这就是为什么它可以被用来达到这个目的。
调试器用中断的指令替换指令,一旦命中断点,就用调试器干预之前的代码替换回原来的代码。是的,这种技术不适用于自修改代码(我应该提一下,也不适用于只读存储器中的代码,例如写入闪存的代码)。
如果您的代码足够有序(显然,它不是特别有序),那么您可以在代码写入内存后立即中断一次,然后才能在正确的位置放置第二个断点。如果您足够努力地研究GDB的脚本功能,您甚至可以将其自动化,这样您就不会被第一个突破点所困扰。
总而言之,如果你正在编写自我修改的代码,你就偏离了老路。祝好运。你会需要它的。
沙查尔
https://stackoverflow.com/questions/11600541
复制相似问题