关于 node.js 混淆,有没有办法?

2014-06-17 09:06:28 +08:00
 kurtis
请教各位牛人,一个问题 有没有较好的方案可以混淆 node.js程序。

条件:
1. 不是单个js文件,而是互相require引用的若干个js组成的一个package
2. 混淆或者大幅降低可读性即可,不需要加密(估计也无法加密)
3. 不接受 “没有办法” 或者 “为什么要混淆”之类的回答。

查阅了很多资料,国外也有人在讨论,方法千奇百怪,但几乎没有一个很靠谱的。

感谢先!!!
14876 次点击
所在节点    Node.js
27 条回复
iwege
2014-06-17 09:09:26 +08:00
貌似有编译成为native module的选项。

这是一个比较简单的做法,就是把自己的js code 作为一个字符串,然后等启动之后再注入到context里面。
andyhu
2014-06-17 09:41:32 +08:00
服务器端的也要混淆吗?我以前做前段的混淆都是用的一个java的jsa,感觉压缩率和混淆程度都不错,兼容性也好。但是这东西也有些问题,我自己下载到本地无法正常运行,只能用那个网页版本的一个一个手动的来混淆
livelazily
2014-06-17 09:45:12 +08:00
closure compiler 或者 uglifyjs 压缩过后的可读性已经很低啦,
kurtis
2014-06-17 10:32:15 +08:00
@iwege
@andyhu
@livelazily
感谢你们, 可是问题是:

1. uglifyjs混肴貌似只能针对局域成员,一旦跨引用就不能了。

2. 我还研究了node的vm模块,缺点是,沙盒配置很复杂,跨require引用时尤其

3. 还有类似eval的执行(也就是字符串注入执行),缺点是,一旦eval的加密后解密的明文,任何人可以console.log输出。

4. 一个台湾人写的叫做npk的模块,跨目录require时会有问题

期待更多的专业建议! 谢谢先!
rekey
2014-06-17 10:39:27 +08:00
我就看看,我不说话。
kurtis
2014-06-17 11:26:10 +08:00
昨天 那个啥 白搞了30天女友的帖子出来时,跟贴爆火,可是一旦讨论点像样的技术问题时,发现好孤单啊!!
juzai
2014-06-17 13:42:29 +08:00
iwege
2014-06-17 13:43:45 +08:00
@kurtis vm模块的context配置起来是很复杂... 执行效率有数据说明不是非常高。

上次我也是看到npk,不过项目里面没有用,因为不算是纯粹的node环境没有办法直接用。

我曾经问过一些人,他们说V8需要source code 进行优化。所以只能做一些核心代码的保护,最好的方法,还是用C++做native module,保护核心,其他的非核心的部分用JS。如果你不要source code的话,速度会降低很多。

Function的话有一种做法就是在某个时间段给函数用bind()方法可以创建一个native function, toString的时候得不到源码。只是这个在浏览器端防不住。
iwege
2014-06-17 13:47:18 +08:00
@juzai
@kurtis

JXcore 这个有看过,如果你可以换平台的话倒是可以考虑一下。
juzai
2014-06-17 13:51:37 +08:00
@iwege jxcore你用过吗,我也是刚看了这个帖子,去google了哈
ipconfiger
2014-06-17 13:58:01 +08:00
远程加载模块到本地执行后删掉源码自动删掉源码如何?
kurtis
2014-06-17 14:29:57 +08:00
@juzai 不错的理念,不过是闭源 第3方,万一有坑会死的很惨。
@iwege 谢谢建议,c++写一个扩展module的确是一个方法,但远不是完美的办法。

另外 google group上有人建议 开一个VMWARE Virtual APP出来,也是别有新意的,而且可以用于node以外的非源码公开发布。

还有什么更完美的吗!?
eas
2014-06-17 15:06:31 +08:00
VMWARE Virtual APP, 这个东西,可以直接作为磁盘被mount出来吧
hayeah
2014-06-17 15:41:44 +08:00
应该可以用 browerify 把所有相互依赖的 require 集成为一个单一文件,然后再用 uglify 去混淆。

browserify 会重写一些 nodejs 的全局对象 (e.g. process) 但我记得可以调掉那个功能。
jiangzhuo
2014-06-17 16:22:33 +08:00
在雲上部署的話 如果雲支持docker的話 打成docker包。。。
kurtis
2014-06-17 16:42:29 +08:00
@eas 可以使用用bitlock之类的 不登录无法解密的OS功能


@hayeah 谢谢这个我要研究一下,不过我试过即使打包在一起,uglify也不会混淆 接口方法和属性
例如下面的例子中: method 这个字眼 不会被混淆, A好像也不会, 是不是uglifyjs 有些参数可以?
function A() {
this.method=function() {}
}

var a= new A().method();

@jiangzhuo 残念,不在云上部署,在云上部署的话相对的不太需要混淆或加密。
eas
2014-06-18 02:26:01 +08:00
@kurtis bitblock 不能做没有硬件支持的系统盘加密
kurtis
2014-06-18 08:00:30 +08:00
有人提到的一种方法,但是问题也一样明显

// register extension
require.extensions[".jse"] = function (m) {
m.exports = MyNativeExtension.decrypt(fs.readFileSync(m.filename));
};

require("YourCode.jse");
liuyanghejerry
2014-06-22 22:29:00 +08:00
降低可读性不是很容易嘛,只要把注释去掉就行了
liuyanghejerry
2014-06-22 22:35:00 +08:00
代码可以用AST工具转成AST,或者其它你能想到的任何代码混淆、加密方式进行变换,然后另存下来,require自己的模块的时候把require封装一下,变为require_x,require别人的包的不要变。在新的require_x函数当中还原代码,再执行真正的require。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/117914

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX