乾貨 || .NET逆向工程 (一)
不知道你有沒有這樣的感覺,有時候你只是一個只知道如何從StackOverflow扒各種源碼的Shit?
這種感覺挑戰著我去學習新的東西,找到新的方法來測試我的大腦,開始把玩逆向工程是一個正確的事情,我再次感覺到自己像一個有點牛逼的開發人員了(也可能只是一個有點不同的shit!)。
下面是我學習新事物的秘訣:
感覺自己像一坨shit。
做了一些「很酷」的東西。過了15分鐘,繼續轉到了第1點(不要在源代碼中使用gotos ;)
好的,當你有了好的心情,那就讓我們開始本文的主題吧。
最近,我們遇到了一個使用http://VB.NET編寫的加密器,但是源碼被混淆過了。我們的主要目的是找出加密的邏輯和方法。我認為玩逆向最難的部分之一是確定代碼邏輯,而不僅僅是編寫補丁或者是從程序中找出了一個密鑰。
本文將會重點講述下面兩個部分:
移除各種反逆向保護。
反編譯程序並運行。
在對一個巨大的文本嘗試了多個反混淆器後,依舊沒有結果。這真是一個連沒有運氣都沒有的非常完美的地方,讓我們跳過這一步,先試試手。 (用右手是最有效的,這樣能感覺好點)。
讓我們使用dnSpy載入程序集。然後,讓我們看看我們的模塊和類,我們注意到的,在程序集中定義的方法沒有反編譯成功。
這意味著我們要尋找的方法加密到了一些隱藏的節中(不在IL節),當程序運行時,會解密這些方法並把它們放在正確的位置。 為了確認,讓我們用CFF資源管理器打開我們的程序集並導航到PE節。
是的,我們想的是對的。 現在我們必須在源代碼中找到函數解密和修複發生的地方。 經過一些觀察,發現該過程發生在<Module> .ctor。 此構造函數在應用程序的主入口點之前調用。 這意味著它是實施這些工作的完美點。
重新打開dnSpy,然後右擊程序集 – >轉到.cctor。
由於在<Module>類中有一些沒有被很好的反編譯的函數,所以,我們得出的結論是,在第一次調用期間必須會發生方法的修改,so,讓我們繼續深挖一下。
這裡我們看到程序導入了kernel32.dll 的VirtualProtect函數的調用。 此功能用於設置存儲器塊的訪問屬性。 好吧,這給了我們這一信息:程序獲取了方法真正存放的地址並在這個地址上設置了PAGE_EXECUTE屬性,對於其他的信息,我們不需要知道了。 我們找到了修復方法的確切地址,沒錯,就是它。
讓我們在調用之後設置一個斷點,然後從內存中導出程序集。
保存並使用dnSpy打開新保存的程序模塊。 現在我們看到我們要找的方法已經被反編譯了,感覺很好。 我們做到了!
但仍然有一個問題,我們的.exe是有問題的,因為我們忘記刪除掉「方法修複函數」。 程序運行後仍然會執行修復的方法(但方法已經被我們固化了),這是一件完全混亂的事情。
現在讓我們刪除該函數並再次保存程序集。
然後單擊模塊,然後單擊文件 – >保存模塊。 不要忘記設置MD Writer選項,如:
好的,現在我們就有了一個用反編譯的方法操作過的可運行的可執行文件。
本文參考來源於codepool,如若轉載,請註明來源於嘶吼: .NET逆向工程 (一) 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※ADO.NET的SqlParameter(String,?Object)的構造函數第二個參數不能為0?
※IoC/AOP 這些開發範式為什麼在 .NET 平台上沒有被廣泛採用?
※反編譯DLL問題?
※C++與C++/CLI的運行速度相比哪個快? C++/CLI和C#的運行速度一樣快?
※.NET Core 開源對移動開發有什麼意義?