Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已编译或模糊的Ruby_Ruby_Obfuscation_Bytecode_Compiled - Fatal编程技术网

已编译或模糊的Ruby

已编译或模糊的Ruby,ruby,obfuscation,bytecode,compiled,Ruby,Obfuscation,Bytecode,Compiled,我有一组文件似乎被Ruby混淆或编译。如果我对其中一个文件执行文件[sic]: a /usr/bin/env ruby script text executable 所有这些都是从以下内容开始的: #!/usr/bin/env ruby require 'iseq';RubyVM::InstructionSequence.load(Marshal.load(File.read(__FILE__,nil,113))).eval 这个文件是什么?如何查看或调试代码 注:Ruby版本Ruby 2.

我有一组文件似乎被Ruby混淆或编译。如果我对其中一个文件执行文件[sic]:

a /usr/bin/env ruby script text executable
所有这些都是从以下内容开始的:

#!/usr/bin/env ruby
require 'iseq';RubyVM::InstructionSequence.load(Marshal.load(File.read(__FILE__,nil,113))).eval
这个文件是什么?如何查看或调试代码


注:Ruby版本Ruby 2.1.3p242(2014-09-19修订版47630)[x86_64-linux]

这是编译到Ruby虚拟机的代码。它使用的是公开私有方法
RubyVM::InstructionSequence::load


您无法从中提取原始源代码,但调试器应该可以工作。您可以用类似于人类可读的形式读取编译后的代码。假设
Marshal.load
返回一个
RubyVM::InstructionSequence
对象,则应该这样做

require 'iseq';puts RubyVM::InstructionSequence.load(Marshal.load(File.read(__FILE__,nil,161))).disass‌​emble

这里发生的事情是,它正在读取一个包含ruby封送字节的文件,用
marshall.load
将它们解组,然后将结果转换为
指令序列
对象或其他东西。
RubyVM::InstructionSequence
的2.2.3文档没有
.load
方法;你用什么版本的Ruby运行这个?另外,试着从评估改为打印,看看结果如何。i、 e.:
要求“iseq”;放置RubyVM::InstructionSequence.load(Marshal.load(File.read(uuu File,nil,113))
RubyVM::InstructionSequence::load
iseq
gem的一部分,它是本代码段开头的
require
d。它(还)不在YARV中,因为YARV字节码是不安全的,它会使VM崩溃(或者更糟)。YARV编译器从不生成不安全的字节码,但显然,对于从其他地方加载的字节码来说,这是无法保证的,因此不允许加载字节码,除非有人花时间编写字节码验证器。注意:它不是“Ruby虚拟机”。没有这样的事。这是YARV虚拟机,它将只与YARV一起工作,而不与MRI(这是一个纯AST步行解释器,没有字节码格式)、Rubinius、MRuby、MagLev、MacRuby和RubyGoLightly(它们有不同的字节码格式)、JRuby和XRuby(使用JVM字节码)、IronRuby和Ruby.NET(使用clicil字节码)、Topaz一起工作(使用PyPy字节码)、Opal(编译成ECMAScript)和许多其他(当然,其中许多已经不存在了)HotRuby和RedSun OTOH可以执行YARV字节码……但也不再存在。嗨@Schwern!我照你说的做了,这就是我得到的:
/tmp/foo:2:in`:未定义的方法“反汇编”(NoMethodError)
。所以我得到了
marshall.load
返回一个
数组而不是
RubyVM::InstructionSequence
对象。我应该在这里做什么?谢谢,我得到了它。我必须
RubyVM::InstructionSequence.load
marshall.load(File.read(\uu File\uu,nil,113))
获得
RubyVM::InstructionSequence
)用这行编辑你的答案,我会把它标记为正确<代码>要求“iseq”;放置RubyVM::InstructionSequence.load(Marshal.load(File.read(uuu File,nil,161))。反汇编
谢谢@用户1618465您介意吗?你有代码,所以你更有可能得到它的权利。