Baoyu Electron Extract

Polar Sponsor
爱发电 赞助
.NET 9.0

从任意已安装的 Electron应用(`.asar` 包)中提取资源和 JavaScript,能够在有 `.js.map` 文件时恢复原始源码,或在无映射时恢复格式化代码。

Electron App 提取

功能概述

Electron App 提取是一项面向实际任务的技能,主要用于从一个安装的 Electron App 的 app. asar 提取资源和代码;当 .js.map 存在时, 从嵌入源 Content 恢复原始源文件。

核心要点

  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

Electron 应用提取

从已安装的 Electron 应用的 app.asar 中提取资源与代码。若存在 .js.map 文件,则通过其中嵌入的 sourcesContent 还原原始源文件;否则使用 Prettier 格式化混淆后的代码。Source-map 中的路径优先相对于 .js.map 文件所在位置解析,因此类似 ../../src/main.ts 的打包路径将还原为可读路径(如 restored/src/main.ts),而非哈希占位符。始终跳过 node_modules。支持 macOS 和 Windows 平台。

用户输入工具

当本技能向用户发起提示时,请按以下工具选择规则执行(优先级由高到低):

  1. 优先使用运行时内置的用户输入工具 — 例如 AskUserQuestion、request_user_input、clarify、ask_user 或其等效实现。
  2. 降级方案:若无此类工具,则以编号纯文本形式输出问题,并请用户针对每个问题回复对应编号或答案。
  3. 批量处理:若该工具支持单次调用中提交多个问题,则应合并所有适用问题为一次调用;若仅支持单问题调用,则按优先级顺序逐个提问。

下方出现的具体 AskUserQuestion 引用仅为示例 — 在其他运行时中请替换为本地等效工具。

脚本目录

脚本位于 scripts/ 子目录下。{baseDir} 表示本 SKILL.md 文件所在目录路径。解析 ${BUN_X} 运行时:若系统已安装 bun → 使用 bun;若未安装但可用 npx → 使用 npx -y bun;否则建议用户安装 bun。请将 {baseDir} 和 ${BUN_X} 替换为实际值。

脚本 用途
scripts/main.ts 应用发现 + asar 提取 + source-map 还原 + Prettier 格式化

适用场景

当用户希望查看已安装 Electron 应用内部结构或检查其打包后的代码时,应使用本技能。触发语句包括:

  • “extract Electron app”、“decompile this Electron app”、“unpack app.asar”
  • “show me the source of ”、“look inside ”、“how is built”
  • “get the source code of Codex / Cursor / Discord / Slack / VS Code / Notion / Obsidian / ChatGPT desktop”
  • “提取 Electron 应用”、“看 的源码”、“反编译 Electron”、“解包 app.asar”、“还原 source map”

接受两种输入形式:应用名称(例如 Codex)或绝对路径(例如 /Applications/Codex.app、一个 .asar 文件,或 Windows 安装目录)。脚本在两个平台上均支持自动发现。

工作流程

1. 确定输入。 若用户未提供应用名称或路径,则需主动询问;若用户希望自定义输出目录,也应一并询问。

2. 执行脚本。

${BUN_X} {baseDir}/scripts/main.ts "" [--output ] [--asar ] [--force]

若不确定自动发现是否能准确定位目标 bundle,建议先使用 --dry-run 参数运行 —— 此时仅打印解析出的路径并退出,不修改任何文件系统内容。

3. 处理结果。

  • 成功 → 报告输出路径及各项计数(已提取 / 已还原 / 已格式化)。
  • 匹配多个应用 → 脚本将列出候选项目并以非零状态退出。请向用户展示候选列表,并通过 AskUserQuestion(或运行时等效工具)询问其选择;随后使用所选绝对路径重新运行。
  • 输出目录已存在且非空 → 脚本在未指定 --force 时将拒绝写入。请询问用户是否覆盖(启用 --force)或另选 --output 路径。
  • 平台不支持 / 未找到匹配项 → 若用户知晓 bundle 所在位置,建议其显式传入 --asar /full/path/to/app.asar。

4. 引导用户查看结果。 默认输出目录为 ~/Downloads/-electron-extract/。最值得关注的子目录取决于实际发现的内容:

  • 若存在 restored/ → 表明已基于 .js.map 文件重建原始源码树;这是首要查阅位置。
  • 仅存在 extracted/(无 source-map)→ extracted/ 中的 JS/CSS 已就地完成 Prettier 格式化;请从此处阅读。

Source-map 路径还原

