gpt4 book ai didi

linux - Gdb 在自修改代码中切换断点

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:37 24 4
gpt4 key购买 nike

我有一个程序在运行时会修改自己的代码。当我尝试在代码中设置断点时,它永远不会中断,因为代码的修改以某种方式删除了断点。

我听说过硬件断点,但它是用 gdb 写的,我的硬件不支持它们。有没有其他方法可以破解自修改代码?

最佳答案

GDB 有两种放置断点的方法。一种是通过设置某些特殊寄存器来指示 CPU 在执行该行时中断(引发中断,然后内核将其转换为信号给调试器)。这些就是 GDB 所说的“硬件断点”。如果您的硬件不支持它们,则它们不受支持。

另一种方法是实际修改代码,并将要中断的行的第一条指令替换为引发所述中断的命令。例如,在 Intel X86 下,引发中断的命令,比如“int 5”,是两个字节长,但引发中断 3 的命令只有一个字节长。这正是它可以用于此目的的原因。

调试器用中断指令替换指令,一旦遇到断点,就将该代码替换回调试器干预之前的代码。是的,这种技术不适用于自修改代码(我应该提到,也不适用于只读存储器中的代码,例如写入闪存)。

如果您的代码足够有序(显然,它不是特别有序),您可以在代码写入内存后立即中断一次,然后才在正确的位置放置第二个中断点。如果您足够努力地研究 GDB 的脚本功能,您甚至可以将其自动化,这样您就不会为第一个断点而烦恼。

总而言之,如果您正在编写自修改代码,那么您就偏离了正轨。祝你好运。您将需要它。

沙查尔

关于linux - Gdb 在自修改代码中切换断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com