返回总教程

Electron 应用通常把前端资源和 JavaScript 放在 app.asar 中。baoyu-electron-extract 面向的是自有或明确获授权的软件分析:它发现应用包、提取资源,在源码还原与格式化阶段跳过 node_modules,有可用 source map 时从 sourcesContent 重建可读目录,没有时用 Prettier 格式化代码。这里的“提取”不是破解,也不包含绕过登录、加密、授权或保护机制。本文基于固定 commit 的统一源码和脚本核对,案例是操作示例,不代表付费服务、账号或本机实测;不会在写作过程中执行提取。

场景与边界

适合审计自己团队发布的 Electron 桌面应用、定位打包后资源路径、检查构建产物是否泄露 source map、学习应用的目录结构,或在获得书面授权后复现用户报告。输入可以是应用名、应用安装目录、.app 包、Windows 安装目录,也可以直接指定 .asar。macOS 和 Windows 是脚本明确支持的平台;Linux 或其他平台应直接提供 .asar 路径。

输出不是完整开发仓库的保证。只有 source map 内嵌 sourcesContent 时,才可能恢复接近源文件的树;如果 map 只保存文件名而没有内容,脚本会跳过该 map,对对应 JavaScript 做 Prettier 格式化。node_modules 会在后续遍历、还原与格式化阶段跳过;底层 ASAR 提取并没有按这个目录过滤,因此磁盘中仍可能存在这些依赖。部分打包运行时条目也不会还原。不能把还原结果当成版权许可,也不能据此重发布第三方软件。

前置依赖与按需安装

先只安装本技能,Claude Code 用户将 --agent codex 替换为 --agent claude-code:

1
npx skills add jimliu/baoyu-skills --skill baoyu-electron-extract --agent codex

安装筛选参数已对照 skills 安装器说明核实。安装器默认获取的可能是仓库当前版本;严格复现要核对文末 commit。运行时与技能分开准备。虽然元数据写 bun 或 npx,提取脚本实际上会启动 npx -y @electron/asar extract,格式化也通过 npx 调用 Prettier,因此仅有 Bun 而没有 npx 并不足以保证完整流程可用。无需全局安装 @electron/asar 和 prettier,首次解析可能联网。已有 Node.js/npx 时,可按需另装 Bun:

1
npm install -g bun

如果环境已有 Node.js 而没有 Bun,命令中的 ${BUN_X} 可替换为 npx -y bun。这只是运行方式,不是本文建议立即安装或执行;先做 --dry-run,确认应用发现结果后再决定是否运行。

输入、输出和参数

通用命令:

1
${BUN_X} {baseDir}/scripts/main.ts "<app>" [options]

已从 SKILL.md 和 scripts/main.ts 核对的参数:

  • <app>:应用名或绝对路径。除非传入 --asar,否则必填。
  • --output 或 -o:输出目录,默认 ~/Downloads/<AppName>-electron-extract。
  • --asar:覆盖自动解析出的 .asar 路径。
  • --force 或 -f:允许写入非空输出目录;默认遇到非空目录会拒绝。
  • --skip-format:跳过 Prettier 格式化。
  • --skip-restore:跳过 source-map 还原。
  • --no-unpacked:不复制并列的 app.asar.unpacked/。
  • --dry-run:只打印解析出的路径,不写文件。
  • --json:输出一行 JSON 摘要,抑制普通输出。

成功输出目录通常包含 extract-report.json、extracted/、可选的 extracted.unpacked/ 和可选的 restored/。extracted/ 是 ASAR 原始目录(没有 source map 还原的 JS/CSS 会按规则格式化);restored/ 是从 source map 内容恢复的源树。报告会记录计数、路径和警告,排错时应优先查看它。

可复制的自然语言 Agent 请求

1
请使用 baoyu-electron-extract 分析我拥有或已获授权的 Windows Electron 应用。先用 dry-run 只发现 app.asar 和可能的 app.asar.unpacked,不写磁盘;如果只有一个明确候选,再输出到一个新的空目录。提取后报告 extracted、restored、unpacked 和警告数量,不要修改原应用,不要尝试绕过授权或保护机制。

如果已知路径,可以更精确:

1
请对这个明确授权的 .asar 文件做只读来源分析:<绝对路径>。使用 --asar 指定它,输出到新的分析目录;保留 source-map 还原和格式化,完成后只报告文件布局、source map 是否带 sourcesContent 以及 extract-report.json 中的警告。

