C#是屬於MSIL(Microsoft Intermediate Language)特性的程式語言,它在運行時會透過.NET Framework來進行編譯,編譯完才開始執行主程式,所以我們接下來要尋找是透過哪個函式來編譯主程式的,藉由此函式來知道主程式運行的起始位址。
C#測試程式
https://drive.google.com/file/d/1fAIZW4BKkuvk4XA7gvYsIEczS8K7F8oD/view?usp=sharing
一、尋找編譯程式
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的函式來編譯主程式,所以我們可以遵循這個規則來找它,另外如果是有加殼的程式,它可能會調用好幾次編譯函式,直到編譯到主程式,我們也是一樣可以藉由這個方法來找到主程式的起始位址。