使用gdb修改二进制文件

使用gdb修改二进制文件,gdb,Gdb,我试图修改gdb下的可执行文件。即使内存已更改,但相应的可执行文件不会更改,因此下次运行该程序时,修改将消失 我用-write选项启动了gdb。 我还尝试设置写入,然后重新加载exec文件 我用set{unsigned char}addr=0xf更改了内存 但相应的文件没有更改 但相应的文件没有更改 很难说您实际修改的地址是什么,所以您的更改是否应该修改二进制文件 在过去,我发现在修改二进制文件后,我需要立即退出。如果我做的不是退出(例如运行),那么GDB将放弃我的更改,但是如果我退出,那么更改

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

我用-write选项启动了gdb。 我还尝试设置写入,然后重新加载exec文件 我用set{unsigned char}addr=0xf更改了内存

但相应的文件没有更改

但相应的文件没有更改

很难说您实际修改的地址是什么,所以您的更改是否应该修改二进制文件

在过去,我发现在修改二进制文件后,我需要立即退出。如果我做的不是退出(例如运行),那么GDB将放弃我的更改,但是如果我退出,那么更改将“接受”

例如:

$ 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
$cat t.c
int main()
{
返回42;
}
$gcc t.c&./a.out;回声$?
42
$gdb——写入–q./a.out
(gdb)disas/r干管
主功能的汇编程序代码转储:
0x0000000000404B4:55推送%rbp
0x0000000000404B5:4889E5MOV%rsp%rbp
0x0000000000404B8:b8 2a 00 00 mov$0x2a,%eax
0x00000000004004bd:5d pop%rbp
0x0000000000404BE:c3 retq
汇编程序转储结束。
(gdb)集合{unsigned char}0x0000000000404B9=22
(gdb)disas/r干管
主功能的汇编程序代码转储:
0x0000000000404B4:55推送%rbp
0x0000000000404B5:4889E5MOV%rsp%rbp
0x0000000000404B8:b8 16 00 00 mov$0x16,%eax
但相应的文件没有更改

很难说您实际修改的地址是什么,所以您的更改是否应该修改二进制文件

在过去,我发现在修改二进制文件后,我需要立即退出。如果我做的不是退出(例如运行),那么GDB将放弃我的更改,但是如果我退出,那么更改将“接受”

例如:

$ 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
$cat t.c
int main()
{
返回42;
}
$gcc t.c&./a.out;回声$?
42
$gdb——写入–q./a.out
(gdb)disas/r干管
主功能的汇编程序代码转储:
0x0000000000404B4:55推送%rbp
0x0000000000404B5:4889E5MOV%rsp%rbp
0x0000000000404B8:b8 2a 00 00 mov$0x2a,%eax
0x00000000004004bd:5d pop%rbp
0x0000000000404BE:c3 retq
汇编程序转储结束。
(gdb)集合{unsigned char}0x0000000000404B9=22
(gdb)disas/r干管
主功能的汇编程序代码转储:
0x0000000000404B4:55推送%rbp
0x0000000000404B5:4889E5MOV%rsp%rbp

0x0000000000404B8:b8 16 00 00 mov$0x16,%eax否您正在更改内存而不是文件。如果你想编辑文件本身,你必须用“ofstream”或类似的方式打开它。你能更具体一点吗?不,您正在更改内存而不是文件。如果你想编辑文件本身,你必须用“ofstream”或类似的方式打开它。你能更具体一点吗?“立即退出”可能就是诀窍。我不小心修改了二进制文件一次,可能是因为“立即退出”。我刚刚验证了你的“立即退出”技巧。它起作用了。因此,在找到需要更改的位置后,退出gdb,使用选项“-write”重新启动gdb,直接并立即发出命令“set{some type}0x..=0x..”,然后立即退出gdb,然后二进制文件被更改!。问题。为什么
unsigned char
而不是
int
?我注意到我们只处理一个字节。这在某种程度上取决于生成的机器代码吗?“立即退出”可能就是诀窍。我不小心修改了二进制文件一次,可能是因为“立即退出”。我刚刚验证了你的“立即退出”技巧。它起作用了。因此,在找到需要更改的位置后,退出gdb,使用选项“-write”重新启动gdb,直接并立即发出命令“set{some type}0x..=0x..”,然后立即退出gdb,然后二进制文件被更改!。问题。为什么
unsigned char
而不是
int
?我注意到我们只处理一个字节。这是否取决于生成的机器代码?