• electron-vite:轻松保护你的 Electron 源代码


    electron-vite 是一个新型 Electron 开发构建工具,旨在为 Electron 提供更快、更精简的开发体验。

    源代码保护

    背景

    无法保护 Electron 源代码,是很多开发者提及最多的问题之一。我们都知道 Electron 使用 javascript 来构建桌面应用程序,这使得黑客很容易对我们的应用程序进行进行解包、修改逻辑破解商业化限制、重新打包,再重新分发破解版。

    解决方案

    要想真正解决问题,除了把所有商业化逻辑做到服务端,我们还需要对代码进行加固,避免解包、篡改、二次打包、二次分发。

    主流方案:

    1. Uglify / Obfuscator:通过对 JS 代码进行丑化和混淆,尽可能降低其可读性。

    2. Native 加密:通过 XOR 或 AES 对构建产物进行加密,封装到 Node Addon 中,并在运行时由 JS 解密。

    3. ASAR 加密:将 Electron ASAR 文件进行加密,并修改 Electron 源代码,在读取 ASAR 文件之前对其解密后再运行。

    4. V8 字节码: 通过 Node 标准库里的 vm 模块,可以从 script 对象中生成其缓存数据(参考)。该缓存数据可以理解为 v8 的字节码,该方案通过分发字节码的形式来达到源代码保护的目的。

    方案比较:

    -Obfuscator 混淆Native 加密ASAR 加密V8 字节码
    解包容易
    篡改容易容易中等
    可读性容易容易容易
    二次打包容易容易容易容易
    接入成本中等
    保护强度中等中等
    目前,使用 v8 字节码的解决方案似乎是最好的解决方案。

    如何实现

    什么是 V8 字节码

    我们可以理解,V8 字节码是 V8 引擎在解析和编译 JavaScript 后产物的序列化形式,它通常用于浏览器内的性能优化。所以如果我们通过 V8 字节码运行代码,不仅能够起到代码保护作用,还对性能有一定的提升。

    具体实现

    electron-vite 受 bytenode 启发,具体实现:

    • 实现一个插件 bytecodePlugin 来解析构建产物,并确定是否编译为字节码。

    • 启动 Electron 进程将构建产物编译成 .jsc 文件,并确保生成的字节码可以在 Electron 的 Node 环境中运行。

    • 自动生成字节码 Loader(加载器),让 Electron 能正常加载字节码模块。

    • 支持开发者自由决定编译哪些块。

    此外,electron-vite 还解决了一些 bytenode 无法解决的问题:

    • 修复了异步箭头函数可能导致 Electron 应用程序崩溃的问题。

    如何使用

    开启字节码插件保护源代码

    启用 bytecodePlugin 插件:

    `import { defineConfig, bytecodePlugin } from 'electron-vite'
    
    export default defineConfig({
      main: {
        plugins: [bytecodePlugin()]
      },
      preload: {
        plugins: [bytecodePlugin()]
      },
      renderer: {
        // ...
     }
    })` 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    是不是非常简单呢?

    自定义保护

    例如,只要保护 src/main/foo.ts :

    ├──src
    │  ├──main
    │  │  ├──index.ts
    │  │  ├──foo.ts
    │  │  └──...
    └──...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以像下面一样修改配置文件:

    `import { defineConfig, bytecodePlugin } from 'electron-vite'
    
    export default defineConfig({
      main: {
        plugins: [bytecodePlugin({ chunkAlias: 'foo' })],
        build: {
          rollupOptions: {
            output: {
              manualChunks(id): string | void {
                if (id.includes('foo')) {
                  return 'foo'
                }
              }
            }
          }
        }
      },
      preload: {
        // ...
      },
      renderer: {
        // ...
      }
    })` 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    常见疑问

    对代码组织和编写的影响?

    目前发现字节码方案对代码的唯一影响,是 Function.prototype.toString() 方法无法正常使用,原因是源代码并不跟随字节码分发,因此取不到函数的源代码。

    对程序性能是否有影响?

    对代码执行性能没有影响,略有提升。

    对程序体积的影响?

    对于只有几百 KB 的 Bundle 来说,字节码体积会有比较明显的膨胀,但是对于 2M+ 的 Bundle 来说,字节码体积没有太大的区别。

    代码保护强度如何?

    目前来说,还没有现成的工具能够对 v8 字节码进行反编译,因此该方案还是还是比较可靠且安全的。

    更多功能

    electron-vite 还有很多好用功能:

    • 预配置:针对 Electron 预先配置,不用担心配置问题。

    • 热替换 HMR:渲染器支持模块热替换(HMR)。

    • 热重载:主进程和预加载脚本支持热重载。

    • IDE调试:非常容易在 IDE 中调试,例如 vscode 或 webstorm。

    • 开箱即用:开箱即用支持 Typescript、Vue、React、Svelte 和 SolidJS 等

  • 相关阅读:
    基于Java毕业设计云盘系统修改密码演示2021源码+系统+mysql+lw文档+部署软件
    QT基础入门【QSS】继承、命名空间中的小部件、QObject 属性介绍
    kafka集群开启SASL/Kerberos安全认证
    【100天精通Python】Day57:Python 数据分析_Pandas数据描述性统计,分组聚合,数据透视表和相关性分析
    理解C#中对象的浅拷贝和深拷贝
    重学java基础----多线程
    计算机毕业设计之java+springboot基于vue的数码论坛系统设计与实现
    k8s--基础--28.3--ceph--集群安装
    1.3自然语言的分布式表示-word2vec
    外键必须是另一个表的主键吗 ?
  • 原文地址:https://blog.csdn.net/m0_70748381/article/details/126987412