🎨 颜色标记说明

  • 粉色:特别重要、主线必掌握、优先复盘的内容。
  • 蓝色:核心概念、术语、分类名。
  • 橙色:需要关注的边界、易错点、注意事项。
  • 绿色:解释类内容、帮助理解知识点。

返回:全书总览 · 上一章:异常处理 · 下一章:OllyDbg 原理

PEiD 在做什么

PEiD 是经典的 Windows PE 识别工具,主要通过签名和 PE 特征判断程序可能由什么编译器、链接器、安装器、壳或保护工具生成。

它解决的是“快速分类”,不是“证明样本一定属于某家工具”。

入口点签名

许多编译器启动代码和壳入口具有相对稳定的指令片段。签名通常描述:

1
固定字节 + 通配字节 + 匹配位置

例如相对地址、绝对地址和构建相关立即数需要用通配符忽略,保留较稳定的操作码与结构。

1
60 E8 ?? ?? ?? ?? 5D 81 ED ?? ?? ?? ??

这只是签名形式示意,不代表某个具体产品。

匹配流程

1
2
3
4
5
6
读取 DOS/NT 头
-> 定位 AddressOfEntryPoint
-> 把入口 RVA 映射到文件偏移
-> 读取入口附近字节
-> 遍历签名库并处理通配符
-> 给出候选结果

如果入口点位于节的尾部、文件损坏或 RVA 到文件偏移转换错误,识别结果会失真。

辅助证据

现代识别不应只看入口点,还可以综合:

  • 节名称、数量、权限与原始大小。
  • 导入函数数量与类别。
  • TLS、资源、重定位、异常目录等数据。
  • 入口点所在节和控制流形态。
  • 字符串、版本信息和调试路径。
  • 节区熵值与可压缩性。

熵值、节名和少量导入都只是启发式证据,不能单独证明程序被加壳或具有恶意行为。

误报与漏报

情况 影响
编译器版本变化 启动代码改变,旧签名失效
优化与链接选项不同 相同源码生成不同入口片段
多个产品共享代码 短签名可能碰撞
二次打包或保护 外层特征覆盖内层编译器特征
手工修改入口 入口签名不再可靠
签名过宽 误报增加
签名过窄 漏报增加

签名质量

一个较好的签名应当:

  • 选择具有区分度的稳定代码区域。
  • 对地址、时间、随机值使用通配符。
  • 长度足以减少碰撞,但不过度绑定单一构建。
  • 在多个版本和正常软件样本上交叉验证。
  • 记录来源、架构、版本和置信度。

不要把识别结果直接写成“已确认”。报告中应使用“疑似”“签名匹配”“需动态验证”等分级措辞。

现代工具视角

PEiD 已具有明显年代感。学习它的价值在于理解签名匹配原理;实际分析可结合 Detect It Easy、Exeinfo PE、PE-bear、YARA 和反编译器插件,进行多证据判断。

一个安全的识别器设计

1
2
3
4
5
6
输入:待分析 PE 文件
校验:文件大小、魔数、结构边界
解析:架构、节表、入口点、目录项
匹配:入口点签名 + 结构特征
评分:每条证据独立加权
输出:候选产品、版本、证据和置信度

解析器必须对所有偏移和长度做边界检查,避免把恶意构造文件当作可信结构读取。

学习检查清单

检查项 状态
能说明入口点签名和通配符的作用 待复盘
能完成 RVA 到文件偏移的基本推理 待复盘
能列出三种入口签名以外的辅助证据 待复盘
能解释短签名为什么容易误报 待复盘
能为识别结果标注证据与置信度 待复盘