Electron源代码的终极加密保护方案——使用bytenode(包括不兼容错误的处理技巧)

来源:csdn博客 分类: 文章浏览史 发布时间:2021-09-07 16:45:49 最后更新:2021-09-07 浏览:1030
转载声明:
本文为摘录自“csdn博客”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2021-09-07 16:45:49

开发的东西比较多,但是很少写博客,除非遇到对自己帮助极大的经验技巧,就分享给大家,避免走弯路和陷入绝望

今天分享的是Electron项目源码在目前最佳的保护方案,传统的加密打包和混淆,毕竟是治标不治本,正如官方一群人讨论的那样,认为无论怎么打包,密钥还是在包里,所以根本办法还是要生成字节码,像其他硬编码语言那样,把破解的可能性只留给一小撮高手,而不是一个解包命令就能搞定。提到node生成字节码,许多人都会介绍v8提供的虚拟机模块做编译和加载,类似这个样子:

let fs = require('fs');
let vm = require('vm');

function gen_bytes(src_file,dst_file) {
    let data = fs.readFileSync(src_file);
    const script = new vm.Script(data, {
    produceCachedData: true
    });
    const bytes = script.cachedData;
    fs.writeFileSync(dst_file,bytes); 
}

function run_bytes(bin_file) {
    let code = fs.readFileSync(bin_file);
    const length = code.slice(8, 12).reduce(function (sum, number, power) { 
        return sum += number * Math.pow(256, power);
    });
    const anotherScript = new vm.Script(' '.repeat(length), {
        cachedData: code
    });
    anotherScript.runInThisContext(code);
}

gen_bytes('demo.js','demo');
run_bytes('demo');

但目前来看,在实际项目中,它的局限性较多,例如和主程序交互(往往大家是需要把加密的文件像普通js模块那样require进来使用)、异步操作和引用外部模块等(在字节码中使用require会提示未定义,这个issue在2015年就有人提了,今天最新版node仍然存在,当然他们是有自己的考虑,详情可见https://github.com/nodejs/node-v0.x-archive/issues/9211),后面两个问题对实用性是大打折扣,寻寻觅觅,最终发现了node字节码神器bytenode,它不仅使用简单,而且正符合我们通常的需求,即生成的字节码文件可以直接require进来当成普通node模块使用(这意味着我们开发时无需有任何顾虑,按照自己的设计写即可,最后把需要保密的库文件转换成字节码即可),用例如下:

生成字节码

require('bytenode').compileFile({
    filename: 'my_module.js'  //它会在源文件同一目录下生成同名jsc后缀的字节码文件
});

加载字节码文件

require('bytenode');//在引入字节码文件前先引入bytenode
let my_module = require('my_module.jsc');//引入jsc文件和加载普通模块无异,非常方便

//...开始愉快的使用my_module中的功能吧

但是在electron里使用时,大家大概率可能会在控制台遇到这样的报错“Invalid or incompatible cached data ...”,这个原因是你用bytecode编译js文件时使用的node环境和electron集成的node环境不兼容,我从苦于eletron没有好的加密措施到找到bytecode神器再到遇到这个问题,是从绝望到兴奋又到心灰意冷,外网上也看到一个人问类似的问题,但没人回答,幸运的是,我急中生智,我想既然在系统node环境里编译生成的不能用,下载一个和electron-node环境一致的node重装又麻烦,而且也不知道行不行(因为外网那个人就是说他编译用的node环境和electron-node版本是一致的,这让我没了重装node尝试的欲望),于是我打开electron的调试窗口,在控制台输入bytecode编译指令,再次生成了一个jsc文件,重新加载,一切OK,超级开心,遂记录下来分享给大家。

1楼 sTmWcysy
2022-03-20 14:22:04
e
php技术微信