2015-10-15 84 views
2

我有一組似乎被Ruby模糊或編譯的文件。如果我做一個文件(原文如此)的文件之一:編譯或模糊處理Ruby

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 

這是什麼文件?我如何看到代碼或調試它?

注:紅寶石版本紅寶石2.1.3p242(2014年9月19日修訂47630)x86_64的Linux的]

+0

這裏發生的事情是,它讀取包含紅寶石編組個字節的文件,以'Marshal.load'解組他們,然後將結果變成一個'InstructionSequence'對象或東西。 'RubyVM :: InstructionSequence'的2.2.3文檔沒有'.load'方法;你用什麼版本的Ruby來運行它?此外,請嘗試從評估變爲打印並查看出現的內容。即:'require'iseq';放置RubyVM :: InstructionSequence.load(Marshal.load(File.read(__ FILE __,nil,113)))' –

+0

'RubyVM :: InstructionSequence :: load'是'iseq'的一部分寶石,這是在這段代碼的開始部分需要的。它尚未在YARV中正確使用,因爲YARV字節碼不安全,可能會導致VM崩潰(或更糟糕)。 YARV編譯器永遠不會產生不安全的字節碼,但很顯然,從其他地方加載的字節碼不能保證,因此字節碼加載是不允許的,直到有人花時間寫字節碼檢驗器。 –

回答

3

編譯成一個Ruby虛擬機這是代碼。它使用公開私有方法RubyVM::InstructionSequence::loadiseq gem

你不能從中提取原始的源代碼,但調試器應該工作。您可以用RubyVM::InstructionSequence#disassemble這樣的可讀形式閱讀編譯後的代碼。假設Marshal.load返回一個RubyVM::InstructionSequence對象,這應該這樣做。

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

注意:它不是「Ruby虛擬機」。哪有這回事。這是YARV虛擬機,它將*僅用於YARV,不用於MRI(它是一個純粹的AST行走解釋器,並且沒有字節碼格式),Rubinius,MRuby,MagLev,MacRuby和RubyGoLightly (使用JVM字節碼),IronRuby和Ruby.NET(使用CLI CIL字節碼),Topaz(使用PyPy字節碼),Opal(編譯爲ECMAScript)等等。 (當然,其中許多不再存在。)HotRuby和RedSun OTOH可以執行YARV字節碼。 –

+0

......但也不復存在。 –

+0

Hi @Schwern!我做了你所說的,這就是我所得到的:'/ tmp/foo:2:在'

'中:未定義的方法\\反彙編爲#(NoMethodError)'。所以我得到'Marshal.load'返回一個'array'而不是'RubyVM :: InstructionSequence'對象。我應該在這裏做什麼?謝謝 – user1618465