Files
exe-reverse/README.zh-CN.md
T
2026-10-24 01:50:24 +08:00

179 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# exe-reverse
<p align="center">
<a href="README.md">English</a> · <b>简体中文</b>
</p>
一个面向 **Windows x86/x64 本地软件逆向工程**的 Agent Skill:三分类、字节级补丁、特征码工作、调试、
注入、内存转储修复、授权机制归类、算法恢复、壳与代码虚拟化、托管程序集、内核驱动,以及**硬件观测层**
—— 指令追踪、硬件断点、虚拟机监控器辅助观测 —— 这些是纯软件工具链替代不了的路子。
它是一个 **skill**,不是教程:为"被 agent 边做边加载"而写,因此按渐进披露组织 —— 一份短小的、
面向决策的 `skills/exe-reverse/SKILL.md`,一批只在某一步需要时才加载的 references,以及可以直接运行
的参数化脚本。
## agent 应当如何使用它
`SKILL.md` 被写成**带门禁的流程**,而不是建议,因为观察到的失败模式不是无知 —— 是模型读完全文、
表示同意,然后仍然凭第一直觉推理。
其中四样东西是要**照做**的:
- **五条操作规则(O1–O5)。** 与当前计划冲突时以它们为准,直到证据推翻它们。
- **症状索引。** 每一行都是一个已经付过代价的失败。命中一行就是**停止信号**:先加载它指向的文件,
再执行下一条命令,而不是再试几次之后。
- **五道门禁(G1–G5),** 每道都是一个带通过判据的动作。"我理解这个思路"不等于通过门禁。它们存在的
意义是让分类、宿主事实和对照构建发生在**第一次打补丁之前**,而不是第三次失败之后。
- **两振出局与停止条件。** 同一形状失败两次意味着模型错了,而不是参数需要微调。
还有一样在最后的、需要**暂缓**的东西:**"完成"有定义(六条)。** 日志干净不在其中。不到六条就是
检查点,并且必须口头说明还差什么。
最便宜的第一条命令是 `python skills/exe-reverse/scripts/hwprobe.py`。它报告**这台机器**实际支持哪些
路子 —— 包括是否存在虚拟机监控器,这会改变调试器和硬件断点能做什么 —— 而不是理论上什么可以做。
## 它擅长什么
- **快速**判断一个需求是否可能仅靠改客户端达成,而不是把时间烧在服务端拥有的决策上。
- 在计划依赖宿主之前,先确定**你实际有什么宿主**:装了调试器、提权会话、测试签名、第二台机器,
或是一个会截获计划所依赖机制的虚拟机监控器。
- **不打坏文件地打补丁**:优先等长改写,重算校验和,从磁盘回读写入的字节,并把长度变化如实报告为
结构性修改。
- 让特征码**对自己诚实**:一个模式命中了多少处、这个计数在两次构建之间是否变化、它是定位器还是掷骰子。
- 区分**"字节在文件里"与"代码被执行"** —— 这是补丁被报告为生效而实际什么都没变的最常见方式。
- 在动手之前**归类授权决策**:客户端校验、客户端渲染的服务端数据、服务端权威 —— 三个问题三种答案,
只有其中两种是二进制改动够得着的。
- 处理**会反抗分析的目标**:识别究竟是哪个反分析机制被触发,以及当所有 hook 都被检测时哪一层仍能观测。
- 在调试器看不到时转向**硬件层**:不修改所监视字节的硬件断点、不装 hook 就记录控制流的指令追踪,
并诚实说明各自需要什么、仍然看不到什么。
- 让**长会话保持诚实**:活记录、分级结论、以实测标定上下界的等待,以及每个论断都有的对照构建。
- **发布学到的东西而不发布目标** —— 一个带上下文报告身份形状的扫描器,以及一份明确列出**不该**脱敏
内容的清单(脱敏它们会毁掉可复用的部分)。
## 结构
`SKILL.md`、`references/` 与 `scripts/` 都在 skill 目录 `skills/exe-reverse/` 内。仓库根部的一切是跨
skill 共享的维护工具,不属于已安装的 skill。
```
skills/exe-reverse/SKILL.md 带门禁的流程,不是背景阅读:
五个动作 -> 五条覆盖规则(O1-O5)
症状索引(命中一行即停止信号)
五道门禁(G1-G5,带通过判据的动作)
十三个分类问题
目标路由表
工具与上下文预算规则
工作流 -> "完成"的定义 -> 停止条件 -> 不可协商约束
skills/exe-reverse/references/ 按需加载,一文一题;"何时加载"的清单位于
skills/exe-reverse/references/routing.md
skills/exe-reverse/scripts/ 参数化、与路径无关;在裸 Python 3.10+ 上即可运行
skills/exe-reverse/evals/ 有 skill / 无 skill 的对照用例,以及运行方法
skills/exe-reverse/evidence/ 证据摘要的机器可读配套文件
docs/tool-verification/ 测量通行的证据记录(不随 skill 分发)
tests/ 可执行的回归套件
```
reference 库是被索引的,不是靠记忆的:`skills/exe-reverse/references/routing.md` 载有每个 reference
文件及其加载时机、每个脚本及其作用,是选定路线之后该读的那份文件。
## 安装
本仓库是一个 **skills 仓库**:skill 位于 `skills/exe-reverse/`,正是 `skills` CLI 解析的布局,
按名字安装而不是复制目录:
```
npx skills add <owner>/exe-reverse # 安装仓库里的全部 skill
npx skills add <owner>/exe-reverse --list # 只列出,不安装
npx skills add <owner>/exe-reverse --skill exe-reverse -y
npx skills use <owner>/exe-reverse@exe-reverse # 用一次,不安装
```
CLI 默认把 skill 以符号链接的方式放进你的 agent 技能目录(`--copy` 改为独立副本),`-g` 面向所有项目
安装,`-a` 指定 agent。本仓库目前只有一个 skill,`--skill exe-reverse` 暂时是多余的;写出来是因为
一旦出现第二个 skill,它就是选出单个 skill 的方式。
安装后,agent 在任务与其描述匹配时加载 `SKILL.md`,并且只在需要时拉入 `references/*`。没有全局状态,
没有与本机绑定的路径,没有构建步骤。
## 运行要求
没有强制项;每个脚本自己检查需要什么,`skills/exe-reverse/scripts/hwprobe.py` 会报告这台机器上有哪些、
因而哪些路线可用 —— 包括在虚拟化宿主上**不**可用的那些。
如果工具链不在 `PATH` 上(项目内的 tools 目录、带版本的 SDK 目录),把 `EXEREV_TOOLS` 指向一个或多个
目录,探测脚本就能找到它们:
```
set EXEREV_TOOLS=<dir>;<dir> # Windows
export EXEREV_TOOLS=<dir>:<dir> # POSIX
```
| 工具 | 用途 |
|---|---|
| Python 3.10+ | 全部脚本;PE 读取器、补丁器与探测脚本无第三方依赖 |
| 反汇编器/反编译器(IDA、Ghidra、Binary Ninja、Cutter) | 读代码;其中若干只有 GUI,而只有 GUI 的工具是"向人要"而不是"用更弱的方法顶替"的理由 |
| 调试器(x64dbg、WinDbg) | 定位运行时行为、观察取值 |
| `dumpbin` / `link`(MSVC 工具链) | 有 SDK 时的头与导入表检查 |
| Frida | 可以接受 hook 时的运行时插桩 |
| Procmon / ETW 工具(`wpr`、`logman`) | 文件、注册表与系统事件证据 |
| .NET 工具链 | 托管程序集是另一种产物,需要另一套工具链 |
| 隔离的虚拟机 | 分析宿主本身是实验的一部分 |
| 第二台机器 | 当前 Windows 主机上的内核调试 |
| 报告该特性的 CPU,外加一条采集通路 | 硬件观测路线;探测脚本会报告这台机器有什么 |
这些都不需要在 `PATH` 上:脚本接受显式路径,可运行的归档文件或脚本也算已安装。
## 先读这个
**仅供学习、研究与授权的安全测试使用。** 它不附带漏洞利用载荷、不附带目标数据、不附带第三方二进制
—— 它是一套方法、一批脚本和一份证据记录。
然后读 `skills/exe-reverse/references/pitfalls.md`。这是这里最有价值的文件 —— 每一条都是一个"看起来
一切正常"却被产出的失败。动手之前先读它。
## 覆盖范围
面向你自己的软件、你被授权分析的样本,以及竞赛沙箱。仓库内不含第三方二进制,也不含目标专属数据。
它覆盖什么、刻意不覆盖什么,写在 skill 自身(`skills/exe-reverse/references/coverage-and-limits.md`)。
简版:Windows PE 的 x86 与 x64,在真正做过的层上做得深 —— 三分类、补丁、特征码、授权归类、壳、
托管代码,以及硬件观测的路线图。服务端权威的破解、通用自动化去虚拟化器、把"攻破某个具名商业保护产品"
作为产品级宣称,以及对本仓库未测量过的 Windows 版本做任何保证,都**不在**覆盖内,而 skill 被写成
如实说明并停下,而不是把最近的一份文档流程套到一个它并非为此而写的目标上。
## 仓库维护
六个工具位于仓库根部,不属于已安装的 skill:
```
check_repo.py 发现每个 skill、校验 frontmatter、脚本可运行、文档路径可解析、
README 路径显式且存在,并且在被跟踪的表面上没有目标身份
(规则委派给 scan_leaks.py)
check_refs.py 每一处"指向另一文档某章节"的交叉引用都能在该文档中命中真实标题
check_routing.py 按需清单位与入口点一致:症状镜像与 SKILL.md 相符,
且每个 reference 文件与脚本都在 routing.md 中被点名
check_commands.py 文档让你运行的每条命令都对照脚本自身的 argparse 表校验 ——
文档里写了不存在的开关,是锚点检查看不到的漂移
check_budget.py 防止常驻加载的部分膨胀:按行与 token 测量 SKILL.md、索引行长度、
过长且无可导航头部的文件、含糊表述的规则
build_scripts.py 审计与本机绑定的残留(绝对路径、凭据)
```
一致性有天然的反向压力 —— 坏路径会大声失败,然后有人修。膨胀没有,这就是预算门存在的原因。
`tests/benchmark.md` 保存回归矩阵:维度 → 公开目标 → 该行用到的脚本 → 实测结果 → 强度标签。
`docs/tool-verification/` 是测量通行的证据记录:每个脚本实际做了什么、哪个独立方法确认了它、以及目标
无法演练哪些场景。它存在,是为了让覆盖声明可以被"对照运行结果"检查,而不是被直接信任。
## 免责声明
**仅供学习、研究与授权的安全测试使用。** 本仓库中的每个脚本、reference 与记录结果,都是为了说明
Windows 应用分析**如何**工作,让从业者能够推理自己手上的工具。这里没有任何服务、产品,也不构成对
任何特定用途的认可。
材料按"原样"提供,不附带任何形式的担保。结果是在一台机器、某一时刻测得的;这里不承诺某条路线在你
的目标、你的宿主或你的工具链上同样可行。信任之前先验证,并且对副本动手。
工具、库、文件格式与加固产品的名称出现,只是为了让材料可复用;它们属于各自的拥有者,本项目与它们
没有关联。