gpt4 book ai didi

c++ - 将字符串字面量的地址映射到字符串字面量,通过解析ELF C++程序

转载 作者:太空狗 更新时间:2023-10-29 21:41:31 24 4
gpt4 key购买 nike

字符串文字的地址在编译时确定。该地址和字符串文字可以在构建的可执行程序(ELF 格式)中找到。例如,以下代码输出 String Literal: 0x400674

printf("String Literal: %p\n", "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 作为第二个。参见 this answer .

然后,在ELF文件,字符串只是初始化的只读数据(通常在 text segment.rodata.text 部分),它们可能恰好与一些非字符串常量。 ELF 文件不保留任何类型信息(使用 -g 编译时的调试 DWARF 信息除外)。换句话说,以下

const uint8_t constable[] = { 0x65, 0x68, 0x6c, 0x6c, 0x6f, 0 };

"hello" 文字字符串具有完全相同的机器表示,但不是源字符串。更糟糕的是,机器代码的某些部分可能恰好看起来像字符串。

顺便说一句,你可以使用 strings(1)命令,或者研究它的源代码并根据您的需要进行调整。

另见 dladdr(3)this question .

请记住两个不同的 processes有(根据定义!)不同的address spacesvirtual memory .另请阅读 ASLR .字符串文字也可能出现在共享对象中(例如共享库,如 libc.so),它们通常在不同的地址段中被 mmap 编辑(因此相同的文字字符串会有不同的不同进程中的地址!)。

您可能对 libelf 感兴趣或 readelf(1)bfd读取 ELF 文件。

关于c++ - 将字符串字面量的地址映射到字符串字面量,通过解析ELF C++程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28621984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com