標籤:
註:本文適用讀者範圍,對Windows下的PE檔案有一定認識的朋友
一、 名詞解釋
a) CLR:
通用語言執行平台(Common LanguageRuntime),CLR時.NET架構的核心內容之一,可以把它看為一套標準資源,可以被任何.NET程式使用。它包括:物件導向的編程模型、安全模型、類型系統(CTS)、所有.NET基類、程式執行以及代碼管理等。
b) JIT:
即時編譯(Just In-Time compile),這是.NET運行可執行程式的基本方式,也就是在需要啟動並執行時候,才將對應的IL代碼編譯為本機指令。傳入JIT的是IL代碼,輸出的是機器碼,所以部分加密軟體通過掛鈎JIT來進行IL加密(目前該技術運用得比較成熟的是Rick編寫的”DNGuard HVM”此款加密保護軟體),同時又保證程式正常運行。
c) 中繼資料:
描述.NET程式運行所必需的一切資訊的資料,包括版本、類型的各個成員(方法、欄位、屬性、事件)等。一個檔案要成為有效.NET可執行程式,必須包含正確的中繼資料定義。由於中繼資料被儲存在PE檔案中,在逆向中成為擷取來源程式資訊的重要來源,因此對中繼資料的加密也是.NET加密軟體的重點
d) MSIL:
微軟中繼語言(MicroSoft Intermediate Language),也被成為MSIL彙編,通常也叫做IL代碼。託管語言在執行時,都是將我們的(C#,VB)編譯為MSIL語言,再編譯為本地機器語言執行。熟練掌握MSIL語言對逆向.NET程式有著至關重要的作用。
二、.NET程式運行流程
1.我們用PEID開啟一個普通的Windows下的非託管PE映像,查看檔案的輸入表資訊,可以看到,一個普通的Windows下的非託管PE映像,程式啟動時候會調用很多系統dll中的匯入函數。
2.我們再用PEID開啟一個託管的PE映像,可以很清晰地看到,.NET程式的輸入表和Windows下的PE映像的輸入表是有非常大的區別的!.NET程式輸入表中只存放著”mscoree.dll”中的”_CorExeMain”這個匯入函數!意味著.NET程式啟動時候將首先執行函數”_corExeMain”,該函數主要進行了以下幾個操作:
a、通過查看PE檔案的中繼資料,找出.NET檔案是基於哪個版本建立的
b、找出作業系統中正確版本的CLR的路徑
c、載入並初始化CLR
..NET程式集載入演算法總結如下:
A、使用者執行一個.NET程式集
B、Windows載入器查看AddressOfEntityPoint域,並找到PE映像中的.Text段
C、位於AddressOfEntityPoint位置上的位元組只是一個JMP指令,這個指令跳轉到mscoree.dll中的一個匯入函數.
D、將執行控制轉移到mscoree.dll中的函數_ CorExeMain中,這個函數將啟動CLR並且把執行控制轉移到程式集的進入點
E、 JIT開始編譯並執行進入點
三、CLR與JIT在程式運行中的作用
By:涼遊淺筆深畫眉QQ:381400744
2015.03.08
逆向第三課(深入.NET程式運行原理)