WinDbg x64扩展,用于反汇编活动函数,并使用LLM生成经过验证的伪代码。


该项目是一个 Windows x64 WinDbg 扩展骨架,它通过名称或地址解析函数,重建确定性的控制流视图,并直接从扩展中询问 LLM 以生成伪代码。
src/extension:WinDbg 扩展 DLL 和 !decomp 命令。src/shared:扩展共享的 JSON、分析器、协议和验证器代码。scripts:构建和供应商复制辅助工具。third_party/dbgeng:可选的供应商 dbgeng.h 和 dbgeng.lib 副本。third_party/zydis:供应商提供的稳定版 Zydis 源代码树,存在时默认使用。xmm0 至 xmm3,带有向量零惯用法保护以避免虚假传入参数/deobf:on|off 控制是否允许恢复的混淆事实指导伪 C 重写从构建输出加载扩展,然后对符号或地址运行 !decomp:```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
当设置看起来有问题时,或者启用 LLM provider 之前,使用 `/doctor`:```text
!decomp /doctor
!decomp /doctor:net
/doctor 不需要目标且不调用提供者。它报告配置路径/加载状态、提供者/模型/端点摘要、认证存在性(不含机密)、超时/令牌/分块设置、DML支持、会话类/限定符、处理器类型和PDB注意事项。/doctor:net 会被当作显式网络检查请求接受,但目前报告跳过提供者ping。该扩展不会从doctor模式执行网络探测。靶标可以是公有/私有符号、导出的函数名或地址。如果靶标解析为函数内的地址,扩展会尝试从符号、展开数据和控制流启发式方法中恢复所在函数范围。对包含空格的靶标加引号:```text !decomp "my module!Function With Spaces"
正常命令路径执行本地分析、构建分析器事实、可选地调用已配置的LLM端点、根据恢复的证据验证响应,并输出伪C代码以及置信度、警告和不确定性注释:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
Normal(正常)、brief(简要)和 explain(解释)输出模式包含一个紧凑的进度流,即使在未使用 /verbose 时也是如此。长 LLM 运行会显示本地分析完成、分块进度、重试通知、合并启动、验证以及 Ctrl+Break 取消提示。机器可读模式(例如 /view:json、/view:facts、/view:prompt 和 /view:data)会抑制进度行和 DML 辅助链接,以便脚本仅接收所请求的有效载荷。
使用 /view:* 来选择你想要查看的内容。这保持了命令界面的简洁性:一个选项控制所有输出模式。```text
!decomp /view:brief module!HotPath
!decomp /view:explain module!BranchyFunction
!decomp /view:json module!FunctionName
!decomp /view:facts module!FunctionName
!decomp /view:prompt module!FunctionName
!decomp /view:data module!FunctionName
!decomp /view:analyzer module!FunctionName
!decomp /view:plan module!FunctionName
- `brief` 打印目标、置信度、摘要以及第一个不确定性或验证器警告。
- `explain` 添加证据、控制流、类型提示、观察到的行为和调用目标部分。
- `json` 打印机器可读的请求和响应 JSON。
- `facts` 仅打印分析器事实并禁用 LLM 路径。
- `prompt` 打印精确的系统提示、用户提示和提示事实。它会禁用 LLM 调用。
- `data` 打印一个稳定的 JSON 快照,旨在用于 WinDbg JavaScript/NatVis 风格的自动化。
- `analyzer` 渲染确定性仅分析器伪代码路径,而不调用 LLM。
- `plan` 执行本地分析并打印预检计划,而不调用 LLM 或更新结果缓存。它包括目标/模块/范围计数、PDB 可用性、会话策略、估计的分块、与提示大小相关的计数以及实用建议。
当命令似乎卡住或你想看到完整的进度流时,使用 `/verbose`:```text
!decomp /verbose module!SlowFunction
!decomp /verbose /view:json module!SlowFunction
/verbose 会打印本地阶段,例如目标解析、函数范围恢复、字节读取、反汇编、分析器事实构建、PDB/会话增强、伪代码标记化以及验证器结果。/verbose 还会打印提示大小、请求令牌预算、HTTP 连接/发送/接收阶段、响应块大小、完成原因、提取的模型 JSON 预览、重试次数以及验证器反馈的重试决策。/verbose 用完整跟踪替换紧凑进度流。在紧凑进度行不足以诊断时间花费时使用它。!decomp 命令期间,在 WinDbg 中按 Ctrl+Break 请求取消。扩展程序在本地分析阶段和等待 LLM 工作线程之间检查中断,然后要求活动的同步 HTTP I/O 停止。旧版别名例如 /brief、/explain、/json、/facts-only、/debug-prompt、/data-model、/dx 和 /no-llm 仍然适用于旧脚本,但新示例使用 /view:*。
窗口查看器:```text !decomp /view:window module!FunctionName !decomp /view:window /view:explain module!FunctionName
- `/view:window` 对目标执行正常的 `!decomp` 结果路径,并在单独查看器中打开完整的渲染结果。
- 该查看器使用与控制台路径相同的响应渲染器,然后在找到调试器窗口时,打开一个由调试器窗口拥有的原生 Win32 无模式工具窗口。
- 调试器输出报告原生查看器窗口句柄。如果无法创建查看器窗口,命令会打印警告并回退到正常的控制台结果。
- 仅限 DML 的链接在查看器中呈现为带有命令字符串的文本标签。当 RichEdit 可用时,窗口使用 GitHub 风格的 RTF 布局,包含章节标题、元数据样式和伪代码高亮;否则回退为纯文本。
- 当当前会话有之前的缓存结果时,查看器会显示左侧历史列表,以便您在当前输出和之前的反编译结果之间切换,而无需重新运行分析。
- `/view:json`、`/view:facts`、`/view:prompt` 和 `/view:data` 仍保持为机器可读的控制台输出,不会重定向到查看器。
大型函数:```text
!decomp /limit:deep module!LargeFunction
!decomp /limit:huge module!VeryLargeFunction
!decomp /limit:12000 module!VeryLargeFunction
!decomp /timeout:120000 module!SlowFunction
/limit:deep 将指令上限提升至 8192。/limit:huge 将指令上限提升至 16384。/limit:N 设置显式的指令上限。/timeout:MS 覆盖本次调用的请求超时时间。decomp.llm.json 控制;命令行指令上限控制扩展在提示前尝试恢复多少本地代码。/deep、/huge 和 /maxinsn:N 仍然受支持。混淆感知反编译:```text !decomp /deobf:on module!FlattenedFunction !decomp /deobf:off module!FlattenedFunction !decomp /view:facts /deobf:off module!FlattenedFunction
- `/deobf:on` 为默认选项。分析器仍会发出原始事实,但高置信度的 OLLVM 风格分发器恢复、不透明死边证明、替换习语以及语义 CFG 覆盖层可能会指导提示事实、合并策略、验证器冲突策略以及结构化伪 C 恢复。
- `/deobf:off` 保留 `obfuscation`、`semantic_control_flow` 和 `deobfuscation_readiness` 事实可见,但禁用重写安全操作,保持控制流结构基于原始 CFG,并告知提示/合并/验证器路径保留原始混淆形状。
- 当你希望直接检查分发器、虚假分支或替换表面,而不是让扩展恢复反混淆结构时,请使用 `/deobf:off`。
- `/deobfuscation:on|off` 作为更长的别名被接受。
缓存和重放助手:```text
!decomp /view:json module!FunctionName
!decomp /last:json
!decomp /view:explain module!FunctionName
!decomp /last:explain
!decomp /view:facts module!FunctionName
!decomp /last:facts
!decomp /view:data module!FunctionName
!decomp /last:data
!decomp /view:prompt module!FunctionName
!decomp /last:prompt
!decomp /history
!decomp /refresh module!FunctionName
!decomp /last:2:explain
!decomp /last:2:json
/last:json 打印上一次的请求/响应 JSON,无需重新运行分析。/last:explain 重新渲染上一次的完整结果并包含解释部分,无需重新运行分析或调用 LLM。/last:facts 打印上一次结果中的分析器事实,无需重新运行分析。/last:data 打印上一次的数据模型快照,无需重新运行分析。/last:prompt 打印上一次的提示转储,无需重新运行分析。/history 列出内存中的结果环形缓冲区。索引 1 是最新的结果。/refresh <target> 绕过该目标持久化制作的回放,运行全新的本地分析和 LLM 分析,并在成功获得 LLM 支持的结果后替换保存的制作。/last:N:explain、/last:N:json、/last:N:facts、/last:N:data 和 /last:N:prompt 按历史索引回放较旧的缓存结果,无需重新运行本地分析或调用 LLM。/last:* 模式是终端回放命令。如果在同一命令中存在目标,则回放缓存的制作,并且不会为该目标启动本地分析或 LLM 请求。decomp.dll 旁边的 artifact 文件夹下。操作员无需单独执行保存命令。request、response、data_model、debug_prompt 以及一个包含 Win32/KD 版本值、构建字符串、可选的 NtBuildLab 和构建指纹的 kernel_build 对象。!decomp <target> 命令会自动在目标解析和函数 RVA 恢复后检查 artifact\<kernel_build>\... 路径。如果保存的 kernel_build 与当前操作系统构建匹配,则该扩展会回放制作,而无需读取函数字节、运行本地分析器传递或调用 LLM。/last:* 视图,因此点击 explain、json、facts、prompt 或 data-model 不会启动新的反编译运行。/last-json、/last-explain、/last-facts、/last-data-model、/last-dx 和 /last-prompt 仍然受支持。DML 导航:
actions 行,其中包含针对同一目标的可点击 explain、json、facts、prompt、data-model 和 history 链接。nav 行,其中包含入口反汇编、入口断点和最新制作回放链接。会话感知和观察到的行为细节: