先看一下项目结构和 package.json:现在完整评估:
打包发布方案
你面临的现实
先说不好的消息: Electron 应用 100% 防反编译是做不到的。Electron 的本质是把 Node.js + Chromium 打包在一起,JS 源码必须能被 V8 引擎读取才能运行,这是架构层面的限制,没有绕过的方法。
能做到的是:让破解成本足够高,让普通人和中等技术水平的人放弃。
两层防护方案
第一层:ASAR 打包(基础必做)
你的 package.json 里 build:win 命令没有加 --asar,这是最大的漏洞。现在打出来的包,源码是裸露的文件夹,任何人解压就能看到。
# 改成这样
electron-packager . --overwrite --asar --icon=./icons/winapp.png --out=dist/ --ignore='^/dist$'加了 --asar 之后,所有 programs/ 的代码会被打进一个 app.asar 文件,普通用户无法直接打开。但是有技术的人可以用 asar extract 命令解出来,所以这只是第一道门。
第二层:代码混淆(核心保护)
在打包前,用工具把 JS 代码变成人类无法读懂的形式。推荐 javascript-obfuscator:
npm install --save-dev javascript-obfuscator混淆后的代码长这样,即使解包出来也没法读:
// 原来
function saveProject(project) {
writeFileSync(path, JSON.stringify(project));
}
// 混淆后
var _0x3f2a=['writeFileSync','stringify'];
(function(_0x1a2b,_0x3c4d){...}(_0x3f2a,0x1b3));
function _0x4f1c(_0x2a3b,_0x1c2d){...}建议的混淆配置(平衡保护强度和运行性能):
// obfuscator.config.js
module.exports = {
compact: true,
controlFlowFlattening: true, // 控制流混淆
controlFlowFlatteningThreshold: 0.5,
deadCodeInjection: true, // 注入无效代码干扰分析
deadCodeInjectionThreshold: 0.2,
identifierNamesGenerator: 'hexadecimal', // 变量名改成 _0x 格式
renameGlobals: false, // 全局变量不改名(防止 Node API 调用出错)
stringArray: true, // 字符串提取到数组
stringArrayEncoding: ['base64'], // 字符串 base64 编码
stringArrayThreshold: 0.8,
splitStrings: true, // 字符串拆分
unicodeEscapeSequence: false,
target: 'node', // 针对 Node.js 环境
};注意: index.html、appstore/index.html 这类前端文件里的 <script> 内联 JS 也需要混淆,或者抽离成单独的 .js 文件再混淆。HTML 文件本身无法被 ASAR 有效保护。
第三层:完整性校验(防篡改)
在主进程启动时,校验关键文件的哈希值:
// 在 index.js 最开头加
const crypto = require('crypto');
const fs = require('fs');
const EXPECTED_HASH = 'abc123...'; // 打包时预先计算好写死
function verifyIntegrity() {
const content = fs.readFileSync(__filename);
const hash = crypto.createHash('sha256').update(content).digest('hex');
if (hash !== EXPECTED_HASH) {
// 文件被篡改,拒绝启动
require('electron').app.quit();
}
}
verifyIntegrity();推荐的完整打包流程
开发代码
↓
① javascript-obfuscator 混淆 programs/index.js 和其他 JS
↓
② electron-packager --asar 打包
↓
③ electron-builder 生成安装包(.exe / .dmg)并签名
↓
发布代码签名 也很重要——Windows 会对未签名的 exe 弹"未知发布者"警告,用户容易不信任或被杀毒软件拦截。需要购买代码签名证书(约 $200-500/年)。
实际防护效果
| 攻击者水平 | 无保护(现状) | 加 ASAR | 加混淆 | 加混淆+校验 |
|---|---|---|---|---|
| 普通用户 | 直接看到源码 | 挡住 | 挡住 | 挡住 |
| 有基础的开发者 | 直接看 | 一条命令解包 | 看不懂 | 看不懂且改了跑不起来 |
| 有经验的逆向工程师 | 直接看 | 一条命令 | 数小时~数天 | 数天~数周 |
结论:加 ASAR + 混淆后,对 99% 的人有效。 想要更高保护,可以考虑把核心逻辑移到云端服务器运行,客户端只做 UI——这是防反编译最彻底的方案,但需要重构架构。
先看清楚项目完整目录结构:好,现在对项目结构完全清楚了,开始配置:
需要处理的文件:
programs/index.js— 主进程(Node.js,需混淆)programs/tabConfig.js/utils.js/preload.js/preload-nonBridge.js/debug-preload.js— 配套 JS(需混淆)programs/index.html— 主窗口(有 39KB 内联 JS,需提取后混淆)programs/iapp/appstore/index.html— 应用市场(有 221KB 内联 JS,需提取后混淆)programs/res/tailwindcss.js— 第三方库(不混淆)压缩包里包含以下文件,解压后按目录层级覆盖到项目根目录即可:
build_release/
├── build.js ← 放项目根目录
├── integrity-check.js ← 放项目根目录
├── package.json ← 替换原有 package.json
├── 打包说明.md ← 阅读
└── programs/
├── index.js ← 替换(首行加了 integrity-check)
├── preload.js ← 替换(含之前所有补丁)
└── iapp/appstore/
└── index.html ← 替换(含之前所有补丁)之后每次打包只需 3 步
# 第一次:安装构建工具(只需一次)
npm install
# 打 Windows 包
npm run build:win
# 打 Linux 包
npm run build:linux三层防护的工作方式
层1 — ASAR 封装:所有代码打进 app.asar 单文件,普通用户无法直接查看任何源码。
层2 — JS 混淆(javascript-obfuscator):
index.js/tabConfig.js/utils.js用 Node 配置混淆preload.js等渲染进程脚本用 Browser 配置混淆,额外开启selfDefending(格式化后拒绝运行)index.html和appstore/index.html的内联<script>自动提取、混淆、写回tailwindcss.js等第三方库跳过,不影响运行且加快构建
层3 — 完整性校验(integrity-check.js):
- 打包时自动计算混淆后
index.js的 SHA256,写入package.json的buildHash - 程序每次启动时重新计算并比对,文件被篡改则弹窗报错并退出
- 开发时(
npm start)buildHash为空,自动跳过校验,不影响调试
是的,npm run build:win 一条命令走完全部流程,输出在 dist/SimONE-win32-x64/ 目录里,是一个可以直接运行的完整 Windows 程序。
整个过程自动完成:
npm run build:win
│
▼
① 复制源码到 .build_tmp/(排除 .git、dist、*.bak)
│
▼
② 混淆 JS 文件
· programs/index.js
· programs/tabConfig.js
· programs/utils.js
· programs/preload.js
· programs/preload-nonBridge.js
· programs/debug-preload.js
· programs/iapp/appstore/preload.js
│
▼
③ 提取 HTML 内联脚本混淆后写回
· programs/index.html(39KB 脚本)
· programs/iapp/appstore/index.html(221KB 脚本)
│
▼
④ 计算 SHA256 写入 package.json
│
▼
⑤ electron-packager .build_tmp --asar → dist/SimONE-win32-x64/
│
▼
⑥ 删除 .build_tmp/
输出:dist/SimONE-win32-x64/
├── SimONE.exe ← 双击运行
├── resources/
│ └── app.asar ← 所有代码在这里,已混淆+封装
├── electron.exe
└── ...(Electron 运行时)用户拿到的就是 SimONE-win32-x64 这个文件夹,或者你可以再用 NSIS / Inno Setup 把它制作成一个 .exe 安装包,这样更专业。需要的话可以帮你配置。


