Codex/LLM 逆向工程复用工作流 - 五阶段完整指南

Codex/LLM 逆向工程复用工作流 - 五阶段完整指南

整理时间: 2026-02-03 23:01
来源: 群聊消息
整理人: AI助手


概述

本文档介绍了一套基于 Codex/LLM 的逆向工程复用工作流,专门用于解包和还原 Electron 应用的混淆代码。该工作流通过系统化的五阶段方法,将复杂的逆向工程任务分解为可管理的步骤,并利用 LLM 的能力自动化大部分还原过程。


核心思想

为什么需要这个工作流?

  • 长上下文任务管理 - 逆向工程涉及大量代码,超出单次会话的上下文限制
  • 状态持久化 - 防止会话重置后丢失进度
  • 自动化处理 - 减少人工干预,提高效率
  • 质量保证 - 通过测试验证还原的准确性

工作流程概览

┌─────────────────────────────────────────────────────────────────┐
│                    五阶段逆向工程工作流                            │
├─────────────┬─────────────┬─────────────┬─────────────┬─────────┤
│  第一阶段    │  第二阶段    │  第三阶段    │  第四阶段    │ 第五阶段 │
│ 准备与分析   │ 外部记忆系统  │  模块还原    │  组装修复    │ 测试验证 │
│ Preparation │   Memory    │ Restoration │   Assembly  │Verification
│  & Analysis │    Setup    │    Loop     │    & Fix    │         │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────┘

第一阶段:准备与分析 (Preparation & Analysis)

1.1 提取资源

操作步骤:
1. 解包 Electron 应用的 app.asar 文件
2. 提取混淆后的 JS 和 CSS 资源
3. 建立原始资源库

工具命令:

# 安装 asar 工具
npm install -g asar

# 解包 app.asar
asar extract app.asar ./extracted_source

# 查看提取的文件结构
tree ./extracted_source -L 2

1.2 生成库存 (Inventory)

目标: 让 LLM 分析代码结构,生成模块清单

操作流程:

步骤 操作 说明
1 读取主 JS 文件 通常是被混淆的主入口文件
2 输入 LLM 使用结构化提示词
3 获得模块清单 作为后续还原的大纲

Prompt 模板:

分析此混淆代码的结构,识别主要逻辑块,并生成一个模块/功能列表。

代码文件:[粘贴混淆代码]

请输出:
1. 模块清单(按功能分类)
2. 每个模块的简要描述
3. 模块间的依赖关系
4. 建议的还原优先级

预期输出:

## 模块清单

### 核心模块
- [ ] main.js - 应用入口
- [ ] renderer.js - 渲染进程
- [ ] preload.js - 预加载脚本

### 功能模块
- [ ] auth.js - 用户认证
- [ ] api.js - API 请求
- [ ] ui.js - UI 组件
...

第二阶段:构建外部记忆系统 (External Memory Setup)

这是长上下文任务的核心。需要创建两个本地文件来存储状态和规则。

2.1 PLAN.md (进度控制)

文件作用: 作为 LLM 的状态存储,防止会话重置后丢失进度

文件内容结构:

# 逆向工程进度计划

## 项目信息
- 项目名称:[应用名称]
- 开始时间:[日期]
- 目标:还原混淆代码为可读 TypeScript

## 模块清单(Checklist)

### 核心模块
- [ ] main.js - 应用入口 (待办)
- [x] renderer.js - 渲染进程 (已完成)
- [ ] preload.js - 预加载脚本 (进行中)

### 功能模块
- [ ] auth.js - 用户认证 (待办)
- [ ] api.js - API 请求 (待办)
...

## 当前处理状态
- **当前模块:** preload.js
- **处理进度:** 50%
- **上次会话:** 2026-02-03 22:30
- **备注:** 正在还原事件监听逻辑

## 已完成模块摘要
1. renderer.js - 完成时间、主要功能、关键发现

2.2 AGENT.md (系统指令)

文件作用: 定义项目背景、任务目标和核心规则

文件内容结构:

# Agent 系统指令

## 项目背景
- 目标应用:[应用名称]
- 原始技术栈:Electron + [其他框架]
- 目标技术栈:Electron + TypeScript
- 代码状态:混淆压缩后的 JS

## 任务目标
将混淆的 Electron 应用代码还原为可读的 TypeScript 项目。

## 核心规则

### 规则 1:会话开始时
**强制指令:** 每次会话开始时,必须先读取 PLAN.md 文件,了解当前进度状态。

