解包 app.asar 后只看到”部分资源”,通常不是工具有问题,而是资源本来就不全在 asar 里。
app.asar.unpacked 目录
很多 Electron 应用把资源拆成两部分:
resources/
├─ app.asar ← 打包进归档的前端代码
└─ app.asar.unpacked ← 不打包,直接放文件系统
不能放进 asar 的资源通常在 unpacked:
.node原生模块dll、exe二进制- 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/.binV8 字节码(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