提问者:小点点

如何反编译Bytenode jsc文件?


我刚刚看到了这个ByteNode库,它和Java的ByteCode是一样的,但是这是nodejs的。

这个库把你的JavaScript代码编译成V8字节码,保护你的源代码,我想知道有没有反编译字节码,所以它不够安全。我想知道是因为我想用这个库来保护我的源代码?


共2个答案

匿名用户

TLDR这将提高对某些人复制代码并试图将其作为自己的代码来传递的标准。它不会阻止一个有献身精神的人这样做。但是保护你的作品的主要方法不是技术上的,而是法律上的。

这个库将JavaScript代码编译成V8字节码,保护源代码。

我们不知道它是V8字节码,但在某种意义上它是“编译”的。我们只知道它通过内置的API创建了一个“代码缓存”,这正式意义上只是一个用于加速第二次,第三次等重新编译代码的缓存。理论上,您还应该将原始源代码作为字符串提供给构造函数。但是,如果您深入研究Node.js和V8,它似乎是某种编译形式的实际代码(无论是否是实际的V8字节码),而您在运行时给出的代码字符串将被忽略。(当从代码缓存中运行代码时,ByteNode库提供了一个虚拟字符串,因此显然不需要实际代码。)

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

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

在实验中,局部变量名似乎丢失了,但函数名没有丢失。注释似乎丢失了(这可能不像看起来那么明显,因为需要来返回原始源文本或合成版本[details]。

因此,如果您通过一个minifier(特别是重命名函数的minifier)运行代码,然后通过ByteNode运行代码(或者您自己使用来执行,ByteNode是一个相当薄的包装器),那么将其反编译成类似于源代码的代码是可行的,但是源代码将非常难以理解。这与传送Java类文件非常相似,后者可以反编译(JDK中甚至有一个标准工具

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

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

从根本上说,保护你的作品的方法是确保你已经把所有相关的通知放在相关的地方,这样复制它是侵犯版权的事实是清楚的,然后追究你的法律追索权,如果你发现有人冒充自己的作品。

匿名用户

有没有办法

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

不够安全

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

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

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