9

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

我的意思是即使应用程序是为生产而构建的,也可以对代码进行逆向工程。我的应用程序包含许多关键信息,例如GitHub Private TokenAutoUpdate 等等。

我刚刚浏览了很多 SO 帖子,但没有找到完美的答案,所以解决了这个问题。使用电子无法混淆javascript代码或源代码保护?然而,混淆并不能完全保护代码,但它会使逆向工程变得复杂。如果有解决方法,请告诉我。我没有tl;dr在电子的安全相关帖子中找到更多信息。

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

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

4

4 回答 4

12

有一个名为 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: node test.js 对其进行测试。做一个“cat ok.jsc”看看它真的是一个二进制文件,没有人看不到你的代码。您可以将原始纯测试 js 文件移动到另一个位置。

于 2019-12-11T10:51:40.257 回答
9

tl; dr 你可以,但不值得努力。只需将您的源代码打包到一个asar文件中,它就可以让大多数人远离它。

长遮阳篷:

  • asar在构建应用程序时使用该选项。
  • 用丑陋的东西混淆代码。
  • 使用 WASM
  • 从编译格式中获取数据的语言绑定
    • 用于 Rust 的 neonjs
    • 用于 C# 的 edge-js
    • N-API,用于 C/C++ 的 NAN

否则你的文件是脚本,所有这些步骤只会减慢攻击者的速度(许多防御策略),但它们不会阻止他们访问它们。devTools 相当容易打开,人们将能够以某种方式、形状或形式阅读代码。如果有人得到你的混淆代码,很容易重建正在发生的事情(请参阅此处以供参考: https ://www.youtube.com/watch?v=y6Uzinz3DRU )

如果你想保护自己免受代码操纵,有更好的方法来做到这一点。像散列、上下文隔离等一样,电子有一整章讨论这个问题。

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

于 2019-09-26T05:24:58.880 回答
7

您可以使用提到的 bytenode 是 Nicolas Guérinet 的回答。

但是,当您尝试在电子项目中使用 bytenode CLI 生成的二进制文件时,会出现运行时错误。错误会说如下:

"Invalid or incompatible cached data (cachedDataRejected)"

要使二进制与电子一起工作,它必须由电子本身生成。

以下是如何让它工作:

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

安装字节节点

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()
})

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

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

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

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

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

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

这将使某人对您的代码进行逆向工程变得更加困难,但它仍然是可能的。

于 2021-08-09T10:38:43.307 回答
1

如果您指的是由于某种原因必须在客户端拥有的代码,那么混淆肯定会有所帮助。没有什么是无法战胜的混淆。但是,它可能会将去混淆的成本提高到对攻击者来说不值得的程度。

OWASP Mobile Top 10 2016-M9-Reverse Engineering提到: “为了防止有效的逆向工程,你必须使用混淆工具”。然后你也可以从运行时自我保护中受益,你也可以在OWASP 列表中找到它:“移动应用程序必须能够在运行时检测到代码已经被添加或更改,而不是它在编译时知道的完整性。应用程序必须能够在运行时对违反代码完整性的行为做出适当的反应”。

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

检查Jscambler以获取企业解决方案。他们支持 Electron,他们的混淆转换的完整列表可以在这里找到

于 2019-10-02T16:19:54.480 回答