先看一下项目结构和 package.json:现在完整评估:


打包发布方案

你面临的现实

先说不好的消息: Electron 应用 100% 防反编译是做不到的。Electron 的本质是把 Node.js + Chromium 打包在一起,JS 源码必须能被 V8 引擎读取才能运行,这是架构层面的限制,没有绕过的方法。

能做到的是:让破解成本足够高,让普通人和中等技术水平的人放弃。


两层防护方案

第一层:ASAR 打包(基础必做)

你的 package.jsonbuild: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.htmlappstore/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.htmlappstore/index.html 的内联 <script> 自动提取、混淆、写回
  • tailwindcss.js 等第三方库跳过,不影响运行且加快构建

层3 — 完整性校验integrity-check.js):

  • 打包时自动计算混淆后 index.js 的 SHA256,写入 package.jsonbuildHash
  • 程序每次启动时重新计算并比对,文件被篡改则弹窗报错并退出
  • 开发时(npm startbuildHash 为空,自动跳过校验,不影响调试

是的,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 安装包,这样更专业。需要的话可以帮你配置。