以下轉自吾愛破解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)](http://p2.ttnews.xyz/loading.gif)
下載附件 保存到相冊
2018-7-8 17:16 上傳
先用ConfuserEx加一層殼,只是演示如何脫非託管殼,所以ConfuserEx只設置加anti dump
然後開始演示Themida:
![「.NET逆向」使用x64dbg脫非託管殼(TMD,SE,EVB)](http://p2.ttnews.xyz/loading.gif)
Themida保護全開
配置好x64dbg
調試加殼後文件,添加dll斷點,clr.dll(這一步可以看視頻是怎麼添加的),等斷下來後,轉到符號窗口
點擊clr.dll(右鍵加載符號文件,我的已經下載過了,沒下載過的可能要等10分鐘+),搜索SystemDomain::ExecuteMainMethod,在這裡下斷點
成功斷下
接下來沒x64dbg什麼事情了,是不是非常簡單,完全只需要用工具
把ExtremeDumper的轉儲方式設置為MegaDumper(用MegaDumper也可以,只不過覺得那個界面太難看了,而且還很卡...)
右鍵,查看模塊,Dump主模塊
使用Universal Fixer修復,一般把我選中的這些勾上,別的都不選就可以了
運行正常,反編譯也正常:
原理:
在SystemDomain::ExecuteMainMethod處下斷點,是一個非常折中的方案,不會過於深入clr內部,也不會隨隨便便被hook住
運行到這裡的時候主程序集已經被這些非託管殼還原到對應位置
為什麼這說,請看下圖
這是主線程的調用堆棧(我在主線程裡運行了消息泵,所以暫停住了)
可以看到底端是不知名的地址,應該是TMD之類的殼生成的
再向上看,有個clr._CorExeMain和clr._CorExeMainInternal,clr._CorExeMain是導出函數
有被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到其它位置極為不便
這樣就設置好了
2.使用符號文件:
很多情況下,x64dbg不會自動加載符號文件(不知道為什麼,可能是防止調試時太卡吧,vs加載過多符號文件就會卡頓)
這時候就需要我們手動加載了
x64dbg沒有加載選項,可以點"下載此模塊的符號信息"(要加載所有符號文件可以點"下載所有模塊的符號信息")
如果符號文件緩存文件夾中已經有了這個符號文件,x64dbg直接從本地加載,否則從符號文件服務器上下載並加載
右邊顯示了dll自身導出的函數和符號文件導出的函數,左鍵單擊這裡的函數,按下F2,是可以下斷點的
3.安裝插件:
對於.NET逆向,一般只要裝一個反調試器檢測的插件就行了
我在用@xjun 的SharpOD:https://www.52pojie.cn/thread-628837-1-1.html
不是打廣告,是這個插件真的很好用,調試體驗極佳(用作者的推薦設置)
不扯了,說下怎麼安裝
把壓縮包裡面的*.dp*文件拖入對應的文件夾(其實這些*.dp*也是*.dll文件,只不過改了個後綴名讓x64dbg知道這裡有個插件)
比如裝32位x64dbg的插件,就將*.dp32拖入x64dbg\\x32\plugins
x64dbg實際操作:
1.查看函數調用時的參數:
首先你需要明白什麼是調用約定,這些需要百度
現在我使用32位x64dbg調試一個unpackme,在mscorwks.dll的AssemblyNative::LoadImage處下了斷點,按下F9,x64dbg在此函數入口處斷下了
在符號窗口可以看到這個函數的調用約定是fastcall
我們回到CPU,把調用約定改成fastcall
這裡的1,2,3就是代表了第1,2,3個參數
我們剛才已經看到了,這個函數第一個參數是"Array<unsigned> *",表示指向了一個字節數組,這裡的"unsigned char"等同於C#/VB.NET中的"byte",而不是C#/VB.NET中的"char"/<unsigned>
2.轉儲內存到文件:
我們在內存窗口中按下Ctrl+G,輸入0312BBAC
成功跳轉到了一個內存區域,儲存了"Array<unsigned>"/<unsigned>
我們點一下4D或者M
再將右邊滾動條滾到底部,按住Shift,在左鍵單機一下最後一個字節
這樣,你就把一個.NET程序集人工Dump下來了
dnSpy打開看看,是個沒啥用的程序集(這個僅僅是演示,AssemblyNative::LoadImage斷點有時是很有用的)
閱讀更多 學點乾貨 的文章