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

Binary GDB在内存中插入什么类型的字节来调试可执行文件?,binary,x86,gdb,gnu,Binary,X86,Gdb,Gnu,GDB在内存中插入什么类型的字节来调试可执行文件 我知道GDB必须在内存中插入(或操纵)一些字节,因为当我调试一个计算程序时,例如,在内存区域上的XOR并在该区域内设置断点,那么该程序就会计算错误的结果 但是,如果我执行x(检查内存),那么内存中的所有内容似乎都没有变化 因此,我的问题是: 假设我设置了一个断点,例如,b*0x40206e。GDB对内存中的可执行文件做了哪些(不可见)更改以支持调试它 我知道GDB必须在内存中插入(或操作)一些字节 T 你知道这是事实,而不是必须的 GDB可以使用

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

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

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

因此,我的问题是:

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

我知道GDB必须在内存中插入(或操作)一些字节 T 你知道这是事实,而不是必须的

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

因此,为了在x86上插入断点,GDB将原始指令的第一个字节保存在自己的内存中(以便以后可以恢复原始指令),并用
0xCC
(int3“trap to debugger”指令)覆盖该字节

然而,如果我执行x(检查内存),那么内存中的所有内容似乎都没有变化

这是因为GDB知道它在哪里插入了断点,并且假装程序代码没有修改(换句话说,
examine
命令显示内存中应该存在的内容,而不是实际存在的内容)


如果没有,它将非常混乱,例如发出
反汇编
命令并查看
int3
和原始指令的“gargbage”剩余部分。

相关:那么,要插入断点0xcc,GDB会移动内存中的字节吗?我不明白为什么它会破坏反汇编,因为int3会显示原始指令(不是垃圾)?@Shuzheng不,它不会。它用
0xCC
覆盖原始指令操作码(并将原始值保存在其他位置,以便以后恢复)。谢谢-这也回答了我的分解问题!谢谢