strings 是什么
strings 是 binutils 里的工具,扫描任意文件中的连续可打印字符并输出。默认把长度不少于 4 的 ASCII 序列当作一个字符串,所以压缩包、加密文件、可执行代码里的随机字节基本扫不出东西。它的实用价值集中在三类:看二进制里硬编码的版本号与编译路径,判断程序由什么工具链构建;排查发行包或镜像里是否误打包了口令、密钥、内网地址;分析崩溃转储、内存镜像里残留的可读内容。
基本信息
| 适用平台 | GNU/Linux(binutils)、macOS(随 Xcode 命令行工具) |
|---|---|
| 语法 | strings [选项] 文件 |
| 默认阈值 | 长度不少于 4 的连续可打印 ASCII 字符 |
| 常用选项 | -n 最小长度 -a 全文件扫描 -t 输出偏移 -e 指定编码 |
| 默认范围 | 只扫描文件的已加载数据段 |
| 局限 | 对压缩、加密内容无效,中文多字节串易被阈值过滤 |
典型使用场景
- 查二进制里嵌的版本号与构建信息:确认装的 sshd、nginx 是哪个版本编译的。
- 排查镜像或发布包里是否误打包了口令、token、内网域名等敏感串。
- 分析 core dump 或崩溃现场,找出异常上报的 URL、库名、路径。
- 配合 file 判断可疑文件类型:压缩包、脚本、ELF 一眼就能分辨。
- 从固件、镜像里快速提取可读提示信息,定位厂商与版本线索。
常用写法
常用写法
strings /usr/sbin/sshd | grep -i -m5 openssh # 查二进制里的版本串
strings -n 8 app.bin | grep -iE 'version|build' # 提高长度阈值减少噪音
strings -a core.dump | grep -iE 'password|token' | head # 全文件扫描排查泄漏
strings -e l data.bin | head # 按 UTF-16LE 提取(Windows 程序常用)
strings -t x app.bin | grep -i version # 带十六进制偏移,便于回定位
file app.bin && strings -n 6 app.bin | head # 先判类型再抽内容
strings -f /opt/app/bin/* | grep -i version # 批量扫描并保留文件名前缀关键选项对照
| 选项 | 作用 | 使用要点 |
|---|---|---|
| -n N | 设置最小字符串长度 | 默认 4,噪音大时提到 8 以上 |
| -a | 扫描整个文件 | 默认只扫数据段,代码段里的串会漏 |
| -t x | 输出十六进制偏移 | 定位到文件具体位置,便于进一步分析 |
| -e l | 按 16 位小端编码提取 | Windows 产物里的宽字符串需要用这个 |
| -f | 输出文件名前缀 | 批量扫描多个文件时区分来源 |
| --version | 查看自身版本 | 不同 binutils 版本选项支持略有差异 |
用 strings 发现疑似凭据后,处置动作是把凭据视为已泄露并轮换,而不是「删掉文件重打包」了事;同时要回溯构建流程,找出它为什么会被打进制品,否则下次发布还会再来一遍。
对中文内容和 UTF-16 内容默认可能扫不出来:中文在 UTF-8 下是多字节编码,短串容易被 4 字符阈值过滤。可以降 -n 阈值或指定 -e 编码,再配合 grep 过滤。
字符串相同不代表来源唯一:同一个版本串可能来自被链接的第三方依赖。下结论前用 -t 偏移定位,并和 ldd、包管理器的文件清单交叉验证。