Strings 学习笔记(12.1):从二进制里“扒”出明文信息的瑞士军刀

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. 看网络行为线索](#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 章的第一篇细分笔记,专门谈三个问题:

  1. Strings 到底在干嘛,原理是什么?
  2. 怎么正确用它,避免"全是噪音看不懂"的挫败感?
  3. 在运维、安全、调试里,它分别能干哪些"正事"?

一、Strings 是什么?一句话讲清楚

官方概念翻译成人话:

Strings.exe 会扫描文件的二进制内容,把连续的可打印字符(ASCII / Unicode)挑出来打印给你看。

也就是说:

  • 不执行目标程序
  • 不需要符号、PDB
  • 不用安装,只是纯命令行扫描器

那有什么用?

  • 你拿到一个可疑的 exe/DLL/sys 驱动
  • 用 Strings 一扫:
    • 看到一堆 http://xx.com/apiC2Servercmd.exe /c 等字符串
    • 安心许多:方向至少有了

可以把它想象成:

"不会拆发动机没关系,至少先把车上的所有标签、说明书、贴纸全摘下来,看看厂家写了些什么。"


二、工作原理:简单粗暴,但非常实用

默认行为大致是这样:

  1. 以字节流读取文件
  2. 遇到连续的可打印字符(ASCII 或 Unicode)
  3. 当长度 ≥ 最小阈值(默认 3 或 4 个字符,不同版本略有差异)
  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

输出会非常多,建议配合 morefindstr

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\Config
  • C:\ProgramData\AppX\settings.json

之后就可以:

  • 直接去这些位置看真实配置
  • 在部署时提前写好脚本/模板进行管理

七、实战场景三:日志/固件/镜像里的"有趣明文"

Strings 不只对 exe/DLL 有用,它对任何二进制文件都可以上。

常见例子:

  1. 固件(firmware)镜像

    bash 复制代码
    strings.exe router.bin -n 6 | findstr /i "admin password telnet ssh"

    可以看到:

    • 默认账户名/密码
    • Web 面板路径
    • 调试接口等
  2. 内存/转储文件

    对 crash dump、内存镜像:

    bash 复制代码
    strings.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),专门讲"看不见的那一层"------文件表面干干净净,数据都藏在备用数据流里,这一块是安全、取证、清理顽固垃圾时非常常用的一招。

相关推荐
张人玉2 小时前
c#常用的类
服务器·数据库·c#
Suchadar2 小时前
NAT网络地址转换
linux·服务器·网络
Hunter1162 小时前
Delphi通过ITHTTP传输有汉字乱码问题
笔记
有为少年2 小时前
带噪学习 | Ambient Diffusion (NeurIPS 2023)下篇
人工智能·深度学习·神经网络·学习·机器学习·计算机视觉
翼龙云_cloud2 小时前
阿里云云渠道商:如何选择阿里云 GPU 配置方案?
服务器·人工智能·阿里云·云计算
MarkHD3 小时前
智能体在车联网中的应用:第11天 CARLA自动驾驶仿真入门:从零安装到理解客户端-服务器架构
服务器·架构·自动驾驶
代码游侠3 小时前
复习——线程(pthread)
linux·运维·开发语言·网络·学习·算法
做cv的小昊3 小时前
【TJU】信息检索与分析课程笔记和练习(3)学术评价
大数据·人工智能·经验分享·笔记·学习·全文检索
兜兜转转了多少年3 小时前
《Prompt Engineering白皮书》笔记08 我用 Gemini 10 分钟写完脚本,100 个文件自动改名
笔记·prompt