用GDB修改可执行文件中的字符串

时间:2017-06-29 22:51:58

标签: gdb

我有一个ELF文件,其中包含我想要修改的某些字符串(它们是配置目录的路径)。 This answerthis question说明了在gdb --write <path_to_executable>中运行<path_to_executable>修改字符串的内容,但没有详细说明。使用该命令完成目标需要做的其他事情是什么?

1 个答案:

答案 0 :(得分:0)

(有一些二进制编辑工具比gdb,任何十六进制编辑程序或一些逆向工程工具更好)

gdb的文档中记录了-write的{​​p> gdb选项:https://sourceware.org/gdb/onlinedocs/gdb/Mode-Options.html#Mode-Options

  

-write

     

打开可读取和写入的可执行文件和核心文件。这相当于GDB中的'set write on'命令(参见补丁)。

修补是指向https://sourceware.org/gdb/onlinedocs/gdb/Patching.html#Patching

的链接
  

17.6修补程序

     

...   如果您希望能够修补二进制文件,可以使用set write命令明确指定。例如,您可能希望打开内部调试标志,甚至进行紧急修复。

     

set write on   set write off   如果指定'set write on',GDB会打开可读取和写入的可执行文件和核心文件;如果指定set write off(默认值),GDB会将其打开为只读。

     

如果您已加载文件,则必须在更改exec-file后再次加载(使用core-fileset write命令),以使新设置生效。

     

show write   显示是否打开可执行文件和核心文件以进行写入和读取。

仍然没有关于文件编辑的信息。只需尝试内存编辑命令set something=value,其中某些内容是正确类型的地址,使用字符串的地址(如https://stackoverflow.com/a/3305200中所示):

https://sourceware.org/gdb/onlinedocs/gdb/Assignment.html#Assignment

  

要将值存储到内存中的任意位置,请使用“{...}”构造在指定的地址处生成指定类型的值(请参阅表达式)。例如,{int} 0x83040将内存位置0x83040称为整数(这意味着内存中存在特定大小和表示),并且

set {int}0x83040 = 4
     

将值4存储到该内存位置。