我需要尽可能地混淆我的源代码,所以我决定使用 uglifyjs2 .. 现在我有了包含嵌套目录的项目结构,我如何通过 uglifyjs2 运行它来完成整个项目,而不是给它所有的输入文件?
我不介意它是否将整个项目缩小为单个文件或其他东西
我需要尽可能地混淆我的源代码,所以我决定使用 uglifyjs2 .. 现在我有了包含嵌套目录的项目结构,我如何通过 uglifyjs2 运行它来完成整个项目,而不是给它所有的输入文件?
我不介意它是否将整个项目缩小为单个文件或其他东西
我在我从事的一个项目中做过与此非常相似的事情。你有两个选择:
将文件保留在其目录结构中。
这是迄今为止更简单的选择,但提供的混淆程度要低得多,因为对您的代码足够感兴趣的人基本上拥有文件逻辑组织的副本。
攻击者可以简单地打印所有文件并重命名每个文件中的混淆变量名,直到他们了解发生了什么。
为此,请使用fs.readdir
和fs.stat
递归遍历文件夹,读入每个 .js 文件并输出损坏的代码。
将所有内容编译成一个 JS 文件。
这对您来说实施起来要困难得多,但确实会使攻击者的生活更加困难,因为他们不再受益于您的项目组织。
您的主要问题是将您的require
调用与不再存在的文件协调起来(因为现在所有内容都在同一个文件中)。
为此,我使用 Uglify 通过分析AST以调用require
. 然后我加载所需文件的源代码并重复。
加载完所有代码后,我将require
调用替换为对自定义函数的调用,将每个文件的源代码包装在一个模拟节点模块系统工作方式的函数中,然后将所有内容进行修改并将其编译为单个文件。
我的自定义 require 函数完成了 node 的 require 所做的大部分工作,除了它不是在磁盘中搜索模块,而是搜索包装函数。
不幸的是,我不能真正分享 #2 的任何代码,因为它是专有项目的一部分,但要点是:
UglifyJS.parse
。使用TreeWalker
访问AST的每个节点并检查是否
node instanceof UglifyJS.AST_Call && node.start.value == 'require'
由于我刚刚在 80 多个文件中完成了一个巨大的纯 Nodejs 项目,因此我遇到了与 OP 相同的问题。我至少需要为我的辛勤工作提供最低限度的保护,但 NPMjs 操作系统社区似乎没有涵盖这个非常基本的需求。加盐到伤害 JXCore 包加密系统上周在几个小时内被破解所以回到混淆......
所以我创建了完整的解决方案,处理文件合并、丑化。您也可以选择不合并指定的文件/文件夹。然后将这些文件复制到合并文件的新输出位置,并自动重写对它们的引用。
PS:如果人们能做出贡献,我会很高兴。这是小偷和像你这样努力工作的程序员之间的战争。让我们加入我们的力量,增加逆向工程的痛苦!
uglifyjs2 本身不支持此功能。
考虑使用webpack将您的整个应用程序打包成一个缩小的 .js 文件,不包括node_modules
:
http ://jlongster.com/Backend-Apps-with-Webpack--Part-I
我也有同样的需求——为此我创建node-optimize
了grunt-node-optimize
.