【问题标题】:Finding strings in the text section在文本部分中查找字符串
【发布时间】:2015-04-29 06:28:40
【问题描述】:

我有以下代码示例:

Foo( "Test1" );

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

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

有没有办法在二进制文件中搜索i_Text指针值来找到相关的String?或者我可以使用gcc 生成任何包含该信息的调试信息吗?

【问题讨论】:

  • 我以前从未见过双重的const
  • 指针上的双常量:第一个常量禁止更改 i_Test 指向的值(例如 *i_Test='a'),第二个指针禁止更改指针本身(例如 ++i_Test)
  • 谢谢,很高兴知道
  • @Yoav "第二个指针禁止..." prolly 的意思是"第二个 const 禁止..."
  • 你能说明你想做什么吗?您是否正在寻找一种从内存中的位置 (i_Text) 到文件中的偏移量的方法?如果是这样,请在程序上运行时查看“readelf --sections”的输出......但是,请注意,除非您使用的是相当不寻常的配置,否则字符串“Test1”将不会存储在 .text 中,它可能会在 .rodata 中。

标签: c gcc


【解决方案1】:

如果您谈论的是 ELF 文件格式,常量字符串存储在 .rodata (read-only-data) 部分.基本上,只有程序的指令(代码)存储在该二进制文件的 .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

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

关于 ELF 文件格式的更多信息可以找到here

【讨论】:

  • 谢谢,正是需要的。现在,由于我在我的平台上使用动态链接,我必须找出如何获取库 .rodata
【解决方案2】:

其实常量字符串不是保存在.text部分,而是保存在.rodata部分。

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

readelf -S ./[your binary file]

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

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

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

编辑

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

【讨论】:

  • 这也会打印一些字符串的起始地址!
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多