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

我想添加一些额外的funcionality到/ bin / ls。
所以我开始在gdb上,并在开始时添加了一个断点。

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

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

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

谢谢。

你可以直接写二进制到内存,但是GDB在默认情况下没有内置汇编器,你可以像set *(unsigned char*)0x80FFDDEE = 0x90将这个地址的助记符改为NOP。 你可以使用NASM编写一个shellcode并使用perl或者python把它注入到程序中:)

您可能也喜欢这个小的.gdbinit文件,使调试更容易: https ://gist.github.com/985474

我会推荐一个不同的方法:下载coreutils包并修改ls的源代码。 如果可能的话,您应该从发行版的源代码仓库获取软件包并应用任何补丁。

这里是一篇博客文章 ,解释如何在运行时为gdb和Visual Studio更改代码。

7.9左右介绍的compile code命令允许代码编译和注入。 文档: https : //sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html

我在这个答案中给出了一个简单的例子。

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

GNU大锅演示文稿提示,稍后可能会添加实际的代码修改,作为此功能的扩展,请参见幻灯片30“修复并继续”。

有一些结构不像我期望的那样工作,所以我问了为什么: 在GDB编译代码命令中,什么语言结构的行为就像它们出现在原始源代码中一样?