GDB在内存中插入什么类型的字节来调试可执行文件?

时间:2017-05-17 07:17:39

标签: binary x86 gdb gnu

  

GDB在内存中插入什么类型的字节来调试可执行文件?

我知道GDB必须在内存中插入(或操作)一些字节,因为当我调试计算的程序,即内存区域的XOR并在该区域内设置断点时,程序会计算错误结果

但是,如果我执行x(检查内存),那么内存中的所有内容都不会改变。

因此我的问题是:

假设我设置了一个断点,例如b *0x40206e。 GDB对内存中的可执行文件进行了哪些(不可见的)更改以支持调试它?

1 个答案:

答案 0 :(得分:1)

  

我知道GDB必须在内存中插入(或操作)一些字节   Ť   你知道它确实存在,而不是它必须。

GDB 可以使用调试寄存器来插入(少量)断点而无需修改程序代码,但只需在每个断点地址插入0xCC就更容易了:所以没有任何限制,适用于所有处理器,而且更简单。

因此,要在x86上插入断点,GDB会将原始指令的第一个字节保存在自己的内存中(以便以后可以恢复原始指令),并用0xCC覆盖该字节({{ 1}}"陷阱到调试器"指令)。

  

但是,如果我做x(检查内存),那么内存中的所有内容似乎都没有改变。

那是因为GDB知道它插入了断点的位置,并且假装程序代码未被修改(换句话说,int3命令显示了应该是什么在记忆中,而不是实际存在的东西)。

如果它没有,那将是非常混乱的,例如发出examine命令并查看disassemble和" gargbage"原始指示的遗骸。

相关问题