Strings 学习笔记(12.1):从二进制里"扒"出明文信息的瑞士军刀
- [Strings 学习笔记(12.1):从二进制里"扒"出明文信息的瑞士军刀](#Strings 学习笔记(12.1):从二进制里“扒”出明文信息的瑞士军刀)
-
- [一、Strings 是什么?一句话讲清楚](#一、Strings 是什么?一句话讲清楚)
- 二、工作原理:简单粗暴,但非常实用
- [三、基本用法:先跑通 3 个核心命令](#三、基本用法:先跑通 3 个核心命令)
-
- [1. 扫描单个文件](#1. 扫描单个文件)
- [2. 指定最小字符串长度(强烈推荐)](#2. 指定最小字符串长度(强烈推荐))
- [3. 递归扫描整个目录](#3. 递归扫描整个目录)
- 四、常用参数整理(重点只记这几个)
-
- [1. `-n <length>`:最小字符串长度](#1.
-n <length>:最小字符串长度) - [2. `-s`:递归子目录](#2.
-s:递归子目录) - [3. ASCII vs Unicode(按版本区别)](#3. ASCII vs Unicode(按版本区别))
- [4. `-o`:打印偏移量(高阶一点)](#4.
-o:打印偏移量(高阶一点))
- [1. `-n <length>`:最小字符串长度](#1.
- [五、实战场景一:恶意样本 / 可疑二进制的初步"体检"](#五、实战场景一:恶意样本 / 可疑二进制的初步“体检”)
-
- [1. 看网络行为线索](#1. 看网络行为线索)
- [2. 看系统命令与脚本调用](#2. 看系统命令与脚本调用)
- [3. 看"功能菜单"](#3. 看“功能菜单”)
- 六、实战场景二:运维/开发在"黑盒程序"里搜信息
-
- [1. 查找隐藏的错误信息 / 日志关键字](#1. 查找隐藏的错误信息 / 日志关键字)
- [2. 查找配置键名、注册表路径、文件路径](#2. 查找配置键名、注册表路径、文件路径)
- 七、实战场景三:日志/固件/镜像里的"有趣明文"
- 八、使用建议与常见坑
-
- [1. 输出太多,看不过来?](#1. 输出太多,看不过来?)
- [2. 看到很多莫名其妙的短词、符号?](#2. 看到很多莫名其妙的短词、符号?)
- [3. 看不到想要的内容?](#3. 看不到想要的内容?)
- 九、模板:安全/运维日常三条常备命令
- 结语:下一篇写谁?
Strings 学习笔记(12.1):从二进制里"扒"出明文信息的瑞士军刀
适用人群:运维、安全、逆向入门、开发同学,只要你曾经想问一句------"这破 exe/DLL 里面到底藏了点啥?"
在 Sysinternals 文件工具家族里,Strings 是最容易上手、但非常耐用的一把小刀:
- 不用会逆向,不会汇编也没关系
- 它做的事极其朴素:把文件里的"可见字符串"全部抠出来
- 但你能从里边看到:域名、URL、API 名、错误提示、配置片段、命令行、甚至后门字符串
这篇作为第 12 章的第一篇细分笔记,专门谈三个问题:
- Strings 到底在干嘛,原理是什么?
- 怎么正确用它,避免"全是噪音看不懂"的挫败感?
- 在运维、安全、调试里,它分别能干哪些"正事"?
一、Strings 是什么?一句话讲清楚
官方概念翻译成人话:
Strings.exe 会扫描文件的二进制内容,把连续的可打印字符(ASCII / Unicode)挑出来打印给你看。
也就是说:
- 它不执行目标程序
- 不需要符号、PDB
- 不用安装,只是纯命令行扫描器
那有什么用?
- 你拿到一个可疑的 exe/DLL/sys 驱动
- 用 Strings 一扫:
- 看到一堆
http://xx.com/api、C2Server、cmd.exe /c等字符串 - 安心许多:方向至少有了
- 看到一堆
可以把它想象成:
"不会拆发动机没关系,至少先把车上的所有标签、说明书、贴纸全摘下来,看看厂家写了些什么。"
二、工作原理:简单粗暴,但非常实用
默认行为大致是这样:
- 以字节流读取文件
- 遇到连续的可打印字符(ASCII 或 Unicode)
- 当长度 ≥ 最小阈值(默认 3 或 4 个字符,不同版本略有差异)
- 就认为这是"一个字符串",输出一行
几个要点:
- ASCII vs Unicode
- ASCII:1 字节一个字符
- Unicode(通常是 UTF-16 LE):2 字节一个字符,中间夹 0x00 的那种
- Strings 会分别尝试这两个视角,因此你能看到不少「看起来没空格的字符」,其实是 Unicode
优点:
- 速度快、无侵入
- 不依赖目标程序结构(不用解析 PE、ELF 等)
- 对二进制日志、固件镜像、未知格式文件一样适用
缺点:
- 只能看到"没被压缩/加密"的明文
- 输出很多噪音(尤其是短字符串)
- 需要人为二次筛选(配合
findstr/ PowerShell)
三、基本用法:先跑通 3 个核心命令
这里默认 strings.exe 已经在 PATH 里(不会的话可以参考我写的 12.0 总览篇)。
1. 扫描单个文件
bash
strings.exe C:\Tools\sample.exe
输出会非常多,建议配合 more 或 findstr:
bash
strings.exe C:\Tools\sample.exe | more
# 查找里面的 URL / 域名线索
strings.exe C:\Tools\sample.exe | findstr /i "http:// https:// .com .cn api"
2. 指定最小字符串长度(强烈推荐)
bash
# 只要长度 >= 6 的字符串(减少噪音)
strings.exe -n 6 C:\Tools\sample.exe
经验值:
- 逆向/安全排查时,6~8 比较舒服
- 太短:输出全是 ".rdata/CRT/xx" 等库函数符号
- 太长:可能漏掉有意义的短 key / 命令
3. 递归扫描整个目录
bash
# 递归扫描目录中所有文件
strings.exe -s C:\Apps > C:\temp\apps_strings.txt
# 只看其中含有 "password" 的行
strings.exe -s C:\Apps | findstr /i "password pwd pass="
⚠️ 提醒:对大目录递归扫描会产生巨大输出,务必重定向到文件,然后用编辑器/grep 工具查看。
四、常用参数整理(重点只记这几个)
不同版本参数略有增减,这里挑 Sysinternals 常见用法中最实战的几个。
1. -n <length>:最小字符串长度
bash
strings.exe -n 8 malware.exe
- 过滤掉短噪音(函数名碎片、随机标识符)
- 8~10 字符以上通常更"语义化"(URL、函数描述、配置键名等)
2. -s:递归子目录
bash
# 递归扫描某软件安装目录
strings.exe -s "C:\Program Files\AppX" > appx_strings.txt
适合:
- 快速粗扫一个软件目录
- 找某个关键字对应的文件位置(比如 log path、特定错误码)
3. ASCII vs Unicode(按版本区别)
有的版本参数是:
-a:只扫描 ASCII-u:只扫描 Unicode 字符串
如果你发现输出有很多"夹杂 0 字节"的乱码,可以尝试只看 ASCII:
bash
strings.exe -a -n 6 sample.exe
反之,如果软件主要使用 Unicode 文本,也可以只看 Unicode。
4. -o:打印偏移量(高阶一点)
对于做取证/逆向的同学,偏移量很重要:
bash
strings.exe -n 6 -o malware.exe
输出中会带每个字符串在文件中的偏移,可以:
- 回到十六进制编辑器里精准定位
- 对照 IDA / x64dbg 里的地址进行交叉分析
五、实战场景一:恶意样本 / 可疑二进制的初步"体检"
这是 Strings 最经典的场景。
1. 看网络行为线索
bash
strings.exe -n 6 malware.exe | findstr /i "http:// https:// ftp:// .onion .top"
可以看到:
- C2 服务器域名
- 调用的 REST API 路径
- 上传/下载的资源标识
2. 看系统命令与脚本调用
bash
strings.exe -n 5 malware.exe | findstr /i "cmd.exe powershell.exe wscript.exe cscript.exe rundll32"
如果看到:
text
cmd.exe /c whoami
powershell -enc ...
reg add HKLM\Software\...
schtasks /create ...
基本就能猜到它在干的事了。
3. 看"功能菜单"
很多二进制会把功能描述、菜单项写成明文字符串:
"Start keylogging""CaptureScreenshot""UploadFile"
这些字符串通常非常有助于你构建一个功能概要,即便你不会完整逆向。
六、实战场景二:运维/开发在"黑盒程序"里搜信息
非安全场景下,Strings 也很香。
1. 查找隐藏的错误信息 / 日志关键字
有时候你遇到一个"只崩溃不说话"的程序,界面提示很少:
bash
strings.exe app.exe | findstr /i "Exception Error Failed Timeout"
你可能会看到这些:
text
Database connection failed
Timeout when contacting service
Invalid license key
这样你就可以:
- 在日志中按这些具体关键字搜索
- 对应到代码中类似的错误处理路径(如果有源代码)
2. 查找配置键名、注册表路径、文件路径
bash
strings.exe app.exe | findstr /i "HKEY_ C:\ \\config .ini .json .xml"
你可能会找到:
HKEY_LOCAL_MACHINE\Software\AppX\ConfigC:\ProgramData\AppX\settings.json
之后就可以:
- 直接去这些位置看真实配置
- 在部署时提前写好脚本/模板进行管理
七、实战场景三:日志/固件/镜像里的"有趣明文"
Strings 不只对 exe/DLL 有用,它对任何二进制文件都可以上。
常见例子:
-
固件(firmware)镜像
bashstrings.exe router.bin -n 6 | findstr /i "admin password telnet ssh"可以看到:
- 默认账户名/密码
- Web 面板路径
- 调试接口等
-
内存/转储文件
对 crash dump、内存镜像:
bashstrings.exe memory.dmp -n 8 | findstr /i "@gmail.com password token"用于安全分析时查敏感信息泄露、明文凭据(注意合规和隐私)。
八、使用建议与常见坑
1. 输出太多,看不过来?
几条组合技巧:
bash
# 只看 URL、域名、邮件地址相关
strings.exe -n 6 target.bin | findstr /i "http:// https:// .com .net .cn @"
# 导出到文件,用编辑器的搜索/分组功能分析
strings.exe -n 6 -s C:\AppDir > C:\temp\appdir_strings.txt
把 Strings 当作"索引器",而不是期望在命令行里一次看完全部。
2. 看到很多莫名其妙的短词、符号?
- 调高
-n,比如从 3 → 6、8 - 尝试只扫描 ASCII 或只扫描 Unicode(根据具体版本支持)
3. 看不到想要的内容?
可能是:
- 文件被压缩/加壳/加密(常见于加壳的 exe / 混淆的样本)
- 内容并不是明文存在,需要配合专用工具/逆向
Strings 给你的只是"能看到的那一层",没看到并不等于"没有"。
九、模板:安全/运维日常三条常备命令
可以直接抄进你的工具箱:
bash
:: 1)恶意样本/可疑 exe 初筛
strings.exe -n 6 malware.exe | findstr /i "http:// https:// cmd.exe powershell.exe reg.exe schtasks"
:: 2)软件目录快速搜索敏感配置路径
strings.exe -n 6 -s "C:\Program Files\AppX" | findstr /i "HKEY_ .ini .json .xml C:\ProgramData"
:: 3)扫描日志/转储里潜在敏感明文(注意合规)
strings.exe -n 8 dump.bin | findstr /i "@gmail.com token password key="
结语:下一篇写谁?
这一篇我们把 Strings 单独拎出来从原理到用法、再到实战场景过了一遍。
在 Sysinternals 文件工具家族里,它负责**"从内容层面挖明文"**。
接下来会继续写 12.2:Streams 学习笔记(12.2):看见 NTFS 隐藏的备用数据流(ADS),专门讲"看不见的那一层"------文件表面干干净净,数据都藏在备用数据流里,这一块是安全、取证、清理顽固垃圾时非常常用的一招。