代码之家  ›  专栏  ›  技术社区  ›  Norman Ramsey

如何检查Linux上ELF文件的数据部分的内容?

  •  60
  • Norman Ramsey  · 技术社区  · 15 年前

    我一直在用 objdump 查看LinuxELF二进制文件中的汇编代码。

    有时在存储在 rodata (只读数据)部分。

    如何获得 反汇编 或者其他工具来显示这个数据部分的内容?

    我可以执行程序并检查调试器中的相关地址,但我不想这样做,因为它必须以交互方式完成。

    理想的答案将确定一个工具,它不仅可以显示内容,而且可以让我控制显示格式,就像 od 做。

    3 回复  |  直到 9 年前
        1
  •  77
  •   Ciro Santilli OurBigBook.com    9 年前
    objdump -s -j .rodata exefile
    

    rodata 截面如下:

    Contents of section .rodata:
     0000 67452301 efcdab89 67452301 efcdab89  gE#.....gE#.....
     0010 64636261 68676665 64636261 68676665  dcbahgfedcbahgfe
    

    看起来没有任何东西可以控制格式,但这是一个开始。我想,你总是可以把六角头拧松,然后把它喂给OD。

        2
  •  17
  •   Community CDub    8 年前
    readelf -x .rodata hello_world.o
    

    给予:

    Hex dump of section '.rodata':
      0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.
    

    你应该更喜欢 readelf 如果可能,从 objdump 只是不显示某些部分 .symtab : Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?

    您还可以使用下面提到的技术提取原始字节: How do you extract only the contents of an ELF section 如前所述 by ysdx .

        3
  •  10
  •   Community CDub    8 年前

    您可以使用以下命令获取原始(非hexdump ed)elf部分:

    # To a file:
    objcopy file /dev/null --dump-section .text=text.data
    # To stdout:
    objcopy file /dev/null --dump-section .text=/dev/stdout | cat
    

    我在用 | cat 为了迫使stdout成为管道。 /dev/stdout 如果stdout是文件,则可能会意外工作。 .text=- 不发送到stdout,而是发送到 - 文件。

    然而 objcopy and objdump have some deficiencies (因为它们基于提取不同可执行格式的BFD)。

    更新: 我写了一篇 tool 要做到这一点,不依赖BFD。