我需要尽可能地模糊我的源代码,所以我决定使用uglifyjs2 ..现在我有项目结构有嵌套目录,我如何可以通过uglifyjs2运行它来完成整个项目而不是给它所有的输入文件?
我不介意如果将整个项目缩小成单个文件或其他东西
解决方法
我在一个项目中做了非常类似的事情.你有两个选择:
>将文件保留在其目录结构中.
这是迄今为止更容易的选项,但是提供了更低级别的混淆,因为在您的代码中有足够的兴趣基本上具有文件逻辑组织的副本.
攻击者可以简单地漂亮打印所有文件,并重命名每个文件中的模糊变量名,直到他们了解发生了什么.
为此,请使用fs.readdir和fs.stat递归地浏览文件夹,读取每个.js文件并输出被破坏的代码.
>将所有内容编译成单个JS文件.
这对您来说更难实施,但是确实使攻击者的生活变得更加困难,因为他们不再受益于项目的组织.
您的主要问题是将您的require调用与不再存在的文件进行协调(因为所有内容现在都在同一个文件中).
我通过使用Uglify通过分析AST的呼叫来执行静态分析我的源代码.然后我加载所需文件的源代码并重复.
一旦所有的代码被加载,我用一个自定义函数的调用替换了require调用,将每个文件的源代码包装在一个模拟how node’s module system works的函数中,然后把所有的代码都编译成一个文件.
我的自定义需求功能大部分是节点需要的,除了搜索磁盘的模块,而是搜索包装器函数.
不幸的是,由于它是专有项目的一部分,因此我无法真正共享#2的代码,但主旨是:
>使用UglifyJS.parse
将源文本解析为AST.
>使用TreeWalker
访问AST的每个节点,并检查是否
node instanceof UglifyJS.AST_Call && node.start.value == 'require'