Linux 二进制分析利器:strings 命令从入门到实战全解
一、命令简介
strings 命令用于在二进制文件、可执行文件、对象文件或任何数据文件中查找并提取可打印的字符串序列。它默认识别长度至少为 4 个字符的可打印 ASCII 字符串(以换行符或空字符终止)。
该工具在逆向工程、调试和二进制文件分析中非常有用,常用于查找硬编码的路径、版本信息、错误消息、密钥或分析未知的文件格式。
二、语法格式
基本语法
bash
运行
strings [选项]... [文件]...可以指定一个或多个文件进行扫描。 如果未指定文件,或文件参数为 -,则默认从标准输入(stdin)读取数据。
三、常用选项及说明
表格
| 选项 | 长选项 | 说明 |
|---|---|---|
| -a | --all | 扫描整个文件,而不仅仅是目标文件(如 ELF)中已初始化的加载段(如 .data、.text)。对于普通数据文件,此行为通常是默认的。 |
| -f | --print-file-name | 在输出的每个字符串前显示其所属的文件名。这在同时检查多个文件时非常有用。 |
| -n <长度> | --bytes=<长度> | 设置被识别为字符串的最小长度(字符数)。默认值为 4。 |
| -<数字> | 传统简写,功能等同于 -n <数字>。例如,-8 等价于 -n 8。 | |
| -t <格式> | --radix=<格式> | 在输出的每一行前显示字符串在文件中的偏移量(位置)。<格式> 可以是:o:八进制偏移量d:十进制偏移量(默认)x:十六进制偏移量 |
| -o | 等同于 -t o,以八进制显示偏移量。 | |
| -e <编码> | --encoding=<编码> | 指定要搜索的字符编码和字节序。可选值:s:7-bit ASCIIS:8-bit ASCIIb:16-bit 大端序 (Big-endian) Unicode (UTF-16BE)l:16-bit 小端序 (Little-endian) Unicode (UTF-16LE)B:32-bit 大端序L:32-bit 小端序 |
| -T <目标> | --target=<目标> | 指定二进制文件的目标格式(如 elf64-x86-64, elf32-i386 等)。这会影响节区(section)的解析方式。 |
| - | 一个传统选项,指示扫描整个文件(类似于 -a)。现代版本中通常不需要显式使用。 | |
| --help | 显示帮助信息并退出。 | |
| --version | 显示版本信息并退出。 |
四、示例用法
示例 1:基本用法
查找 /bin/ls 可执行文件中的所有默认长度(≥4 字符)的可打印字符串。
bash
运行
strings /bin/ls示例 2:指定最小字符串长度
只显示 /usr/bin/bash 中长度至少为 10 个字符的字符串。
bash
运行
strings -n 10 /usr/bin/bash # 或使用传统格式 strings -10 /usr/bin/bash示例 3:显示字符串在文件中的位置
显示 /bin/cat 中的字符串及其在文件中的十六进制偏移量。
bash
运行
strings -t x /bin/cat输出示例:
plaintext
1b20 /lib64/ld-linux-x86-64.so.2 1b7a libc.so.6 ...示例 4:扫描多个文件并显示文件名
同时扫描多个共享库文件,并在每行输出前显示来源文件名。
bash
运行
strings -f /lib/x86_64-linux-gnu/libc*.so.6 | head -20示例 5:结合管道进行过滤
查找 /sbin/init 中所有包含 “error” 的字符串(不区分大小写)。
bash
运行
strings /sbin/init | grep -i error示例 6:扫描整个文件(包括非加载段)
强制扫描 a.out 对象的每一个字节,即使它不在标准的节区内。
bash
运行
strings -a a.out示例 7:搜索宽字符(Unicode)字符串
在 Windows PE 文件(如 .exe)或某些数据文件中查找 UTF-16LE 编码的字符串。
bash
运行
strings -e l suspicious_file.bin五、注意事项
输出内容: strings 的输出可能包含大量看似无意义的文本,因为任何连续的 4 个及以上可打印字节都会被当作 “字符串” 输出。通常需要结合 grep、awk 等工具进行过滤和针对性分析。
编码问题: 默认只查找 ASCII 字符串。如果文件包含 UTF-8(多字节)、UTF-16 或其他编码的文本,需要使用 -e 选项指定正确的编码,否则可能无法识别或输出乱码。
二进制文件格式: 对于复杂的可执行文件(如 ELF、PE),strings 默认可能只扫描某些特定的节区(如 .rodata)。使用 -a 选项可以确保扫描整个文件,但可能会更慢并产生更多输出。
性能: 扫描非常大的文件(如数 GB 的内存转储或磁盘镜像)时,strings 可能会消耗较多时间和内存。可以考虑先使用 dd 等工具提取感兴趣的区域再进行分析。
安全与隐私: strings 常被用于提取二进制文件中可能硬编码的敏感信息(如密码、API 密钥、内网地址)。在发布软件前,建议使用此工具检查是否有意外泄露的信息。