【发布时间】:2019-07-16 07:31:30
【问题描述】:
我刚刚看到了这个库ByteNode它和java的ByteCode一样,但是这是针对NodeJS的。
这个库将你的 JavaScript 代码编译成 V8 字节码,保护你的源代码,我想知道是否有反编译 byteNode,因此它不够安全。我想知道是因为我想使用这个库来保护我的源代码吗?
【问题讨论】:
标签: node.js v8 bytecode decompiling
我刚刚看到了这个库ByteNode它和java的ByteCode一样,但是这是针对NodeJS的。
这个库将你的 JavaScript 代码编译成 V8 字节码,保护你的源代码,我想知道是否有反编译 byteNode,因此它不够安全。我想知道是因为我想使用这个库来保护我的源代码吗?
【问题讨论】:
标签: node.js v8 bytecode decompiling
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 源代码以了解如何更正完整性检查。
从根本上说,保护您的作品的方法是确保您已将所有相关通知放在相关位置,以便明确复制它是侵犯版权的事实,然后在您发现时寻求法律追索关于有人冒充自己的。
【讨论】:
Function.prototype.toString,它会返回垃圾。如果您的代码依赖于F.p.toString,那么您不能使用 ByteNode,句号。此外,缓存数据中没有版权声明,因此如果有人想将那个作为自己的出售,他们甚至不需要篡改它。
--help,或者只是让它在代码中的某个地方(我总是在二进制分发应用程序中这样做)。关于Function.prototype.toString 的好点。 (我一直认为依赖它是一种反模式,但它现在被指定了......)
有什么办法
你可以在这里得到一百个回答说“我不知道方法”,但这仍然不能保证没有一个。
不够安全
什么足够安全?您的部署方案是什么?您要防御什么样的场景/攻击?
FWIW,我不知道“反编译”V8 字节码的现有工具(即生成具有相同行为的 JavaScript 源代码)。也就是说,考虑到字节码是源代码的相当简单的翻译,如果有人有理由花一些时间在它上面,我相信编写这样一个工具不会很难。毕竟,V8 的 JS 到字节码的编译器是开源的,所以只需要查看这些源代码并实现相反的方向。所以我会假设以字节码的形式提供的“保护”与作为丑陋的 JavaScript 一样多,即我不相信。
在您做出任何决定之前,还请记住,字节码被视为 V8 的内部实现细节;特别是它没有版本控制并且可以随时更改,因此它必须由使用它的完全相同的 V8 版本创建。如果你想更新你的 Node.js,你将不得不重新创建所有的字节码,并且当你忘记这样做时,没有检查或警告会指出。
【讨论】:
Node.js 源代码已经包含用于反编译二进制字节码的代码。
您可以从 V8 字节码中获取文本字符串,然后您需要对其进行分析。
但是文本字符串会很长,并且会丢失一些重要信息,例如常量池。所以需要修改 Node.js 源码。
请查看https://github.com/3DGISKing/pkg10.17.0
我已附上导出的 xml 文件。
如果你学过V8,就可以分析它并从中获取源代码。
【讨论】: