014、PEiD 的工作原理
返回:全书总览 · 上一章:异常处理 · 下一章:OllyDbg 原理
PEiD 在做什么
PEiD 是经典的 Windows PE 识别工具,主要通过签名和 PE 特征判断程序可能由什么编译器、链接器、安装器、壳或保护工具生成。
它解决的是“快速分类”,不是“证明样本一定属于某家工具”。
入口点签名
许多编译器启动代码和壳入口具有相对稳定的指令片段。签名通常描述:
1 | 固定字节 + 通配字节 + 匹配位置 |
例如相对地址、绝对地址和构建相关立即数需要用通配符忽略,保留较稳定的操作码与结构。
1 | 60 E8 ?? ?? ?? ?? 5D 81 ED ?? ?? ?? ?? |
这只是签名形式示意,不代表某个具体产品。
匹配流程
1 | 读取 DOS/NT 头 |
如果入口点位于节的尾部、文件损坏或 RVA 到文件偏移转换错误,识别结果会失真。
辅助证据
现代识别不应只看入口点,还可以综合:
- 节名称、数量、权限与原始大小。
- 导入函数数量与类别。
- TLS、资源、重定位、异常目录等数据。
- 入口点所在节和控制流形态。
- 字符串、版本信息和调试路径。
- 节区熵值与可压缩性。
熵值、节名和少量导入都只是启发式证据,不能单独证明程序被加壳或具有恶意行为。
误报与漏报
| 情况 | 影响 |
|---|---|
| 编译器版本变化 | 启动代码改变,旧签名失效 |
| 优化与链接选项不同 | 相同源码生成不同入口片段 |
| 多个产品共享代码 | 短签名可能碰撞 |
| 二次打包或保护 | 外层特征覆盖内层编译器特征 |
| 手工修改入口 | 入口签名不再可靠 |
| 签名过宽 | 误报增加 |
| 签名过窄 | 漏报增加 |
签名质量
一个较好的签名应当:
- 选择具有区分度的稳定代码区域。
- 对地址、时间、随机值使用通配符。
- 长度足以减少碰撞,但不过度绑定单一构建。
- 在多个版本和正常软件样本上交叉验证。
- 记录来源、架构、版本和置信度。
不要把识别结果直接写成“已确认”。报告中应使用“疑似”“签名匹配”“需动态验证”等分级措辞。
现代工具视角
PEiD 已具有明显年代感。学习它的价值在于理解签名匹配原理;实际分析可结合 Detect It Easy、Exeinfo PE、PE-bear、YARA 和反编译器插件,进行多证据判断。
一个安全的识别器设计
1 | 输入:待分析 PE 文件 |
解析器必须对所有偏移和长度做边界检查,避免把恶意构造文件当作可信结构读取。
学习检查清单
| 检查项 | 状态 |
|---|---|
| 能说明入口点签名和通配符的作用 | 待复盘 |
| 能完成 RVA 到文件偏移的基本推理 | 待复盘 |
| 能列出三种入口签名以外的辅助证据 | 待复盘 |
| 能解释短签名为什么容易误报 | 待复盘 |
| 能为识别结果标注证据与置信度 | 待复盘 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!





















