【Linux】【开发】Linux下分析二进制可执行文件的工具汇总

本文介绍了Linux系统中用于静态和动态分析二进制可执行文件的工具,如file、ldd、strings、Hexdump、size、readelf、nm、objdump、ltrace、strace和gdb,帮助开发者理解和解析文件内容。
摘要由CSDN通过智能技术生成
  • 🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)
  • 🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd
  • 🌐系列专栏:Linux技术
  • 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家三连支持一下呀!!! 👉关注✨、点赞👍、收藏📂、评论。
  • 如需转载请参考转载须知!!

引言

  • 在日常的Linux软件的开发过程中,经常需要对二进制文件进行分析,并对其中的关键信息进行提取。本文对Linux下二进制可执行文件分析的工具做了一个小结,供各位参考。
  • 具体的分析方式,根据使用场景,可分为静态和动态两种。

静态分析

file

  • 日常处理的文件不一定都是可执行文件,通过该命令,可以帮助我们确定二进制文件的具体类型(如ELF、ASCII等);
  • 示例:
[qxhgd@localhost]$$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94943a89d17e9d373b2794dcb1f7e38c95b66c86, stripped
[qxhgd@localhost]$$ file /etc/passwd
/etc/passwd: ASCII text

ldd

  • 用于显示二进制文件所需的动态库,通常用于解决程序因缺少某个库文件而不能运行的一些问题。
  • 示例如下:
[qxhgd@localhost]$ ldd /bin/ls
	linux-vdso.so.1 =>  (0x00007ffef5ba1000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000)
	libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fea9f079000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fea9ee17000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fea9ec13000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fea9fa7b000)
	libattr.so.1 => /lib64/libattr.so.1 (0x00007fea9ea0e000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea9e7f2000)

strings

  • print the strings of printable characters in files.
  • 用于查找二进制文件中包含的字符串。它将提取文件中的可打印字符并显示它们。实际中,可结合grep进行搜索。
  • 示例(打印so中,某个函数所在文件,可变相确认到底该文件编入了哪个so库中):
[qxhgd@localhost]$strings -f "*.so" | grep "xxxxxx"

Hexdump

  • Display file contents in ASCII, decimal, hexadecimal, or octal.
  • Hexdump 是 Linux 系统中的一个强大工具,主要由开发人员和应用程序调试人员使用。它可以将输入文件和数据转换为令人愉快且可读的格式。例如,如果您使用二进制数据,这将很难理解。为了方便起见,您可以快速将二进制数据转换为十六进制或十进制。
  • 示例(以ASCII格式显示文件):
[qxhgd@localhost]$hexdump -C /bin/ls | head
[qxhgd@localhost]$hexdump -C system.log

size

  • GNU 的 size 程序列出参数列表中各目标文件或存档库文件的段大小 — 以及总大小。默认情况下,对每个目标文件或存档库中的每个模块都会产生一行输出。
  • 示例:
[qxhgd@localhost ~]$ size /bin/ls
   text    data     bss     dec     hex filename
 103119    4768    3360  111247   1b28f /bin/ls

readelf

  • Display information about ELF files.
  • 用来显示一个或者多个 elf 格式的目标文件的信息,可以通过它的选项来控制显示哪些信息
  • 示例:
    – 查看头部信息:
[qxhgd@localhost ~]$ readelf -h /bin/ls
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x4042d4
  Start of program headers:          64 (bytes into file)
  Start of section headers:          115696 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         31
  Section header string table index: 30

– 查看全部信息(如符号表)

[qxhgd@localhost ~]$ readelf -a /bin/ls

nm

  • nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。
  • nm命令的输出包含三个部分:
    – 符号值。默认显示十六进制,也可以指定;
    – 符号类型。小写表示是本地符号,大写表示全局符号(external);
    – 符号名称。
  • nm命令的部分功能和readelf是重叠的,但是就符号信息而言,二者是有区别的,整体看,readefl的功能更为强大。
  • 示例:
[qxhgd@localhost ~]$  nm hello | tail
0000000000600e20 d __JCR_END__
0000000000600e20 d __JCR_LIST__
00000000004005b0 T __libc_csu_fini
0000000000400540 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
000000000040051d T main
                 U printf@@GLIBC_2.2.5
0000000000400490 t register_tm_clones
0000000000400430 T _start
0000000000601030 D __TMC_END__

objdump

  • Display information from an object file;
  • objdump命令是Linux下的反汇编工具,可对目标文件或者可执行文件进行操作,它以一种可阅读的格式,让人们更多地了解二进制文件中的附加信息。
  • 常用选项:
  -d, --disassemble        Display assembler contents of executable sections
  -D, --disassemble-all    Display assembler contents of all sections
  -S, --source             Intermix source code with disassembly
  • 示例:
[qxhgd@localhost]$objdump -D -S main.o > main.o.txt

动态分析

ltrace

  • A library call tracer;
  • 系统调用的过程:
    – 用户调用syscall->glibc库->内核执行,返回值->glibc库->syscall->用户。
  • ltrace通过动态链接库的方式来实现跟踪,它在进程执行时插入自己的代码,对库函数的调用进行拦截和记录。
  • ltrace的功能是能够跟踪进程的库函数调用,它会显现出哪个库函数被调用。
  • 示例:
[qxhgd@localhost]$ ltrace ls

strace

  • strace 是 Linux 系统下的一个强大的工具,用于跟踪进程的系统调用和信号。它可以帮助你了解一个程序在运行时与操作系统进行了哪些交互,例如打开文件、读取或写入数据、网络通信等
  • Strace常用来跟踪进程在用户态执行的系统调用流程,但不会跟踪到内核里面发生的事情(内核里面用ftrace)。
  • ltrace与strace使用的技术大体相同,但ltrace在对支持fork和clone方面,不如strace。strace在收到frok和clone等系统调用后,做了相应的处理,而ltrace没有。
  • 示例:
[qxhgd@localhost]$ strace -f /bin/ls

gdb

  • GNU 调试器,用于调试二进制程序。它允许你设置断点、单步执行代码、查看变量值等。
  • 无需多言,懂的都懂。

小结

  • 一旦您熟悉了这些原生 Linux 二进制分析工具并了解了它们提供的输出,您就可以转向更高级、更专业的开源二进制分析工具,例如 radare2等。

如本文对你有些许帮助,欢迎大佬支持我一下,您的支持是我持续创作的不竭动力
支持我的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花神庙码农

你的鼓励是我码字的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值