2020年4月9日 星期四

C#逆向分析技巧

C#是Windows提供給開發商撰寫軟體的程式語言,那麼駭客也有可能會使用此語言來開發惡意程式,所以我們需要知道要如何分析它。大部分的資安人員在分析.NET Framework的程式,通常都會使用.NET Reflector或dotPeek等等的靜態分析工具,如果程式有透過加殼軟體來加殼主程式,靜態分析是完全沒用的,因為主要程式碼都被加密或壓縮,所以我們這篇是要克服這種情況,進而騷擾加殼程式。

C#是屬於MSIL(Microsoft Intermediate Language)特性的程式語言,它在運行時會透過.NET Framework來進行編譯,編譯完才開始執行主程式,所以我們接下來要尋找是透過哪個函式來編譯主程式的,藉由此函式來知道主程式運行的起始位址。

C#測試程式
https://drive.google.com/file/d/1fAIZW4BKkuvk4XA7gvYsIEczS8K7F8oD/view?usp=sharing

一、尋找編譯程式

在.NET Framework裡面的mscorwks.dll會調用mscorjit.dll去動態編譯我們的主程式,所以我們只要將編譯好的主程式的起始位址紀錄下來,在對起始位址下中斷點,就能快速定位主程式。

[ebp+18]是主程式的起始位址回傳值。





執行完編譯函式後,16EE20會寫入主程式的起始位址。



在4B0070的位址下中斷點就能輕易的找到主程式的起始位址。



二、結論

編譯函式可能在不同的.NET Framework的Patten可能會有所不同,但唯一不變的是mscorwks.dll會調用mscorjit.dll的函式來編譯主程式,所以我們可以遵循這個規則來找它,另外如果是有加殼的程式,它可能會調用好幾次編譯函式,直到編譯到主程式,我們也是一樣可以藉由這個方法來找到主程式的起始位址。