从任意已安装的 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 平台。
用户输入工具
当本技能向用户发起提示时,请按以下工具选择规则执行(优先级由高到低):
- 优先使用运行时内置的用户输入工具 — 例如
AskUserQuestion、request_user_input、clarify、ask_user或其等效实现。 - 降级方案:若无此类工具,则以编号纯文本形式输出问题,并请用户针对每个问题回复对应编号或答案。
- 批量处理:若该工具支持单次调用中提交多个问题,则应合并所有适用问题为一次调用;若仅支持单问题调用,则按优先级顺序逐个提问。
下方出现的具体 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/。最值得关注的子目录取决于实际发现的内容:
- 若存在
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/ |
--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动态解析。首次运行因需缓存依赖而较慢。
热门AI工具
相关专题
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。
0
2026.10.22
PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.5万人学习
共6课时 | 54.7万人学习
