考虑以下main.c
:
#include <stdio.h>
const char greeting[] = "hello world";
int main() {
printf("%s!\n", greeting);
return 0;
}
我在Ubuntu中编译了这个:
gcc -g main.c -o main.exe
我想检索变量greeting
的值;考虑到它是const
,它不会改变,所以应该可以从可执行文件中检索值“hello world”。
基本上,我可以看到二进制文件中的变量名:
$ readelf -p .rodata main.exe | grep hello
[ 8] hello world
...我可以看到值使用:
$ readelf -s main.exe | grep greeting
59: 0000000000002008 12 OBJECT GLOBAL DEFAULT 18 greeting
我可以尝试解析readelf -s
和readelf -p
的输出以获得我想要的结果(检索名为greeting
的变量的值),但我很确定我会搞砸它。
那么,是否存在一些bintools实用程序(或任何命令行程序)的开关组合,它们将执行与下面的伪代码等效的操作:
$ [tool] --get-value-of-variable-name greeting --program=main.exe
"hello world"
或者甚至:
$ [tool] --verbose --get-value-of-variable-name greeting --program=main.exe
The constant value of the variable "greeting" in `main.exe` is:
"hello world"
1条答案
按热度按时间mccptt671#
是否存在一些bintools实用程序(或任何命令行程序)的开关组合,它们将执行与下面的伪代码等效的操作:
当然可以:
把这些放在一起(我的文件与你的文件的数据略有不同):
这告诉我,我需要转储
12
字节(实际上是11个,因为我不希望终止\0
),从偏移量0x2000 + (0x2008 (symbol address) - 0x2000 (section address))
开始。现在,从
readelf
输出中解析出这些数据的麻烦比它的价值要大得多--编写一个简单的C++
程序来生成所需的输出要容易得多。使用ELFIO应该会使这变得非常容易。