我试图了解如何在rodata段中设置字符串的值,因为使用环境变量加载它会给我带来问题。我想在rodata部分外部设置一个常量字符串。这个函数应该独立于执行的代码。所以,当我这样做时
"objdump -c foo"
rodata 部分必须征用此字符串,而文件 foo.c 不必这样做。如何在 .rodata 部分中设置常量?
编辑:Linux 操作系统和使用 GCC
我不能使用环境变量,因为这意味着修改了 c 代码,我希望 c 代码保持不变并添加常量,例如“Goo”到rodata 段。
我试图了解如何在rodata段中设置字符串的值,因为使用环境变量加载它会给我带来问题。我想在rodata部分外部设置一个常量字符串。这个函数应该独立于执行的代码。所以,当我这样做时
"objdump -c foo"
rodata 部分必须征用此字符串,而文件 foo.c 不必这样做。如何在 .rodata 部分中设置常量?
编辑:Linux 操作系统和使用 GCC
我不能使用环境变量,因为这意味着修改了 c 代码,我希望 c 代码保持不变并添加常量,例如“Goo”到rodata 段。
我已经设法编写了一个小的 bash 脚本,它或多或少地完成了我认为你想要的。
首先让我们考虑这个示例程序:
#include <stdio.h>
const char message[1024] = "world";
int main()
{
printf("hello %s\n", message);
}
目标变量将是message
. 请注意,我不会更改变量的大小,那会很乱,您要小心保留尽可能多的内存。
现在脚本:
#!/bin/bash
# usage: patchsym PROGRAM SYMBOL < NEWCONTENT
EXE="$1"
SYMBOL="$2"
OFFS=$((0x$(objdump -t "$EXE" | grep " $SYMBOL$" | cut -d ' ' -f 1)))
OFFS=2176
dd of="$EXE" bs=1 seek=$OFFS conv=notrunc
新的消息内容将是:
universe^@
(^@
实际上是一个 NUL 字符)。
现在只需执行以下操作:
$ gcc test.c -o test
$ ./test
hello world
$ ./patchsym test message < newmsg
$ ./test
hello universe
然后你需要编写一个程序来修改二进制文件。
阅读 ELF 文件规范。
然后编写一个程序,修改 ELF 程序和节头,并将数据添加到 .rodata 节。