侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux objdump命令教程:如何显示二进制文件的信息(附实际详解和注意事项)

Linux objdump命令介绍

objdump,全名为Object Dump,是一个极其强大的工具,用于显示二进制文件的信息,允许用户查看对象文件的信息,这些信息包括汇编指令、节信息、符号表、重定位信息等。它是GNU Binutils包的一部分,这个包提供了多种工具来操作和分析二进制文件。这个多功能的命令主要用于调试程序,分析程序执行的详细信息,并且是逆向工程和二进制分析中不可或缺的工具。

Linux objdump命令适用的Linux版本

objdump在大多数Linux发行版中都是可用的,因为它是GNU Binutils的一部分。然而,不同的Linux发行版可能会预安装不同版本的Binutils。

在CentOS 7上安装objdump的命令是:

[linux@bashcommandnotfound.cn ~]$ sudo yum install binutils

而在CentOS 8和其他使用dnf的系统上,安装命令则变成了:

[linux@bashcommandnotfound.cn ~]$ sudo dnf install binutils

其他基于Debian的系统(如Ubuntu)使用apt

[linux@bashcommandnotfound.cn ~]$ sudo apt install binutils

Linux objdump命令的基本语法

基本语法格式如下:

objdump [选项]... [文件]...

Linux objdump命令的常用选项或参数说明

选项说明
-a, --archive-headers显示档案库文件头部信息。
-b, --target指定目标二进制文件格式,如elf64-x86-64
-d, --disassemble反汇编指定的节(通常是.text节)中的数据。
-h, --section-headers显示节头部信息。
-j, --section仅显示指定节的信息。
-S, --source显示源代码,需要编译时带有调试信息。
-t, --syms显示符号表条目。
-x, --all-headers显示所有头部信息,包括节头部、文件头部等。
-D, --disassemble-all反汇编所有节的数据,而不仅仅是.text节。
-C, --demangle解析低级符号名称为用户级别名称,便于阅读。

Linux objdump命令的实例

实例1:显示二进制文件的所有头部信息

查看一个二进制文件的所有头信息,可以用于快速了解文件结构。

[linux@bashcommandnotfound.cn ~]$ objdump -x /path/to/binary

实例2:反汇编.text节

展示如何只反汇编二进制文件的.text节,这通常包含了程序的主要执行代码。

[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/binary

实例3:查看符号表

显示一个对象文件的符号表,这对于理解程序中各个函数和变量的布局非常有用。

[linux@bashcommandnotfound.cn ~]$ objdump -t /path/to/binary

实例4:反汇编并显示源代码

如果代码在编译时包含了调试信息,此命令可以同时显示汇编代码和对应的源代码。

[linux@bashcommandnotfound.cn ~]$ objdump -S /path/to/binary

实例5:使用C++名字解码

当分析C++程序时,符号经常会被名字改编(mangle),使用--demangle选项可以使输出更易于阅读。

[linux@bashcommandnotfound.cn ~]$ objdump --demangle -t /path/to/c++binary

实例6:以十六进制形式显示指定节内容

显示二进制文件中指定节(如.data)的内容,以十六进制形式:

[linux@bashcommandnotfound.cn ~]$ objdump -s -j .data /path/to/binary

实例7:解析动态符号表

在分析共享库或动态链接的二进制文件时,查看动态符号表是非常有用的:

[linux@bashcommandnotfound.cn ~]$ objdump -T /path/to/library.so

实例8:显示重定位信息

显示目标文件的重定位入口信息,这对于了解链接过程中地址如何被修改非常重要:

[linux@bashcommandnotfound.cn ~]$ objdump -r /path/to/object.o

实例9:输出所有信息

输出二进制文件的所有可用信息,这个命令会生成大量的输出,但有时对于全面的分析很有帮助:

[linux@bashcommandnotfound.cn ~]$ objdump -a -d -s -h -x /path/to/binary

实例10:查看编译器生成的汇编代码

有时候,分析编译器生成的汇编代码对于了解编译器优化非常有帮助:

[linux@bashcommandnotfound.cn ~]$ objdump -S /path/to/binary > assembly.asm

实例11:比较两个不同的二进制文件

使用objdump输出两个二进制文件的指令集合,然后使用diff工具来比较它们:

[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/first_binary > first.asm
[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/second_binary > second.asm
[linux@bashcommandnotfound.cn ~]$ diff first.asm second.asm

实例12:查找特定函数的汇编代码

如果你知道函数的名字,你可以使用grep来查找该函数的汇编代码:

[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/binary | grep -A20 '<function_name>:'

上述命令中的-A20表示grep将显示匹配行下面的20行,这通常足够显示整个函数的汇编代码。

实例13:查看文件头信息

有时候,了解文件格式的基本信息如魔数(magic number)、架构类型、入口点等非常重要:

[linux@bashcommandnotfound.cn ~]$ objdump -f /path/to/binary

实例14:检查编译器的优化选项

objdump也可以被用来检查编译器使用的优化选项,这些信息可以在.comment节中找到:

[linux@bashcommandnotfound.cn ~]$ objdump -s -j .comment /path/to/binary

实例15:查看特定地址的汇编指令

如果你想查看存储在特定地址的指令,可以使用如下命令:

[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/binary --start-address=0xADDRESS --stop-address=0xADDRESS

0xADDRESS替换为你想要查看的起始和结束地址。这可以用于调试或分析程序执行的特定部分。

Linux objdump命令的注意事项

  • 确保在尝试分析的二进制文件上具有适当的读取权限。
  • 在分析不同架构(如ARM, x86_64, MIPS等)生成的二进制文件时,应使用正确的-b选项指定目标格式。
  • 使用objdump时,应当注意不要将其输出用于自动化脚本,因为输出格式可能会在不同版本的objdump之间发生变化。
  • 注意文件路径的正确性,错误的路径会导致objdump无法找到文件。
  • 如果遇到bash: objdump: command not found错误,请按照上面提供的指令安装binutils包。
0

评论区