使用gdb修改二进制文件

时间:2014-10-03 05:47:01

标签: gdb

我试图在gdb下修改可执行文件。即使内存已经更改,但相应的可执行文件没有更改,因此下次运行程序时修改就会消失。

我用-write选项启动了gdb。 我也试过set write然后重新加载exec-file 我用set {unsigned char} addr = 0xf;

更改了内存

但相应的文件未更改。

1 个答案:

答案 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