如何在电子js中对源代码进行混淆和保护源代码

Kir*_*iya 7 javascript security obfuscation code-security electron

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

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

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

我通过obfuscator找到了一种混淆方法,但似乎它需要手动混淆,并且没有更多关于源代码保护的信息,例如NW.js有没有更好的方法来实现它?

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

A.J*_*.J. 13

您可以使用 bytenode,如 Nicolas Gu\xc3\xa9rinet\ 的答案所述。

\n

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

\n
"Invalid or incompatible cached data (cachedDataRejected)"\n
Run Code Online (Sandbox Code Playgroud)\n

为了使二进制能够与电子一起工作,它必须由电子本身产生。

\n

以下是让它发挥作用的方法:

\n

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

\n

安装字节节点

\n
npm i bytenode\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
const { app, BrowserWindow } = require(\'electron\')\n\nfunction createWindow() {\n    // Create the browser window.\n    mainWindow = new BrowserWindow({\n        width: 400,\n        height: 200\n    })\n\n    //use bytenode to convert js files to jsc\n    const bytenode = require("bytenode");\n    let compiledFilename = bytenode.compileFile({\n        filename: \'./temp.js\',\n        output: \'./main.jsc\'\n    });\n    //convert other Node.js files as required\n}\n\napp.whenReady().then(() => {\n    createWindow()\n})\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
const bytenode = require(\'bytenode\'); \nconst myFile = require(\'./main.jsc\'); \nmyFile;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

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

\n


Nic*_*net 10

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

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

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

>npm i -g bytenode
>npm i bytenode
Run Code Online (Sandbox Code Playgroud)

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

console.log('bytenode works');
Run Code Online (Sandbox Code Playgroud)

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

user@machine:~$ bytenode -c ok.js
Run Code Online (Sandbox Code Playgroud)

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

const bytenode = require('bytenode'); 
const myFile=require('./ok.jsc'); 
myFile;
Run Code Online (Sandbox Code Playgroud)

保存。

然后,您将调用 test.js: node test.js 对其进行测试。做一个“cat ok.jsc”,看看它真的是一个二进制文件,没有人看不到你的代码。您可以将原始纯测试 js 文件移动到另一个位置。


Vis*_*iya 8

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

长芒:

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

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

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

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


小智 1

如果您指的是出于某种原因必须在客户端使用的代码,那么混淆肯定会有所帮助。没有什么事情是无法克服的。然而,它可能会将反混淆的成本提高到攻击者不值得的程度。

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

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

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