「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

以下轉自吾愛破解wwh1004大神:

文章中用到的工具:

AssemblyRebuilder by wwh1004:https://github.com/wwh1004/AssemblyRebuilder

ExtremeDumper by wwh1004:https://github.com/wwh1004/ExtremeDumper

Universal Fixer by CodeCracker:https://www93.zippyshare.com/v/wyCquy7N/file.html

這個文件被包含在上面這個壓縮包裡(路徑ToolsArchive_Part1.zip\PC_CONTENTS\MY_NET_TOOLS\Unpackers\Universal_Fixer.exe)。壓縮包裡有CodeCracker大神無償分享的各種工具,.NET逆向必備神器級工具包

x64dbg:https://github.com/x64dbg/x64dbg/releases

注意裝上插件SharpOD並按SharpOD的推薦設置設置好

dnSpy by 0xd4d:https://github.com/0xd4d/dnSpy/releases

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

下載附件 保存到相冊

2018-7-8 17:16 上傳

先用ConfuserEx加一層殼,只是演示如何脫非託管殼,所以ConfuserEx只設置加anti dump

然後開始演示Themida:

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

Themida保護全開

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

配置好x64dbg

調試加殼後文件,添加dll斷點,clr.dll(這一步可以看視頻是怎麼添加的),等斷下來後,轉到符號窗口

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

點擊clr.dll(右鍵加載符號文件,我的已經下載過了,沒下載過的可能要等10分鐘+),搜索SystemDomain::ExecuteMainMethod,在這裡下斷點

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

成功斷下

接下來沒x64dbg什麼事情了,是不是非常簡單,完全只需要用工具

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

把ExtremeDumper的轉儲方式設置為MegaDumper(用MegaDumper也可以,只不過覺得那個界面太難看了,而且還很卡...)

右鍵,查看模塊,Dump主模塊

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

使用Universal Fixer修復,一般把我選中的這些勾上,別的都不選就可以了

運行正常,反編譯也正常:

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

原理:

在SystemDomain::ExecuteMainMethod處下斷點,是一個非常折中的方案,不會過於深入clr內部,也不會隨隨便便被hook住

運行到這裡的時候主程序集已經被這些非託管殼還原到對應位置

為什麼這說,請看下圖

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

這是主線程的調用堆棧(我在主線程裡運行了消息泵,所以暫停住了)

可以看到底端是不知名的地址,應該是TMD之類的殼生成的

再向上看,有個clr._CorExeMain和clr._CorExeMainInternal,clr._CorExeMain是導出函數

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

有被hook的風險,所以在這裡下斷點不適合,clr._CorExeMainInternal其實也可以,但是感覺不太好(沒測試過)

然後是

······

clr.RunMain

clr.Assembly::ExecuteMainMethod

clr.SystemDomain::ExecuteMainMethod

clr.ExecuteEXE

······

這4個應該都可以,都是比較安全的,幾乎不可能被hook住,直接dump下這時的主模塊就沒啥問題了

不過我只測試了clr.SystemDomain::ExecuteMainMethod,測試了3個殼(2個強殼,1個打包器),都是可以的

Shielden:

Dump前操作一樣,只不過Dump之後要用CFF Explorer手動清理導入表。或者也可以使用AssemblyRebuilder,重建程序集,程序體積完全恢復正常。


以visual studio 2017為參照,講解如何像用vs調試.NET程序集一樣使用x64dbg調試本機代碼

x64dbg下載地址:https://github.com/x64dbg/x64dbg/releases


x64dbg入門操作:

1.設置符號文件保存路徑:

Q:符號文件是什麼?A:*.pdb文件,還不知道就百度吧。。。Q:為什麼要設置?

A:符號文件通常很大,不然x64dbg默認保存到自身目錄下,導致升級x64dbg,遷移x64dbg到其它位置極為不便

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

這樣就設置好了

2.使用符號文件:

很多情況下,x64dbg不會自動加載符號文件(不知道為什麼,可能是防止調試時太卡吧,vs加載過多符號文件就會卡頓)

這時候就需要我們手動加載了

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

x64dbg沒有加載選項,可以點"下載此模塊的符號信息"(要加載所有符號文件可以點"下載所有模塊的符號信息")

如果符號文件緩存文件夾中已經有了這個符號文件,x64dbg直接從本地加載,否則從符號文件服務器上下載並加載

右邊顯示了dll自身導出的函數和符號文件導出的函數,左鍵單擊這裡的函數,按下F2,是可以下斷點的

3.安裝插件:

對於.NET逆向,一般只要裝一個反調試器檢測的插件就行了

我在用@xjun 的SharpOD:https://www.52pojie.cn/thread-628837-1-1.html

不是打廣告,是這個插件真的很好用,調試體驗極佳(用作者的推薦設置)

不扯了,說下怎麼安裝

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

把壓縮包裡面的*.dp*文件拖入對應的文件夾(其實這些*.dp*也是*.dll文件,只不過改了個後綴名讓x64dbg知道這裡有個插件)

比如裝32位x64dbg的插件,就將*.dp32拖入x64dbg\\x32\plugins

x64dbg實際操作:

1.查看函數調用時的參數:

首先你需要明白什麼是調用約定,這些需要百度

現在我使用32位x64dbg調試一個unpackme,在mscorwks.dll的AssemblyNative::LoadImage處下了斷點,按下F9,x64dbg在此函數入口處斷下了

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

在符號窗口可以看到這個函數的調用約定是fastcall

我們回到CPU,把調用約定改成fastcall

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

這裡的1,2,3就是代表了第1,2,3個參數

我們剛才已經看到了,這個函數第一個參數是"Array<unsigned> *",表示指向了一個字節數組,這裡的"unsigned char"等同於C#/VB.NET中的"byte",而不是C#/VB.NET中的"char"/<unsigned>

2.轉儲內存到文件:

我們在內存窗口中按下Ctrl+G,輸入0312BBAC

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

成功跳轉到了一個內存區域,儲存了"Array<unsigned>"/<unsigned>

我們點一下4D或者M

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

再將右邊滾動條滾到底部,按住Shift,在左鍵單機一下最後一個字節

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)

這樣,你就把一個.NET程序集人工Dump下來了

dnSpy打開看看,是個沒啥用的程序集(這個僅僅是演示,AssemblyNative::LoadImage斷點有時是很有用的)

「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)


分享到:


相關文章: