2020年4月30日 星期四

CLR C++ 逆向分析技巧

之前幾篇有教學如何逆向分析.Net Framework的程式,不過是關於C#的程式,因此這篇就換分析CLR C++,它也是.Net Framework家族的成員,由於方便開發惡意程式,所以我們也要學會加殼的CLR C++要如何分析。

測試CLR C++程式
https://drive.google.com/file/d/1BBetKwdETXAKYWmO4OomYVrK57yGJGJ-/view?usp=sharing

一、尋找編譯程式

在CLR C++它會透過clr.dll去調用clrjit.dll來編譯(Compile)程式碼,所以我們要分析編譯函式(call clrjit.635BBDA8)的參數。

編譯函式的第二個參數(push edx)位移0x8 Bytes ([arg2+0x8])是編譯程式資訊,位移0xC Bytes[arg2+0xC]是編譯程式長度;第三個參數(push eax)是編譯完後的程式碼位址;第四個參數(push [ebp+1C])是編譯完後的長度位址。

我們可以藉由第三個參數來獲取編譯完後的程式碼起始位址,然後再下中斷點,就能迅速的進入主程式的運行位置。



因為CLR C++會初始化許多程式,所以它會調用編譯函式(clrjit.635BBDA8)非常多次,因此會比較難找到主程式,不過我們可以在clr.622E9A3E這邊先下中斷點,再到編譯函式下中斷點,可以更快速找到編譯完後的主程式運行位置。



二、利用Windbg找出Method名稱

只要是.Net Framework相關的程式碼,在調用方法(Method)時,都會透過mscorlib_ni.dll來間接運行此方法,因此我們很難從一開始調用mscorlib_ni.dll的函式來知道它是調用CLR C++的什麼方法,不過我們可以透過Windbg來使用sos.dll的IP2MD指令來查找它是屬於什麼的Method名稱。

在使用Windbg之前,我們可以設置Symbol,這樣它才會在標準的API顯示名稱。(srv*D:\Symbol*https://msdl.microsoft.com/download/symbols)



在載入sos.dll之前,我們需要知道程式是使用什麼版本的.NET Framework,這樣才能知道要載入哪個版本的sos.dll。



從上一步我們知道是使用v4.0.30319版本的.Net Framework,我們可以使用.load指令載入sos.dll模組,不過這樣還不能查詢Method名稱,因為程式還沒有載入mscorlib_ni.dll和clr.dll模組,所以我們需要在載入mscorlib_ni.dll後,中斷程式,因此還需要使用sxe ld mscorlib_ni.dll指令來確保程式已載入mscorlib_ni.dll。



完成上一步後,再執行lm指令,就能發現mscorlib_ni.dll和clr.dll都被載入進來了。



我們從編譯完後的主程式發現,它會透過call mscorlib.ni.6142D4B0來調用Method,接下來我們就利用IP2MD指令來顯示它的Method名稱。



使用!IP2MD 0x6142D4B0,這樣就能簡單快速的知道它是調用WriteLine的Method。



我們也可以使用相對位置(!IP2MD mscorlib_ni+0x39D4B0)的方式來查找Method名稱。