electron js如何对源码进行混淆和保护源码

How to perform obfuscation of source code and protect source in electron js

我最近使用 electron 框架开发了一个应用程序,在阅读了与电子 javascript 代码相关的安全问题后,现在担心源代码保护。

我的意思是即使应用程序是为生产而构建的,也可以对代码进行逆向工程。我的应用程序包含许多重要信息,例如用于自动更新的 GitHub Private Token 等等。

我刚刚经历了很多 SO post 但没有找到完美的答案所以解决了这个问题。 javascript 代码或源代码保护的混淆不能用 Electron 实现吗?然而,混淆并不能完全保护代码,但它会使逆向工程变得复杂。如果有解决方法,请告诉我。我在electron的安全相关的post里面没找到超过tl;dr的。

我通过 obfuscator 找到了一种混淆方法,但似乎需要手动混淆,并且没有像 NW.js 中那样的源代码保护,有没有更好的方法来实现它?

我在 Medium post 上发现了一些有助于混淆的东西。但没有找到任何关于源代码保护的信息。

tl;dr You can and it is not worth the effort. Just pack your source into a asar file, it keeps most people away from it.

Long awnser:

  • Use the asar option when building your app.
  • Obfuscating the code with a uglyfier.
  • Use WASM
  • Language bindings to grab your data from a compiled format
    • neonjs for Rust
    • edge-js for C#
    • N-API, NAN for C/C++

Otherwise your files are scripts, all these steps only slow down a attacker (Tactic of many defenses), but they will not prevent them from accessing them. The devTools are fairly easy to get opened and people will be able to read the code in some way, shape or form. And if someone gets your Obfuscated code it is simple to reconstruct what is happening (see here for reference: https://www.youtube.com/watch?v=y6Uzinz3DRU)

If you want to protect yourself from code manipulation, there are better ways to do it. Like Hashing, Context Isolation etc. electron has a whole chapter on the matter.

https://github.com/electron/electron/blob/master/docs/tutorial/security.md

如果您指的是出于某种原因您必须在客户端拥有的代码,那么混淆绝对有帮助。没有无法克服的混淆之类的东西;但是,它可以将去混淆的成本提高到攻击者不值得的程度。

OWASP Mobile Top 10 2016-M9-Reverse Engineering mentions this: "In order to prevent effective reverse engineering, you must use an obfuscation tool". Then you also may benefit from runtime self-protection, which you can also find on the OWASP list: "The mobile app must be able to detect at runtime that code has been added or changed from what it knows about its integrity at compile time. The app must be able to react appropriately at runtime to a code integrity violation".

在比较不同的混淆器时,检查它们是否提供支持和文档并确保其背后的公司不会添加恶意软件并将其隐藏在混淆代码中至关重要。这就是免费混淆器经常不足的地方。

检查Jscrambler for an enterprise solution. They support Electron and the full list of their obfuscation transformations is available here

有一个名为 bytenode 的库,它允许您将 Javascript 文件转换为二进制文件,这样就没人可以读取它了。

https://www.npmjs.com/package/bytenode

首先在您的服务器和文件夹中安装 bytenode:

>npm i -g bytenode
>npm i bytenode

创建一个普通的 nodeJS 文件,其中包含以下代码。假设我们命名以下代码:ok.js

console.log('bytenode works');

然后,编译您的 javascript 代码。该命令将创建一个与您的文件同名的 .JSC 文件。

user@machine:~$ bytenode -c ok.js

然后,在主 JS 文件中,您将调用您的二进制文件,我们称它为 test.js:

const bytenode = require('bytenode'); 
const myFile=require('./ok.jsc'); 
myFile;

保存。

然后,您将调用test.js: 节点test.js 来测试它。做一个 "cat ok.jsc" 看看它真的是一个二进制文件,没有人能看到你的代码。您可以将原始的普通测试 js 文件移动到另一个位置。

您可以使用 bytenode,如 Nicolas Guérinet 的回答所述。

但是,当您尝试在您的电子项目中使用它时,bytenode CLI 生成的二进制文件会给您 运行时间错误。该错误将显示如下内容:

"Invalid or incompatible cached data (cachedDataRejected)"

要使二进制文件与 electon 一起工作,它必须由 electron 本身生成。

以下是如何让它工作:

假设您想在典型的电子项目中保护 main.js。

安装bytenode

npm i bytenode

将 main.js 重命名为其他名称,比如 temp.js。

使用以下代码创建一个新的 main.js:

const { app, BrowserWindow } = require('electron')

function createWindow() {
    // Create the browser window.
    mainWindow = new BrowserWindow({
        width: 400,
        height: 200
    })

    //use bytenode to convert js files to jsc
    const bytenode = require("bytenode");
    let compiledFilename = bytenode.compileFile({
        filename: './temp.js',
        output: './main.jsc'
    });
    //convert other Node.js files as required
}

app.whenReady().then(() => {
    createWindow()
})

现在 运行 您的电子项目。当空白 window 出现时,查看您的项目目录,您将找到 main.jsc 文件。

将您的 main.js 更改为以下三行代码:

const bytenode = require('bytenode'); 
const myFile = require('./main.jsc'); 
myFile;

从您的项目中删除您的 nodejs 源文件 (temp.js) 并构建您的项目。

您还可以在将代码转换为 jsc 之前缩小和混淆代码。

感谢https://github.com/mapleby for his posts at https://github.com/bytenode/bytenode/issues/63。 我已经调整了他的想法以使其发挥作用。

这将使某人更难对您的代码进行逆向工程,但仍有可能。