如何反编译Bytenode“ jsc”文件?

时间:2019-07-16 07:31:30

标签: node.js v8 bytecode decompiling

我刚刚看到了这个库 ByteNode ,它与Java的ByteCode相同,但这是针对NodeJS的。

该库将您的JavaScript代码编译为V8字节码,从而保护您的源代码,我想知道反编译byteNode是否存在,因此不够安全。我想知道是因为我想使用此库保护我的源代码吗?

4 个答案:

答案 0 :(得分:3)

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

enter image description here

答案 1 :(得分:2)

  

有什么办法

您可以在这里得到一百个答案,说“我不知道一种方法”,但这仍然不能保证没有一个。 / p>

  

不够安全

足够安全吗?您的部署方案是什么?您要防御哪种情况/攻击?

FWIW,我不知道现有的工具,该工具可以“反编译” V8字节码(即生成具有相同行为的JavaScript源代码)。就是说,考虑到字节码是源代码的相当简单的翻译,我敢肯定,如果有人有理由花一些时间在它上面,那么编写这样的工具并不是很难。毕竟,V8的JS到字节码的JS编译器是开源的,因此只需查看这些源并实现相反的方向即可。因此,我假设以字节码形式进行的传送提供的功能与丑化的JavaScript一样多,也就是说,我不信任任何一种。

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

答案 2 :(得分:0)

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],这似乎并不那么明显。)

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

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

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


从根本上来说,保护您作品的方法是确保已将所有相关声明放到相关位置,以使复制该声明明显侵犯版权的事实显而易见,然后在发现后继续寻求法律追索权关于某人以自己的名义假冒。

答案 3 :(得分:0)

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