我试图在gdb下修改可执行文件。即使内存已经更改,但相应的可执行文件没有更改,因此下次运行程序时修改就会消失。
我用-write选项启动了gdb。 我也试过set write然后重新加载exec-file 我用set {unsigned char} addr = 0xf;
更改了内存但相应的文件未更改。
答案 0 :(得分:5)
但相应的文件未更改。
很难说你实际修改的地址是什么,所以你的更改是否应该实际修改二进制文件。
过去,我发现在修改二进制文件后,我需要立即 quit
。如果我执行quit
以外的任何操作(例如run
),那么GDB会放弃我的更改,但如果我quit
,则更改将“取走”。
示例:
$ cat t.c
int main()
{
return 42;
}
$ gcc t.c && ./a.out; echo $?
42
$ gdb --write -q ./a.out
(gdb) disas/r main
Dump of assembler code for function main:
0x00000000004004b4 <+0>: 55 push %rbp
0x00000000004004b5 <+1>: 48 89 e5 mov %rsp,%rbp
0x00000000004004b8 <+4>: b8 2a 00 00 00 mov $0x2a,%eax
0x00000000004004bd <+9>: 5d pop %rbp
0x00000000004004be <+10>: c3 retq
End of assembler dump.
(gdb) set {unsigned char}0x00000000004004b9 = 22
(gdb) disas/r main
Dump of assembler code for function main:
0x00000000004004b4 <+0>: 55 push %rbp
0x00000000004004b5 <+1>: 48 89 e5 mov %rsp,%rbp
0x00000000004004b8 <+4>: b8 16 00 00 00 mov $0x16,%eax <<< ---changed
0x00000000004004bd <+9>: 5d pop %rbp
0x00000000004004be <+10>: c3 retq
End of assembler dump.
(gdb) q
$ ./a.out; echo $?
22 <<<--- Just as desired