【问题标题】:How to Decompile Bytenode "jsc" files?如何反编译Bytenode“jsc”文件?
【发布时间】:2019-07-16 07:31:30
【问题描述】:

我刚刚看到了这个库ByteNode它和java的ByteCode一样,但是这是针对NodeJS的。

这个库将你的 JavaScript 代码编译成 V8 字节码,保护你的源代码,我想知道是否有反编译 byteNode,因此它不够安全。我想知道是因为我想使用这个库来保护我的源代码吗?

【问题讨论】:

    标签: node.js v8 bytecode decompiling


    【解决方案1】:

    TL;DR 它会提高对复制代码并试图将其作为自己的代码进行传递的人的门槛。它不会阻止一个敬业的人这样做。但保护您的作品的主要方式不是技术性的,而是合法的。


    该库将您的 JavaScript 代码编译成 V8 字节码,从而保护您的源代码...

    好吧,我们不知道它是 V8 字节码,但它在某些意义上是“编译”的。我们所知道的是,它通过内置的vm.Script.prototype.createCachedData API 创建了一个“代码缓存”,这正式只是一个缓存,用于加速第二次、第三次重新编译代码等. 理论上,您还应该将原始源代码作为字符串提供给the vm.Script constructor。但是,如果您深入研究 Node.js 的 vm.Script 和 V8,它似乎是某种编译形式的实际代码(无论是否实际 V8 字节码),并且您在运行时提供的代码字符串将被忽略。 (ByteNode 库在从代码缓存中运行代码时提供了一个虚拟字符串,因此很明显实际代码不是[总是?] 需要的。)

    我想知道是否有反编译 byteNode 因此它不够安全。

    当然,否则它将无用,因为 Node.js 将无法运行它。我没有找到已经存在的工具来执行此操作,但由于 V8 是开源的,因此大概可以找到必要的信息来为其编写一个反编译器,该反编译器输出有效的 JavaScript 源代码,然后有人可以尝试理解.

    用它做实验,局部变量名似乎丢失了,尽管函数名没有。评论似乎丢失了(这可能不像看起来那么明显,因为Function.prototype.toString 需要返回原始源文本或合成版本 [details])。

    因此,如果您通过压缩器(特别是重命名函数)运行代码,然后通过 ByteNode 运行它(或者自己使用 vm.Script 来运行,ByteNode 是一个相当薄的包装器),它将是 有人将其反编译成类似于源代码的东西是可行的,但是该源代码将很难理解。这与发布 Java 类文件非常相似,可以反编译(在 JDK 中甚至有一个标准工具可以做到这一点,javap),只是 Java 类文件的格式有很好的文档记录并且不会从一个点版本到下一个版本(尽管它们可以从一个主要版本更改为另一个;新版本始终支持旧格式),而此数据的格式没有记录(尽管它是一个开源项目)并且 可能会从一个点版本更改为下一个版本。

    某些更改,例如更改版权信息,可能相当容易对所述源代码进行。更有意义的改变会更难。

    请注意,代码缓存似乎具有校验和或其他类似的完整性机制,因为直接编辑 .jsc 文件以将文字字符串中的一个字母换成另一个字母会导致代码缓存无法加载。因此,篡改它的人(例如,更改版权声明)要么需要走反编译/重新编译路线,要么深入 V8 源代码以了解如何更正完整性检查。


    从根本上说,保护您的作品的方法是确保您已将所有相关通知放在相关位置,以便明确复制它是侵犯版权的事实,然后在您发现时寻求法律追索关于有人冒充自己的。

    【讨论】:

    • 基本上 +1。一条评论:ByteNode 方法故意/故意破坏Function.prototype.toString,它会返回垃圾。如果您的代码依赖于F.p.toString,那么您不能使用 ByteNode,句号。此外,缓存数据中没有版权声明,因此如果有人想将那个作为自己的出售,他们甚至不需要篡改它。
    • @jmrk :-) 我假设在代码中的字符串文字中某处(当然,在缓存中)会有版权声明,用于显示应用程序何时启动,或者响应--help,或者只是让它在代码中的某个地方(我总是在二进制分发应用程序中这样做)。关于Function.prototype.toString 的好点。 (我一直认为依赖它是一种反模式,但它现在被指定了......)
    • 100% 同意您的观点,只是当人们说“寻求您的法律追索权”时会感到沮丧。如果你是一家大公司,这很好,但如果你不是,那就太贵了。对于试图突破界限和保护代码的单个开发人员来说,走合法路线很糟糕。我遇到过类似的情况,他们告诉您的只是联系公司并告诉他们删除代码,否则您将寻求法律诉讼,这是您唯一真正的辩护,除非您有大量的钱可以花在律师和法律费用上。大公司总是在这种情况下获胜。
    【解决方案2】:

    有什么办法

    你可以在这里得到一百个回答说“我不知道方法”,但这仍然不能保证没有一个。

    不够安全

    什么足够安全?您的部署方案是什么?您要防御什么样的场景/攻击?

    FWIW,我不知道“反编译”V8 字节码的现有工具(即生成具有相同行为的 JavaScript 源代码)。也就是说,考虑到字节码是源代码的相当简单的翻译,如果有人有理由花一些时间在它上面,我相信编写这样一个工具不会很难。毕竟,V8 的 JS 到字节码的编译器是开源的,所以只需要查看这些源代码并实现相反的方向。所以我会假设以字节码的形式提供的“保护”与作为丑陋的 JavaScript 一样多,即我不相信。

    在您做出任何决定之前,还请记住,字节码被视为 V8 的内部实现细节;特别是它没有版本控制并且可以随时更改,因此它必须由使用它的完全相同的 V8 版本创建。如果你想更新你的 Node.js,你将不得不重新创建所有的字节码,并且当你忘记这样做时,没有检查或警告会指出。

    【讨论】:

    • 对不起,如果我从一开始就不清楚,既然字节码保护你的源代码,它是否足够安全并且真的能够保护源代码。我有一个要出售的源代码,我想确保没有人会反编译和出售我的源代码。我正在考虑制作一个 v8 环境来反编译代码,但想要一些想法和起点。
    • 您正在寻找法律问题的技术解决方案。只有您可以定义它是否对您“足够安全”。锁以锁匠闯入所需的时间来衡量。没有锁与无限分钟有关。一个好的锁大约需要 5 分钟。反编译 v8 是一项艰巨的工作。是的,我可以做到,但我很确定重写你销售的任何模块会更便宜。
    • V8 的字节码并非旨在成为一种混淆机制(ByteNode 是一种将缓存系统滥用于其他目的的黑客),因此它甚至不会尝试使反编译变得困难。我想人们可以在一周的工作中为它编写一个非常好的反编译器。也许有人甚至已经有一个......
    【解决方案3】:

    Node.js 源代码已经包含用于反编译二进制字节码的代码。
    您可以从 V8 字节码中获取文本字符串,然后您需要对其进行分析。
    但是文本字符串会很长,并且会丢失一些重要信息,例如常量池。所以需要修改 Node.js 源码。
    请查看https://github.com/3DGISKing/pkg10.17.0
    我已附上导出的 xml 文件。
    如果你学过V8,就可以分析它并从中获取源代码。

    【讨论】:

      【解决方案4】:

      它保持简短和甜蜜,您可以尝试Ghidra node.js 包,它基于 Ghidra 逆向工程框架,由NSA 在 2019 年开源. Ghidra 能够反汇编和反编译 v8 字节码。拆机的内部工作相当复杂,这个答案简短但足够。

      【讨论】:

      • 我试过 ghidra_nodejs 但似乎该扩展只适用于 v8 版本为 6.2.414.77 的 jsc 文件
      猜你喜欢
      • 2021-03-04
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2012-07-07
      • 2020-08-22
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多