通过解析 ELF C++程序,将字符串文本的地址映射到字符串文本
map the address of string literal to string literal, by parsing ELF C++ program
字符串文字的地址在编译时确定。此地址和字符串文字可以在构建的可执行程序(ELF 格式(中找到。例如,以下代码输出String Literal: 0x400674
printf("String Literal: %pn", "Hello World");
和objdump -s -j .rodata test1
节目
.rodata部分的内容:
400670 01000200 48656c6c 6f20576f 726c6400 ....Hello World。
....
所以看起来我可以通过读取可执行程序本身来获取"Hello World"的虚拟地址。
问题:如何通过读取 ELF 格式在字符串文字的地址和字符串本身之间构建表/映射/字典?
我正在尝试编写一个独立的python脚本或c ++程序来读取elf程序并生成表。如果表中有额外的映射(不是字符串文字(,只要表包含字符串文字的整个映射,就可以了。
我不确定你的问题总是有意义的。详细信息特定于实现(特定于操作系统、编译器和编译标志(。
首先,允许(但不要求(在同一翻译单元中同时看到"abcd"
和"cd"
文字字符串的编译器共享其存储并使用"abcd"+2
作为第二个。看到这个答案。
然后,在 ELF 文件中,字符串只是初始化的只读数据(通常在文本段的.rodata
或.text
部分中(,它们可能恰好与某些非字符串常量相同。ELF文件不保留任何类型信息(除了用-g
编译时作为调试DWARF信息(。换句话说,以下
const uint8_t constable[] = { 0x65, 0x68, 0x6c, 0x6c, 0x6f, 0 };
具有与文本字符串完全相同"hello"
机器表示形式,但不是源字符串。更糟糕的是,机器代码的某些部分可能碰巧看起来像字符串。
顺便说一句,您可以使用 strings(1( 命令,或者研究它的源代码并根据您的需要进行调整。
另请参阅dladdr(3(和这个问题。
请记住,两个不同的进程在虚拟内存中具有(根据定义!(不同的地址空间。另请阅读有关 ASLR 的信息。此外,字符串文字也可能出现在共享对象中(例如像libc.so
这样的共享库(,这些对象通常在不同的地址段中mmap
-ed(因此相同的文字字符串在不同的进程中具有不同的地址!
您可能对 libelf 或 readelf(1( 或 bfd 来读取 ELF 文件感兴趣。
- 在 C++ 中从 8 位 ASCII 字符创建 7 位 ASCII 文本字符串
- cin>>gender 和 cin>>*gender ( c 样式文本字符串)有什么区别
- 是否可以动态检查文本字符串是否是 C++ 中给定类的成员?
- 用Zlib解压缩文本字符串
- 将文本字符串作为常量字符 * 参数传递会导致代码分析器错误
- 来自文本字符串或某种其他机制的代码类自动生成器
- 函数读取最大和min int值,并用文本字符串返回
- 模板代码和文本字符串
- 声明具有常量引用与常量变量的常量文本字符串
- 加密给定的文本字符串-Caesar Cipher
- 如何使用键盘输入和sf ::文本在SFML中添加一种文本框以显示文本字符串
- 在C++代码中,如何让用户在2个文本字符串之间输入一个数字
- 如何将文本从一个文件复制到另一个文件,然后将文本字符串的第一个字母转换为大写
- 从文本字符串推断类型
- 跟踪内存中的文本字符串
- 将字符串变量与整数和文本字符串连接起来的 C++ 字符串流
- 将 char 数组分配给文本字符串 - C++
- 如何修复将文本字符串附加到 C 字符串的错误
- 使用C++读取不同长度的多个文本字符串
- 在C++中创建原始文本字符串,类似于 C# 的"@ string"