### 规则 2:会话结束时
**强制指令:** 每次回答结束前,必须输出更新后的 PLAN.md 内容,保存当前进度。

### 规则 3(第三阶段):还原阶段
**强制指令:** "将混淆的 JS 逐个模块转换为可读的 TypeScript。"
**关键约束:** "不要尝试编译代码。只关注逻辑还原,忽略任何类型错误或构建缺失。"
> 说明:防止模型因试图修复编译错误而删减逻辑

### 规则 4(第四阶段):修复阶段
**强制指令:** "现在的目标是修复编译错误(Fix Compilation Errors)并确保 npm start 可运行。"

## 还原标准
1. 保留原始逻辑,不做功能删减
2. 变量命名清晰可读
3. 添加必要的类型注解
4. 保持代码结构清晰

第三阶段:模块还原 (Restoration Loop)

这是核心的代码还原阶段,需要循环处理每个模块。

3.1 设定还原规则

在 AGENT.md 中确认第三阶段规则:

## 当前阶段:模块还原 (Phase 3)

**指令:** 将混淆的 JS 逐个模块转换为可读的 TypeScript
**约束:** 
- 不要尝试编译代码
- 只关注逻辑还原
- 忽略任何类型错误或构建缺失

3.2 执行循环 (Automation)

输入流程:

混淆代码片段 → LLM 处理 → 可读 TypeScript → 保存文件 → 更新 PLAN.md

上下文管理脚本:

# context_monitor.py - 监控上下文使用情况
import subprocess
import time

SESSION_THRESHOLD = 0.8  # 80% 上下文使用阈值

def check_context_usage():
    """检查当前会话的上下文使用情况"""
    # 实际实现需要集成 LLM API
    pass

def save_current_progress():
    """保存当前进度"""
    # 1. 保存当前输出到文件
    # 2. 更新 PLAN.md
    pass

def start_new_session():
    """开启新会话并恢复进度"""
    subprocess.run([
        "claude",  # 或其他 LLM CLI
        "--prompt", "Continue based on PLAN.md"
    ])

def main():
    while True:
        usage = check_context_usage()
        if usage > SESSION_THRESHOLD:
            save_current_progress()
            start_new_session()
        time.sleep(60)  # 每分钟检查一次

if __name__ == "__main__":
    main()

工作流程图:

┌──────────────────────────────────────────────────────────────┐
│                      模块还原循环                             │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│   ┌──────────┐    ┌──────────┐    ┌──────────┐            │
│   │ 读取 PLAN │ → │ 选择模块  │ → │ 输入混淆  │            │
│   │   .md    │    │          │    │   代码    │            │
│   └──────────┘    └──────────┘    └────┬─────┘            │
│                                         ↓                   │
│                                   ┌──────────┐             │
│                                   │ LLM 还原  │             │
│                                   │ 为 TS    │             │
│                                   └────┬─────┘             │
│                                         ↓                   │
│   ┌──────────┐    ┌──────────┐    ┌──────────┐            │
│   │ 检查上下文│ ← │ 保存输出  │ ← │  输出 TS │            │
│   │ 使用情况 │    │ 更新 PLAN │    │   代码   │            │
│   └────┬─────┘    └──────────┘    └──────────┘            │
│        │                                                    │
│        ↓ 超过阈值                                            │
│   ┌──────────┐                                               │
│   │ 开启新会话│ ───────→ 读取 PLAN.md 继续                   │
│   │ 自动继续  │                                               │
│   └──────────┘                                               │
│                                                              │
└──────────────────────────────────────────────────────────────┘

第四阶段:组装与修复 (Assembly & Fix)

4.1 脚手架搭建

步骤:

# 使用 Electron Forge 初始化项目
npm init electron-app@latest my-app -- --template=typescript-webpack

cd my-app

# 安装依赖
npm install

4.2 注入代码

将第三阶段还原的 TS 文件放入项目目录:

my-app/
├── src/
│   ├── main.ts          # 替换为还原的 main.ts
│   ├── preload.ts       # 替换为还原的 preload.ts
│   └── renderer/
│       └── index.ts     # 替换为还原的 renderer.ts
└── ...

4.3 调整规则

修改 AGENT.md:

## 当前阶段:组装修复 (Phase 4)

**指令:** 修复编译错误并确保 npm start 可运行

**删除的规则:**
~~"忽略编译错误"~~