操作案例:审计自己发布的桌面版本

假设 Windows 安装目录是 C:\Users\me\AppData\Local\Programs\demo-app。第一步不直接写入:

1
${BUN_X} {baseDir}/scripts/main.ts "C:\Users\me\AppData\Local\Programs\demo-app" --dry-run

脚本在 Windows 会搜索 %LOCALAPPDATA%\Programs、%PROGRAMFILES%、%PROGRAMFILES(X86)%、%APPDATA%;发现多个匹配时会列出候选并以非零状态退出,此时让用户选择一个绝对路径,而不是猜测。确认后写到专门目录:

1
${BUN_X} {baseDir}/scripts/main.ts "C:\Users\me\AppData\Local\Programs\demo-app" --output "C:\temp\demo-app-review" --json

若应用目录内本来存在 app.asar,也可以:

1
${BUN_X} {baseDir}/scripts/main.ts DemoApp --asar "C:\path\to\app.asar" --output "C:\temp\demo-app-review"

案例验收重点不是“恢复了多少文件”,而是区分三种结果:有 restored/ 表示至少部分 map 可用;只有 extracted/ 表示主要依靠格式化;extracted.unpacked/ 可能包含原生模块或大资源。报告中 warnings 会告诉你 map 的 sources 与 sourcesContent 长度不匹配、外部源文件缺失等情况。

Source map 还原的关键理解

脚本会结合 sourceRoot、map 文件位置和 sources[] 解析路径,并清理常见 webpack://、file:// 及查询后缀。像 .vite/main/index.js.map 加 ../../src/main.ts 这样的路径,会尽量还原为 restored/src/main.ts;向上越出 extracted/ 时保留可读的剩余目录。如果源名称为空或不能安全化,才使用 restored/__unknown/<hash>.<ext>。node_modules 和 webpack/runtime/* 是噪声,按设计跳过。

因此不要看到 ../ 就把所有源 map 判为危险或无效;应看最终是否被安全地限制在 restored/ 下。反过来也不能看到 restored/ 就断言源代码完整:它只代表嵌入内容成功恢复的一部分。

配置、覆盖与安全操作

当前 SKILL.md 没有声明 EXTEND.md 配置机制。请使用 --output、--skip-format 等已核实参数表达需求,不要编造配置字段。输出目录最好是新的分析目录;脚本会拒绝向根目录、用户 home 本身或当前工作目录写入,并拒绝非空目录,除非明确提供 --force。该参数含义是允许写入非空目录,不保证先清空旧产物,所以重复分析可能混入旧文件。优先为每个版本分配新目录;只有明确同意覆盖后才使用它。

不要在正在运行的应用目录里直接解包,不要把原应用的 app.asar 改写回去。分析结束后可将结果目录交给代码检索工具,但应按团队的数据分级规则处理可能包含密钥、内部 URL 或个人信息的资源。

验收清单

  • 软件归属或分析授权已确认。
  • --dry-run 的候选路径与最终目标一致。
  • 输出目录是新建或已明确允许覆盖的目录。
  • extract-report.json 存在且可读。
  • 已区分 extracted、restored 和 extracted.unpacked。
  • 报告中的 extracted/restored/formatted/skipped 计数与实际抽查结果相符。
  • source map 警告已记录,未把部分还原当成完整源码。
  • node_modules 未被误当作业务源码分析。
  • 未修改原应用,未执行破解、注入或授权绕过操作。

排错

找不到应用:传入安装目录或 .asar 的绝对路径,必要时显式加 --asar。出现多个匹配:不要自动选择,展示候选,让用户指定。输出目录非空被拒绝:换新目录,或在用户明确同意后加 --force。没有 restored/:检查 map 是否存在且含 sourcesContent,也可能使用 --skip-restore 关闭了还原。代码仍很难读:这是没有可嵌入源内容时的格式化结果,不能凭空恢复变量名和注释。运行器失败:确认 Bun 或 npx -y bun 可用;首次通过 npx 解析依赖可能更慢。结果缺大文件或原生模块:检查是否误用了 --no-unpacked,并确认 app.asar.unpacked 是否存在。

相关技能与固定来源

若要先整理发布说明,可参考格式化 Markdown;若需处理提取出的图片,可参考压缩图片。本教程基于固定 commit baoyu-electron-extract 的 SKILL.md和main.ts核对,来源 commit 为 1567581c26ec29f4216c6e6835415bf30343b0e3。