使用 gdb 修改二进制文件
Posted
技术标签:
【中文标题】使用 gdb 修改二进制文件【英文标题】:Use gdb to Modify Binary 【发布时间】:2014-11-28 05:04:03 【问题描述】:我试图修改gdb下的可执行文件。虽然内存变了,但是对应的可执行文件没有变,所以下次运行程序修改就没有了。
我使用 -write 选项启动 gdb。 我也尝试过设置写入然后重新加载执行文件 我用 set unsigned charaddr = 0xf;
改变了内存但对应的文件没有改变。
【问题讨论】:
不,您正在更改内存而不是文件。如果你想编辑文件本身,你必须用'ofstream'之类的方法打开它。 你能说得更具体些吗? ? 【参考方案1】:但对应的文件没有改变。
很难说您实际修改的是哪个地址,以及您的更改是否应该实际修改二进制文件。
以前我发现修改二进制后需要立即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 char0x00000000004004b9 = 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
【讨论】:
“立即退出”的事情可能是诀窍。我不小心修改了一次二进制文件,可能是因为“立即退出”。 我刚刚验证了你的“立即退出”技巧。有用。所以在找出需要改变的地方之后,QUIT gdb,用选项“--write”重新启动gdb,直接立即给出命令“set some type0x..=0x..”,然后立即退出gdb,然后二进制是变了!。 问题。为什么是unsigned char
而不是int
?我注意到我们操纵了一个字节。这是否取决于生成的机器代码?以上是关于使用 gdb 修改二进制文件的主要内容,如果未能解决你的问题,请参考以下文章
如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?