**新增规则:**
1. 运行编译 → 获取错误日志
2. 将错误日志喂给 LLM
3. LLM 对比原始混淆逻辑
4. 生成修复代码
5. 重复直到编译通过

4.4 修复循环 (Fix Loop)

自动化脚本:

# fix_loop.py - 编译错误修复循环
import subprocess
import json

def run_compiler():
    """运行 TypeScript 编译器"""
    result = subprocess.run(
        ["npx", "tsc", "--noEmit"],
        capture_output=True,
        text=True
    )
    return result.returncode == 0, result.stdout + result.stderr

def fix_with_llm(error_log, original_logic):
    """使用 LLM 修复错误"""
    prompt = f"""
    编译错误日志:
    {error_log}

    原始混淆逻辑参考:
    {original_logic}

    请:
    1. 分析错误原因
    2. 对比原始逻辑
    3. 生成修复后的代码
    4. 说明修改原因
    """
    # 调用 LLM API
    pass

def main():
    max_attempts = 10
    for attempt in range(max_attempts):
        success, errors = run_compiler()
        if success:
            print("✅ 编译通过!")
            break

        print(f"尝试 {attempt + 1}: 发现 {errors.count('error')} 个错误")
        fix_with_llm(errors, get_original_logic())
    else:
        print("❌ 达到最大尝试次数,需要人工介入")

if __name__ == "__main__":
    main()

第五阶段:测试验证 (Verification)

5.1 生成测试

Prompt 模板:

请为核心用户流程编写集成测试 (Integration Tests):

应用功能:
1. [功能1] - [描述]
2. [功能2] - [描述]
...

要求:
1. 使用 Jest + Playwright 或类似的测试框架
2. 覆盖主要用户流程
3. 包含边界情况
4. 生成可运行的测试代码

5.2 盲写矫正循环

流程:

运行测试 → 发现失败 → 喂入测试报告 → LLM 修正 → 重新运行 → 通过

测试驱动修复脚本:

# test_driven_fix.py
import subprocess

def run_tests():
    """运行测试套件"""
    result = subprocess.run(
        ["npm", "test"],
        capture_output=True,
        text=True
    )
    return result.returncode == 0, result.stdout

def fix_based_on_test(test_report):
    """基于测试报告修复"""
    prompt = f"""
    测试失败报告:
    {test_report}

    请分析失败原因并修复代码。
    修复后必须确保测试通过。
    """
    # 调用 LLM
    pass

def main():
    while True:
        success, report = run_tests()
        if success:
            print("✅ 所有测试通过!")
            break

        print("发现测试失败,正在分析...")
        fix_based_on_test(report)

if __name__ == "__main__":
    main()

总结:核心操作清单

阶段 关键操作 输入 输出
1. 提取 解包 asar app.asar 混淆 JS/CSS
2. 记忆 建立 PLAN.md + AGENT.md LLM 分析结果 状态文件
3. 还原 JS → TS 混淆代码 可读 TS
4. 组装 放入新脚手架 TS 文件 Electron 项目
5. 修复 编译器报错修复 错误日志 可编译代码
6. 验证 集成测试 测试报告 可运行应用

关键成功因素

1. 状态管理

  • ✅ 使用 PLAN.md 跟踪进度
  • ✅ 每次会话读取和更新状态
  • ✅ 自动化上下文切换

2. 质量保证

  • ✅ 还原阶段不编译,保留完整逻辑
  • ✅ 修复阶段专注编译通过
  • ✅ 验证阶段确保功能正确

3. 自动化

  • ✅ 监控上下文使用
  • ✅ 自动保存和恢复
  • ✅ 编译错误自动修复

常见问题与解决方案

Q1: 混淆代码太复杂,LLM 无法理解

A: 先让 LLM 识别代码结构,生成高级概述,再逐个模块深入。

Q2: 还原的代码有功能缺失

A: 检查第三阶段是否遵守”不编译”规则,确保没有因修复错误而删减逻辑。

Q3: 测试无法通过

A: 对比原始混淆代码和还原代码的行为,确保逻辑等价性。

Q4: 上下文频繁耗尽

A: 调整监控脚本的阈值,或拆分为更小的模块进行处理。


相关资源

  • Electron asar 文档: https://github.com/electron/asar
  • Electron Forge: https://www.electronforge.io/
  • TypeScript 文档: https://www.typescriptlang.org/
  • Jest 测试框架: https://jestjs.io/
  • Playwright 测试: https://playwright.dev/

本文档由AI助手整理生成
最后更新:2026-02-03