electron 代码保护

849 阅读2分钟

保护electron代码有很多思路, 例如默认的electron会将代码打包为asar格式, 这虽然对客户不可见, 但对稍有编程基础的人来说都是透明的.

然后我们可能会想到简单的代码做uglify处理, 以减少代码的可读性, 但对于想要破解你软件的人来说只需稍微花点精力即可.

再来我们可能会想到node的addon, 甚至是改写electron源码来让核心代码在执行前解密后执行. 但这需要对node和c++十分熟悉.

我们可以折中一下, 即降低实现成本, 又增加破解成本. 使用字节码就可以达到这样的效果.

本文使用工具 bytenode 来生成和加载字节码

bytenode命令行

bytenode 可以以命令行的形式安装, 并通过-c参数来将js编译为字节码形式(jsc), 编译完成后会生成同名的jsc文件. 并且bytenode命令可以直接运行jsc文件.具体参数见 bytenode文档

需要注意node的版本, 例如你的jsc是在v14版本下编译的得到的jsc, 在v15就不能用了

$ npm install -g bytenode
$ echo "console.log('ok')" > test.js
$ bytenode -c test.js
$ ls
test.js test.jsc
$ bytenode test.jsc
ok

用bytenode导出模块

上面只是简单使用了命令行, 并没有实际的用处. 我们需要将需要隐藏的核心代码导出给业务代码使用

// core.js
function coreFunction(){
    console.log("this is core function");
}
exports.coreFunction = coreFunction;
// main.js
require("bytenode") // 必须要引入bytenode, 其不仅暴露bytenode的接口还对环境进行了配置, 以使node能require字节码文件.
const {coreFunction} = require("./core.jsc")
coreFunction();
$ bytenode -c core.js
$ node main.js
"this is core function"

至此核心代码得到了一定的保护, 并可以方便的导入业务逻辑中进行使用, 但这对于electron还是存在问题.

electron所使用的node与我们正常安装使用的不同, 即使你安装了和electron所使用相同版本号的node所编译出来的jsc也不能在electron中使用, 所以我们需要在electron中进行编译. 具体例子可以参照 bytenode 中的example

注意事项

electron中的webview所使用的preload.js是独立的, 在其中要使用jsc的话需要再次require("bytenode")