反汇编查看代码在哪段

要查看代码位于哪个段(如 .text.data 等),可以通过反汇编工具分析二进制文件(如可执行文件、库文件等)。以下是常见方法:


1. 使用 objdump(Linux/Unix)

  • 反汇编二进制文件并显示段信息:

    1
    2
    3
    objdump -d <二进制文件名>      # 反汇编所有可执行段(默认显示 `.text` 段)
    objdump -D <二进制文件名> # 反汇编所有段(包括代码和数据)
    objdump -h <二进制文件名> # 显示段头信息(段名称、起始地址、大小等)
  • 示例

    1
    objdump -d program | grep "\.text" -A 10  # 查看 `.text` 段的反汇编代码

2. 使用 readelf(Linux/Unix)

  • 查看二进制文件的段(Segments)和节(Sections)信息:

    1
    2
    readelf -S <二进制文件名>      # 显示所有节(Sections)信息
    readelf -l <二进制文件名> # 显示程序头(Segments)信息
  • 关键输出

    • .text:代码段(存放可执行指令)。
    • .rodata:只读数据段。
    • .data:可读写数据段。

3. 使用 GDB 调试器

  • 在调试时查看代码所在的段:
    1
    2
    3
    gdb <二进制文件名>
    (gdb) info files # 显示所有段的内存地址范围
    (gdb) disassemble main # 反汇编 `main` 函数(位于 `.text` 段)

4. IDA Pro / Ghidra(逆向工程工具)

  • 加载二进制文件后,工具会自动分析代码段和数据段。
  • IDA Pro 中:
    • 左侧的 “Segments” 窗口会列出所有段。
    • 反汇编视图中的代码默认位于 .text 段。

5. 关键段说明

  • **.text**:存放可执行代码(函数、指令)。
  • **.data**:存放初始化的全局变量和静态变量。
  • **.bss**:存放未初始化的全局变量和静态变量。
  • **.rodata**:存放只读数据(如字符串常量)。

6. 示例分析

  • 假设反汇编后看到以下地址:
    1
    0x08048400 <main+0>: push   ebp
  • 通过 readelf -S programobjdump -h program 查看 .text 段的地址范围:
    1
    .text  08048400  000200
    说明 0x08048400 属于 .text 段。

总结

代码(如函数、指令)通常位于 .text 段,通过工具反汇编后,结合段头信息即可定位代码所在的段。