我有一个ELF文件,其中包含我想要修改的某些字符串(它们是配置目录的路径)。 This answer至this question说明了在gdb --write <path_to_executable>
中运行<path_to_executable>
修改字符串的内容,但没有详细说明。使用该命令完成目标需要做的其他事情是什么?
答案 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-file
或set 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存储到该内存位置。