GDB可以更改正在运行的程序的汇编代码吗?

时间:2011-06-24 21:23:41

标签: linux debugging gdb x86

我想为/ bin / ls添加一些额外的功能。
所以我在gdb上启动它,并在开头添加了一个断点。

现在的问题是:如何在内存中更改正在运行的程序的代码?我可以看到汇编代码,但我无法修改。我该怎么办?

在Windows上,我可以使用olldbg轻松完成此操作。在Linux上怎么样?

(我知道这样做我只会更改内存中进程的代码。所以我可以将内存转储到文件中,然后我将更改保存在二进制文件中。)

谢谢。

5 个答案:

答案 0 :(得分:15)

您可以直接将二进制文件写入内存,但GDB默认情况下没有汇编程序内置,但您可以执行set *(unsigned char*)0x80FFDDEE = 0x90之类的操作来将该地址的助记符更改为NOP。但是,您可以使用NASM编写shellcode并使用perl或python将其注入程序:)

你可能也喜欢这个小的.gdbinit文件来简化调试:https://gist.github.com/985474

答案 1 :(得分:7)

我建议使用其他方法:下载coreutils包并修改ls的源代码。如果可能,您应该从发行版的源代码库获取软件包并应用任何修补程序。

答案 2 :(得分:3)

Here is a blog post解释了如何在运行时为gdb和Visual Studio更改代码。

答案 3 :(得分:2)

compile code命令

在7.9左右引入,它允许代码编译和注入。文档:https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html

我给出了一个最小的例子in this answer

虽然它不是实际的代码修改,但它确实允许你动态编译一些代码并立即运行一次,这可能就足够了。

GNU cauldron presentation建议稍后可以添加实际代码修改作为此功能的扩展,请参阅幻灯片30"修复并继续"。

有一些结构不像我预期的那样有效return,所以我在In the GDB compile code command, what language constructs behave exactly as if they were present in the original source?

询问了原因

答案 4 :(得分:0)

在编译过程中,您可以使用gcc-plugin编写扩展名来修改coed并添加任何其他功能。如果您使用机器级别的代码,则应使用Pin和Dyninst之类的二进制检测工具来检测磁盘上的二进制文件。但是,如果开销是重要的问题,则应谨慎使用此类工具。