在文本部分中查找字符串

时间:2015-04-29 06:28:40

标签: c gcc

我有以下代码示例:

Foo( "Test1" );

void Foo(const char* const i_Test )
{
     // Some logic
}

i_Test中的Foo()指针包含指向.rodata section中字符串的指针。

有没有办法搜索二进制文件中的i_Text指针值来查找相关的字符串?或者我可以使用保存该信息的gcc生成任何调试信息吗?

2 个答案:

答案 0 :(得分:4)

如果您正在讨论 ELF 文件格式,则常量字符串存储在 .rodata (只读数据)部分中。基本上,只有程序的指令(代码)存储在该二进制文件的 .text 部分中。您可以使用对象转储程序(例如objdump)来调查这些部分,如下所示:

objdump -drS program.o           // to see .text section of your program

objdump -s -j .rodata program.o  // to see .rodata section of your program

在上面的示例代码中,传递给"Test1"函数的Foo字符串将被编译器视为常量字符串。因此,您可以在加载阶段之前找到它的相对内存地址,i_Test指针将指向此常量字符串。但是,如果您已将代码编译为position independent(在 gcc 中使用-fPIC选项),您可能还会发现编译器将添加可写属于该只读 .rodata 部分。此外,您还可以使用readelf二进制实用程序来显示有关ELF格式的目标文件部分的详细信息。

有关 ELF 文件格式的更多信息,请参阅here

答案 1 :(得分:2)

实际上,常量字符串不会保存在.text部分中,而是保存在.rodata部分中。

为了查看所有常量字符串,您可以运行:

readelf -S ./[your binary file]

请注意上面输出中.rodata部分的部分编号

readelf -p [.rodata section number you got before] ./[your binary name]

这个命令的作用是打印一个部分内的所有字符串,因为字符串是常量数据,你将获得文件中的所有字符串。您还可以通过计算.rodata节地址及其中的偏移来更改这些字符串,但我发现打开十六进制编辑器,查找字符串并对其进行操作要容易得多(假设我没有更改为更长的字符串)字符串)

修改

您可以直接使用readelf -p .rodata,而不是提供章节号