Electron asar 解包:资源为什么只有一部分以及各类资源的位置

解包 app.asar 后只看到”部分资源”,通常不是工具有问题,而是资源本来就不全在 asar 里。

app.asar.unpacked 目录

很多 Electron 应用把资源拆成两部分:

resources/
├─ app.asar          ← 打包进归档的前端代码
└─ app.asar.unpacked ← 不打包,直接放文件系统

不能放进 asar 的资源通常在 unpacked

  • .node 原生模块
  • dllexe 二进制
  • ffmpeg
  • 大模型权重
  • WASM 文件
  • Chromium 扩展

解包命令:

npx asar extract app.asar out

查看归档内容:

npx asar list app.asar

运行时动态下载

很多 AI 软件、IDE 首次启动后会在线下载:

  • JS chunk
  • 模型权重
  • WASM 模块
  • 加密资源

这些完全不在 asar 里。常见存放位置:

# Windows
%AppData%\Roaming\应用名\   ← 配置、数据库、历史记录
%AppData%\Local\应用名\     ← 缓存、大文件、模型

webpack 打包合并

现代 Electron 应用几乎不会保留 src/pages/ 这样的目录结构,而是打成 bundle:

main.js
renderer.js
chunk.abc123.js

你以为”缺文件”,其实文件已经被合并进 bundle 了。搜索以下关键词确认:

webpackChunk
__webpack_require__

加密和混淆

部分商业应用会:

  • .jsc / .bin V8 字节码(bytenode),无法直接还原源码
  • webpack chunk 内字符串 XOR 混淆
  • 运行时解密:decrypt(buffer); eval(...) 拿到真正的代码

各类资源的位置速查

目标位置
前端源码(React/Vue)app.asar 解包后的 bundle
配置、token、sqlite%AppData%\Roaming\应用名
缓存、模型、大文件%AppData%\Local\应用名
原生模块、二进制app.asar.unpacked
内联图片bundle 里 base64 编码
关键 IPC 桥接逻辑preload.js

Electron 默认缓存目录

Cache/
Code Cache/     ← 可能有 V8 字节码缓存
GPUCache/
IndexedDB/      ← 配置、文档、AI 数据
Local Storage/
blob_storage/

完整逆向流程

# 1. 解包
npx asar extract app.asar out

# 2. 找 webpack 入口
grep -r "__webpack_require__" out/

# 3. 重点看 preload
# out/main/preload.js 或 dist-electron/preload.js

# 4. 如果有加密,搜解密关键词
grep -r "decrypt\|Buffer\|crypto\|atob" out/

# 5. 找用户数据
ls %AppData%\Roaming\应用名

常见真实目录结构

MyApp/
├─ resources/
│   ├─ app.asar
│   ├─ app.asar.unpacked/
│   │   ├─ native.node
│   │   └─ ffmpeg.dll
│   └─ ...
└─ locales/

AppData/Roaming/MyApp/
├─ IndexedDB/
├─ Local Storage/
├─ settings.json
└─ user.db