electron-vite:輕鬆保護你的 Electron 原始碼

語言: CN / TW / HK

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 位元組碼的解決方案似乎是最好的解決方案。

閱讀更多(來源):

  • Electron code protection solution based on Node.js Addon and V8 bytecode

如何實現

什麼是 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: {
// ...
}
})

執行效果:

是不是非常簡單呢?

自定義保護

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

.
├──src
│ ├──main
│ │ ├──index.ts
│ │ ├──foo.ts
│ │ └──...
└──...

可以像下面一樣修改配置檔案:

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: {
// ...
}
})

執行效果:

常見疑問

對程式碼組織和編寫的影響?

目前發現位元組碼方案對程式碼的唯一影響,是 Function.prototype.toString() 方法無法正常使用,原因是原始碼並不跟隨位元組碼分發,因此取不到函式的原始碼。

對程式效能是否有影響?

對程式碼執行效能沒有影響,略有提升。

對程式體積的影響?

對於只有幾百 KB 的 Bundle 來說,位元組碼體積會有比較明顯的膨脹,但是對於 2M+ 的 Bundle 來說,位元組碼體積沒有太大的區別。

程式碼保護強度如何?

目前來說,還沒有現成的工具能夠對 v8 位元組碼進行反編譯,因此該方案還是還是比較可靠且安全的。

更多功能

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

  • 預配置:針對 Electron 預先配置,不用擔心配置問題。

  • 熱替換 HMR:渲染器支援模組熱替換(HMR)。

  • 熱過載:主程序和預載入指令碼支援熱過載。

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

  • 開箱即用:開箱即用支援 Typescript、Vue、React、Svelte 和 SolidJS 等

-   E N D   -

3 6 0 W 3 C E C M A T C 3 9 L e a d e r 注和加