PE 静态研判技能 (pe-static-analysis)
何时使用
当用户丢给你一个 .exe / PE 二进制并要求"分析这个程序""看看它是什么""解析这个工具""判断有没有问题""是不是木马/加壳"时,直接调用本技能,不要先去装 pefile 或用外部工具。
触发词示例: 解析这个 exe、分析这个程序、这个软件安全吗、是不是加壳、静态分析、研判这个样本。
安全铁律(最高优先级)
- 绝不执行未知样本。 本技能只做静态读取字节,绝不用
subprocess启动样本、不在真机/办公机运行。 - 若需要运行观察行为,必须建议用户在断网隔离虚拟机中操作,并提供 Process Monitor + Wireshark 监测清单(见文末)。这是建议,不是由本技能执行。
- 数据源只来自用户已提供的文件,不擅自联网下载同类样本。
环境与依赖
- 使用托管 Python(优先):
C:/Users/huawei/.workbuddy/binaries/python/versions/3.13.12/python.exe - 零第三方依赖:脚本用原生
struct/hashlib/re,不装 pefile。 - ⚠️ Git Bash 路径坑:调用脚本时路径用
C:/Users/...(正斜杠、带盘符),不要用/c/Users/...(会被错误拼成d:\c\...)。
标准工作流
- 先确认文件存在并收集基础信息:哈希(MD5/SHA1/SHA256)、体积。体积异常大(几十 MB 的"小工具")往往说明运行时被打包进 exe。
- 跑本技能脚本
pe_static_analysis.py,传入样本路径(可选--log落盘):
PY="C:/Users/huawei/.workbuddy/binaries/python/versions/3.13.12/python.exe" SCRIPT="C:/Users/huawei/.workbuddy/skills/pe-static-analysis/pe_static_analysis.py" SAMPLE="C:/Users/huawei/Desktop/xxx/目标.exe" "$PY" "$SCRIPT" "$SAMPLE" --log "D:/workbuddy工作空间/<日期>/_pe_out.txt" - 读脚本输出,按下面"结论解读"翻译成人话,必要时结合具体案件场景补充。
- 交付结构化研判报告(参考模板),并给出后续方向建议(情报比对 / 沙箱 / 逆向)。
结论解读(怎么把输出讲给办案人听)
脚本已自动给出研判,但你要能解释每一项的含义:
| 信号 | 含义 |
|---|---|
| 某节区熵 ≈ 7.9–8.0 | 该节区被压缩/加密,真实程序藏在里面,静态看不到 |
| 导入表为空 / 全是乱码 DLL | 导入被掏空,API 运行时经 GetProcAddress 动态解析——刻意规避静态分析 |
| 全文件搜不到目标域名/接口字符串 | 连"要去连谁"都被藏起来,典型加壳/保护壳指纹 |
asInvoker |
不主动请求提权(但加壳样本可后期提权,别据此判安全) |
低熵可读区出现 7z/rar/CreateProcess |
真实具备解包释放、拉起子进程能力 |
| 框架特征"仅高熵区命中" | 大概率是随机字节巧合,不可采信;只有"低熵可读区确认"的才算数 |
核心判断句式:"这是一款刻意隐藏自身逻辑、闭源加壳的灰色工具。静态已到天花板——它的真实网络行为、读了什么数据、是否回传,我们看不到。这本身就是一个需要解释的行为特征,既不证明恶意,也排除了纯良开源工具的可能。"
踩坑附录(本技能已规避,但解释为什么这么做)
- Git Bash 无
file命令 → 纯 Python 读字节,不依赖外部命令。 - pefile 未装 → 用原生
struct解析 PE 头。 - PE32 vs PE32+ 可选头偏移不同 → 实测 Subsystem / DLL 特性字段在两者中偏移恰同为
opt+68/opt+70(差异在 ImageBase 之前,不影响此二字段),无需分支。 - 高熵
.rsrc当资源目录树遍历 → 随机字节被当目录计数 → 死循环。改为在字节流中搜索VS_VERSION_INFO/requestedExecutionLevel/<?xml关键字,绝不递归遍历资源树。 - 把所有字符串拼成大串再跑正则 → O(n²) 灾难性回溯,进程被杀。每条正则直接在原始字节
finditer(O(n))。 - 导入表读出乱码 DLL 名 → 高熵区随机字节所致。解析出的 DLL 名若含不可打印字符或过长,判为 garbage,只统计真实有效 DLL(以
.dll结尾且全可打印 ASCII)。 print(flush=...)在 stdout 重定向时崩溃 → 用行收集列表统一输出,末尾一次性写日志。- 正则里出现中文字面量 →
SyntaxError(字节正则不能含中文)。一律纯 ASCII 字节正则,中文结论放到 Python 代码注释和最终报告里。
研判报告模板(交付用)
# 《XXX.exe》静态研判报告
## 一、样本画像
- 路径 / 大小 / 编译时间
- 哈希: MD5 / SHA1 / SHA256(可直接提交情报库)
## 二、结构特征
- 架构(x64/x86)、子系统(GUI/CUI)、UAC 级别
- 节区与熵(高熵节区标注)
- 导入表状态(空/乱码 → 动态解析)
## 三、行为线索
- 框架/运行时(仅采信低熵可读区确认项)
- 解包/进程创建/加解密能力
## 四、综合研判
- 是否加壳/藏匿,静态可见度结论
## 五、后续建议
1. 威胁情报比对(SHA256 去 VT/行业库)
2. 断网隔离虚拟机动态沙箱(Procmon + Wireshark 监测清单)
3. 逆向解密例程(dump 内部真实程序再静态分析)
动态沙箱监测清单(当用户要求"跑一下看行为"时提供)
- Process Monitor: 关注
CreateFile写盘路径(释放到%TEMP%/当前目录?)、CreateProcess拉起什么子进程、LoadLibrary加载了哪些 dll。 - Wireshark / 火绒剑: 抓出站连接(DNS 解析了哪些域名、连了哪些 IP、是否 HTTPS 外发数据)。
- 断网环境: 先用防火墙/无网卡 VM 跑,观察它"想连但连不上"的域名(从失败连接里能拿到真实 C2/接口线索)。
- 全程录屏 + 导出日志,作为取证材料。
局限与部署
局限说明
静态分析对加壳样本只能给出"行为特征画像",无法确认其实际网络/数据行为。是否构成犯罪、样本定性,需结合动态取证、来源追溯、被害人证言等综合认定。本技能不替代司法鉴定。
跨机器部署(开箱即用)
本技能设计为零依赖、可移植,可装到任意机器使用。
前置依赖
- 仅需 Python 3.6+(实测 3.13)。不需要 pip install 任何包(脚本只用 sys/struct/math/re/hashlib/argparse/datetime/traceback/collections 标准库)。
- 不需要系统 file 命令,不需要联网,不需要管理员权限。
- ⚠️ skillhub CLI 不是使用依赖,它只在把本技能上架到 SkillHub 时才用;装、用本技能都不碰它。
安装路径(二选一)
| 场景 | 做法 |
|---|---|
| 目标机是 WorkBuddy | 把整个 pe-static-analysis/ 文件夹(含 SKILL.md + pe_static_analysis.py)拷到目标机的 ~/.workbuddy/skills/pe-static-analysis/,WorkBuddy 自动扫描加载,无需安装命令。 |
| 目标机是 纯 Python 环境(非 WorkBuddy,如取证机) | 只拷 pe_static_analysis.py 单文件即可,python pe_static_analysis.py <样本路径> 直接跑;SKILL.md 元数据那层用不上而已。 |
跨平台
- 脚本只读 PE 字节流做解析,无 Windows 专属 API 调用(无 ctypes/win32),因此 Windows / Linux / macOS 都能跑,用来分析 Windows 的 .exe/.dll/.sys 也没问题。
路径替换注意
- 本 SKILL.md 及上方「标准工作流」示例中的 C:/Users/huawei/... 是作者机路径,部署到他机时务必替换为目标机实际路径。
- pe_static_analysis.py 本身用 argparse 接收路径参数,不硬编码任何路径,拷到哪都能用。
自测命令(部署后 30 秒验证)
# 工作流机器(有 WorkBuddy):用本机 Python 跑脚本指向任意待查样本
python pe_static_analysis.py "D:/样本/待测.exe" --log out.txt
# 纯 Python 机器同理,只要 python 指向 3.6+
python3 pe_static_analysis.py "/path/to/待测.exe"
能正常吐出哈希、分节熵、导入表状态,即说明装对了。
SkillHub 一键安装(上架后)
- 发布到 SkillHub 后,他人在 WorkBuddy 内一键安装即可,比手动拷文件夹更省事(发布流程见 pe-static-analysis_SkillHub发布流程文档.md)。