4、静态分析基础:使用Detect It Easy (DIE) 查壳、使用PEiD识别编译语言、文件指纹与哈希分析
好,咱们进入静态分析的第一课。说实话,很多新手一上来就开调试器,结果被各种反调试搞得晕头转向。我个人的习惯是——先别急,先拿几个工具给样本「拍个X光片」。
静态分析,说白了就是不动手运行它,光靠看文件本身的信息来摸清它的底细。你想想看,一个恶意软件连壳都没脱,你直接上IDA,看到的全是乱码,那不是白费功夫吗?
4.1 查壳工具:Detect It Easy (DIE)
DIE 是我现在最常用的查壳工具。为什么?因为它轻量、更新快,而且社区很活跃。很多新出的壳,它很快就能识别。
它的核心功能就三个:
- 识别编译器/加壳器:比如 UPX、ASPack、Themida、VMP 等等
- 检测入口点:告诉你程序的 OEP(原始入口点)在哪
- 查看节表:.text、.rdata、.rsrc 这些节区是否正常
我遇到过最典型的案例:一个样本用 DIE 查出来显示「UPX 0.89.6」,但用 UPX 自带的 -d 参数却脱不了。嗯,这里要注意——它可能被修改过魔数,或者加了反脱壳的垃圾指令。这时候 DIE 只能告诉你「有壳」,但具体怎么脱,还得靠手动分析。
DIE 使用小技巧:
- 把样本拖进 DIE 窗口,看「Detect」标签页
- 如果显示「Nothing found」,别急着放弃——点「Scan」按钮,选深度扫描
- 看「Entropy」熵值:正常程序一般在 4.5-6.5 之间,超过 7.0 基本就是加密或压缩了
举个例子,你拿到一个样本,DIE 显示:
File: sample.exe
Detect: UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
Entropy: 7.88
EP Section: UPX0
看到没?熵值 7.88,明显是压缩过的。EP 节区叫 UPX0,这基本就是 UPX 壳没跑了。
4.2 识别编译语言:PEiD
PEiD 是个老工具了,但说实话,在识别编译语言这块,它依然很能打。尤其是对付那些老样本——比如 Delphi、VB、VC++ 6.0 写的程序,PEiD 一查一个准。
为什么要知道编译语言?因为不同语言生成的代码结构差异很大:
| 编译语言 | 特征 | 常见恶意软件 |
|---|---|---|
| VC++ 6.0 | 入口点通常是 0x401000 附近,有 msvcrt.dll 依赖 | 很多 RAT、后门 |
| Delphi | 有大量的 VCL 库函数,入口点特征明显 | 早期蠕虫、盗号木马 |
| VB 6.0 | 依赖 MSVBVM60.dll,代码结构松散 | 一些简单的下载器 |
| .NET | 有元数据表,IL 代码 | 勒索软件、窃密木马 |
我记得有一次分析一个样本,PEiD 显示「Microsoft Visual C++ 6.0」,但我在 IDA 里看到的却是大量的 Delphi 特征字符串。后来才发现——这货是用 VC++ 写的壳,里面包裹了一个 Delphi 写的 payload。所以,PEiD 的结果只能作为参考,不能全信。
我的经验:PEiD 的「Deep Scan」模式有时候会误报。如果你拿不准,可以配合 DIE 交叉验证。两个工具都说同一个结果,那基本就稳了。
4.3 文件指纹与哈希分析
哈希分析,说白了就是给文件算个「身份证号」。常用的哈希算法有 MD5、SHA-1、SHA-256。你想想看,一个恶意软件可能有几十万个变种,你怎么区分它们?靠文件名?别逗了,文件名可以随便改。
哈希值才是唯一标识。我一般这么用:
- MD5:快速比对,但已经不安全了(有碰撞攻击)
- SHA-1:比 MD5 强一点,但也被攻破了
- SHA-256:目前最常用,基本没有碰撞风险
实际操作很简单,用命令行就能算:
certutil -hashfile sample.exe MD5
certutil -hashfile sample.exe SHA1
certutil -hashfile sample.exe SHA256
或者用工具,比如 HashMyFiles、HashTab 都行。我习惯把哈希值直接贴到 VirusTotal 上查——如果 VT 上已经有记录,那说明这个样本不是全新的,可能已经被分析过了。
注意:哈希值只能用来「识别」,不能用来「判断」。什么意思呢?两个不同的文件可能有相同的哈希值(虽然概率极低),但同一个文件改一个字节,哈希值就完全变了。所以哈希分析只是第一步,千万别拿它当最终结论。
我曾经遇到过一个案例:一个样本的 MD5 在 VT 上显示「Clean」,但我用 DIE 查出来有壳,用 PEiD 识别出是 Delphi 写的。后来手动分析才发现——这是个 0-day 样本,VT 上还没收录。所以,哈希查询只是辅助,不能替代人工分析。
4.4 实战:一个完整的静态分析流程
好,咱们走一遍完整的流程。假设你拿到一个叫 update.exe 的样本:
- 第一步:算哈希
把哈希贴到 VT 上查——哦,已经有 5 个引擎报毒了。SHA256: 3A7C... (省略) - 第二步:用 DIE 查壳
拖进 DIE,显示「UPX 3.96」,熵值 7.92。嗯,有壳,先脱掉。
- 第三步:用 PEiD 识别语言
脱壳后,PEiD 显示「Microsoft Visual C++ 8.0」。好,知道是 VC++ 2005 写的了。
- 第四步:看节表和导入表
用 DIE 的「Sections」标签看节表——.text、.rdata、.data 都正常。导入表里有
CreateProcess、WriteProcessMemory、VirtualAllocEx——典型的进程注入特征。
你看,光靠静态分析,还没运行程序,我就已经知道:这是一个 UPX 加壳的 VC++ 程序,疑似进程注入型木马。接下来再上 IDA 反汇编,心里就有底了。
总结一下静态分析的核心思路:
- 先查壳,再脱壳
- 识别编译语言,了解代码风格
- 算哈希,查 VT,看有没有前人分析过
- 看导入表、字符串,猜测功能
这一套下来,80% 的样本你都能摸个大概。剩下的 20%,才需要上动态分析或者更深入的反汇编。
嗯,今天就先到这儿。下一章咱们聊聊「如何手动脱 UPX 壳」,这可是个硬功夫,但学会了之后,很多加壳样本在你面前就跟没穿衣服一样。