【问题标题】:Using UglifyJs on the whole Node project?在整个 Node 项目上使用 UglifyJs?
【发布时间】:2013-09-27 15:39:41
【问题描述】:

我需要尽可能地混淆我的源代码,所以我决定使用 uglifyjs2.. 现在我有嵌套目录的项目结构,我如何通过 uglifyjs2 运行它来完成整个项目而不是全部输入文件?

我不介意将整个项目压缩成一个文件或其他东西

【问题讨论】:

  • 为什么不编写一个 shell 脚本来遍历所有文件并为每个文件调用混淆器?
  • @WiredPrairie 我想将它们全部合并到一个文件中。我认为不同的混淆也会破坏每个文件对彼此的引用,因为文件的名称发生了变化
  • 如果将所有文件放在一起,如何让节点正常工作? (require('../mylib/lib1'))
  • @WiredPrairie 我希望 uglify/minify 工具能处理这个问题
  • 不,它不会解决这个问题。你可能想看看将 Grunt 与你的 javascript 文件的 uglify 任务一起使用。

标签: node.js obfuscation uglifyjs uglifyjs2


【解决方案1】:

我在我从事的一个项目中做过与此非常相似的事情。你有两个选择:

  1. 将文件保留在其目录结构中。

    这是迄今为止更简单的选择,但提供的混淆程度要低得多,因为对您的代码足够感兴趣的人基本上拥有文件逻辑组织的副本。

    攻击者可以简单地打印所有文件并重命名每个文件中的混淆变量名,直到他们了解发生了什么。

    为此,请使用fs.readdirfs.stat 递归遍历文件夹,读入每个.js 文件并输出损坏的代码。

  2. 将所有内容编译成一个 JS 文件。

    这对您来说实施起来要困难得多,但确实会使攻击者的生活更加困难,因为他们不再受益于您的项目组织。

    您的主要问题是协调您的 require 调用与不再存在的文件(因为现在所有内容都在同一个文件中)。

    我通过使用 Uglify 通过分析 ASTrequire 的调用来执行我的源代码的静态分析来做到这一点。然后我加载了所需文件的源代码并重复。

    加载完所有代码后,我将 require 调用替换为对自定义函数的调用,将每个文件的源代码包装在一个模拟 how node's module system works 的函数中,然后将所有内容进行修改并将其编译为单个文件。

    我的自定义 require 函数完成了节点 require 的大部分工作,除了它不是在磁盘中搜索模块,而是搜索包装函数。

不幸的是,我不能真正分享 #2 的任何代码,因为它是专有项目的一部分,但要点是:

  • 使用 UglifyJS.parse 将源文本解析为 AST。
  • 使用TreeWalker访问AST的每个节点并检查是否

    node instanceof UglifyJS.AST_Call && node.start.value == 'require'
    

【讨论】:

    【解决方案2】:

    由于我刚刚完成了一个包含 80 多个文件的大型纯 Nodejs 项目,所以我遇到了与 OP 相同的问题。我至少需要为我的辛勤工作提供最低限度的保护,但 NPMjs 操作系统社区似乎没有涵盖这个非常基本的需求。撒盐伤JXCore包加密系统上周几个小时就被破解了所以回到混淆...

    所以我创建了完整的解决方案,处理文件合并、丑化。您也可以选择不合并指定的文件/文件夹。然后将这些文件复制到合并文件的新输出位置,并自动重写对它们的引用。

    NPMjs link of node-uglifier

    Github repo of of node-uglifier

    PS:如果人们愿意做出贡献,我会很高兴。这是小偷和像你这样努力工作的程序员之间的战争。加入我们的力量,增加逆向工程的痛苦!

    【讨论】:

      【解决方案3】:

      uglifyjs2 本身不支持此功能。

      考虑使用webpack 将您的整个应用打包成一个缩小的.js 文件,不包括node_moduleshttp://jlongster.com/Backend-Apps-with-Webpack--Part-I

      【讨论】:

      • 这是现在要走的路。使用 webpack 打包你的文件。最新版本包括 terser-webpack-plugin,可用于丑化您的代码。另一个有用的链接:npmjs.com/package/webpack-node-externals
      【解决方案4】:

      我也有同样的需求——为此我创建了node-optimizegrunt-node-optimize

      https://www.npmjs.com/package/grunt-node-optimize

      【讨论】:

      • 我不使用 Gulp,它对我来说不太直观。但是您应该能够将 node-optimize 包装在 gulp 库中。如果你这样做了 - 我会在 node-optimize 的自述文件中添加一个关于它的注释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      相关资源
      最近更新 更多