2010-10-17 62 views
0

有沒有辦法將msil代碼的一部分保存爲字節流,並將其逆向工程到一些更高級的代碼(例如C#)?對msil代碼的字節數組進行逆向工程

編輯:MSIL指令不是整個裝配

感謝,

喬恩

+0

你的意思只是一堆不屬於程序集的'msil'指令嗎? – Oded 2010-10-17 19:46:57

+2

使用反射器拆解反射器,並看它是如何做到的。 – 2010-10-17 19:54:54

回答

0

反射就是這樣做的...所以是的,這是可能的,假設你有正確的上下文(解析類型令牌等)。

但是,就像使用Reflector一樣,反向工程代碼可能與原始代碼完全不同,但它具有相同的語義(如果代碼生成器中沒有錯誤)。

+0

反射器在_assemblies_上工作。我不確定這是OP所要求的。 – Oded 2010-10-17 19:47:35

+0

問題是如果「有辦法」 - 我的回答是肯定的,如果你有額外的信息需要從MSIL流中的所有數據中做出有意義的事情(操作碼是沒有問題的,但是類型和方法標記等等是一個問題)。 – Lucero 2010-10-17 19:50:07

+0

Oded,是的。這不是一個可以接受的事情,反射器不知道如何處理它。 – Jon 2010-10-17 19:50:07

0

Mono.Cecil能提供一些分析功能:
http://www.mono-project.com/Cecil
不知道是否可以分析純粹的IL代碼。

+0

來自該網站:「簡單的英語,與塞西爾,你可以加載現有的管理組件」。所以,需要一個組件。 – Oded 2010-10-17 19:53:01

0

不知道它這會工作,但ILDASM聽起來是正確的:

MSIL反是一個配套工具MSIL彙編程序(Ilasm.exe)。 Ildasm.exe需要一個包含Microsoft中間語言(MSIL)代碼的可移植可執行文件(PE),並創建一個適合作爲Ilasm.exe輸入的文本文件。

請注意文件是一個PE文件的要求,所以對於任何實際操作,這仍然基本上是一個託管程序集。


由於這些指令的低水平,他們不一定會直接對應於高層次的代碼 - 甚至反射器不會給你確切的原代碼。

您可能需要編寫自己的工具才能實現此目的,因爲程序集將包含一些可能需要的信息(例如引用的程序集)。

+1

與管理組件不同,PE不是一回事嗎? – 2010-10-17 19:56:13

+0

這將怎麼只給我的MSIL命令不是一個高級語法,是正確的? – Jon 2010-10-17 19:56:19

+0

@jon - 正確。 – Oded 2010-10-17 19:56:44

1

總之,你不能把「一塊CIL代碼」反編譯成高級語言。拋開高級語言,你甚至無法正確反編譯它。因爲,CIL並不僅僅意味着一堆指令,有些指令還有作爲操作數的變量。 Metatokens只是一些對象(類型,方法,字符串等)的整數引用。這些信息存儲在程序集中。即使我們忽略了這些信息,也存在另一個問題:異常處理。沒有「嘗試」和「捕捉」說明(但有最終等)。要確定try-catch/finally塊,你需要再次組裝。因爲這些信息以彙編形式存儲爲偏移長度對(塊邊界存儲)。