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

11 KiB
Raw Blame History

exe-reverse

English · 简体中文

一个面向 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 应用分析如何工作,让从业者能够推理自己手上的工具。这里没有任何服务、产品,也不构成对 任何特定用途的认可。

材料按"原样"提供,不附带任何形式的担保。结果是在一台机器、某一时刻测得的;这里不承诺某条路线在你 的目标、你的宿主或你的工具链上同样可行。信任之前先验证,并且对副本动手。

工具、库、文件格式与加固产品的名称出现,只是为了让材料可复用;它们属于各自的拥有者,本项目与它们 没有关联。