脚本应在 source-map 允许范围内尽可能保留原始源文件名与目录结构:

  • 若 sourceRoot 存在,则先以其为基础解析 sources[] 中每一项,再相对于 .js.map 文件在 extracted/ 内的实际路径进行补全。
  • 将常规打包器生成的相对路径折叠至还原后的项目树中。例如:.vite/main/index.js.map + ../../src/main.ts → restored/src/main.ts。
  • 若源路径向上越出 extracted/ 目录层级,则保留其可读的剩余路径部分,并置于 restored/ 下,而非哈希化。例如:.vite/main/index.js.map + ../../../shared/src/lib/foo.ts → restored/shared/src/lib/foo.ts。
  • 剥离源文件名中的 URL/查询参数修饰符,包括常见的 webpack://、file:// 及 ?loader 后缀。
  • 仅当源文件名为空或无法规约为安全文件路径时,才使用 restored/__unknown/.。
  • 继续跳过 node_modules 和 webpack/runtime/* 条目;这些属于打包器/运行时噪声,而非应用源码。

使用示例

# 按应用名称提取(默认输出至 ~/Downloads/Codex-electron-extract/)
${BUN_X} {baseDir}/scripts/main.ts Codex

# 按绝对路径提取(适用于 .app 包、安装目录或 .asar 文件)
${BUN_X} {baseDir}/scripts/main.ts "/Applications/Visual Studio Code.app"
${BUN_X} {baseDir}/scripts/main.ts "C:\\Users\\you\\AppData\\Local\\Programs\\codex"
${BUN_X} {baseDir}/scripts/main.ts --asar /Applications/Codex.app/Contents/Resources/app.asar Codex

# 自定义输出目录
${BUN_X} {baseDir}/scripts/main.ts Codex --output ~/work/codex-source

# 预览自动发现结果(不执行任何写入操作)
${BUN_X} {baseDir}/scripts/main.ts Codex --dry-run

# 覆盖已存在的输出目录
${BUN_X} {baseDir}/scripts/main.ts Codex --force

# 输出机器可读结果(标准输出为单行 JSON)
${BUN_X} {baseDir}/scripts/main.ts Codex --json

选项说明

选项 简写 说明 默认值
应用名称或绝对路径。除非指定了 --asar,否则此项为必填。 —
--output -o 输出目录 ~/Downloads/-electron-extract
--asar 覆盖自动解析出的 .asar 路径 自动发现
--force -f 允许向已存在且非空的输出目录写入 false
--skip-format 跳过 Prettier 格式化 false
--skip-restore 跳过 source-map 还原 false
--no-unpacked 不复制 app.asar.unpacked/ 目录 false
--dry-run 打印解析出的路径后退出,不执行任何写入操作 false
--json 在标准输出中输出一行 JSON 摘要(禁用常规输出) false

输出目录结构

~/Downloads/-electron-extract/
├── extract-report.json          # JSON 摘要:统计数量、警告信息、已解析路径
├── extracted/                   # asar 原始内容(无 source-map 时对 JS/CSS 就地执行 Prettier 格式化)
│   └── ...                      # node_modules 保持原样(格式化阶段跳过)
├── extracted.unpacked/          # 若存在则从 .unpacked/ 复制而来
│   └── ...                      # 原生模块(.node)、大型资源文件
└── restored/                    # 仅当至少有一个可用的 .js.map 时才存在
    └──    # 依据各 .js.map 中的 sourcesContent 重建

注意事项

  • node_modules 始终被跳过 —— 无论是 source-map 还原还是 Prettier 格式化 —— 因为第三方依赖对于应用代码审查而言属于干扰信息。
  • Source-map 还原 仅在 .js.map 中嵌入了 sourcesContent 时生效。现代打包器(如 webpack、esbuild、Vite、rollup)通常默认启用此功能。若 source-map 仅引用外部 .ts/.js 文件而未嵌入其内容,则该 map 将被跳过,对应 .js 文件将转为 Prettier 格式化。被跳过的 maps 将记录于 extract-report.json 的 warnings 字段中。
  • 优先使用可读路径而非哈希 —— 不应将 source-map 路径中的 ../ 段视为天然不安全。应首先从 map 文件位置解析完整路径,再对最终输出路径做清理,确保其仍处于 restored/ 下层。哈希回退机制仅用于无法解析为合法文件路径的源名称。
  • 应用自动发现:macOS 上搜索 /Applications 和 ~/Applications;Windows 上搜索 %LOCALAPPDATA%\\Programs、%PROGRAMFILES%、%PROGRAMFILES(X86)%、%APPDATA%。若发现多个匹配项,脚本将退出并列出全部候选 —— 用户需重新运行并指定绝对路径。Linux 或其他平台不支持自动发现,须显式传入 --asar /path/to/app.asar。
  • 安全性 —— 脚本禁止向根目录 /、用户主目录(直接)或当前工作目录写入;亦禁止向已存在且非空的输出目录写入,除非启用 --force。
  • 无需全局安装 —— @electron/asar 和 prettier 通过 npx -y 动态解析。首次运行因需缓存依赖而较慢。

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

0

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习