[.NET逆向] 【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解 [复制链接]
生活随笔
收集整理的這篇文章主要介紹了
[.NET逆向] 【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解 [复制链接]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://www.52pojie.cn/thread-439154-1-1.html?t=1451911355271
前言:自從脫殼神器de4dot橫空出世以來,我們可以看到幾乎所有的.net破文中的第一部分就是不管三七二十一把程序丟進去脫殼以及反混淆。可是你真的明白de4dot背后做了些什么嗎?你對.net文件格式真的了解嗎?如果這么好的開源工具大家都不去研究代碼,實在是令人惋惜,以至于還在有人在論壇詢問 Reactor最新版怎么脫的問題,也有的在論壇上斷言MaxtoCode可以難倒99%的人……我想善于從基礎學起,善于研究大神源碼,真正搞懂de4dot背后所做的工作,那么這些問題都不算什么問題。這篇文章有點長,希望你能細心讀下去,而且我相信你一定會有很大的收獲,請不要糾結于為什么照著我的教程做也不能脫掉類似的其他殼,你應該捫心自問,教程的每一步你都理解了嗎?你能否利用這些知識進行變通?希望你不要做一個伸手黨,而是去真正去理解工具背后的工作。
雖然de4dot很牛,但總有些殼它也是無論為力的,比如我們今天要討論的這個。由于我很長時間都沒有上論壇,因此錯過了很多精彩的.net內容,還好希望現在還不晚。---------------------------------分割線,以下部分為原貼內容-------------------------------
【.NET】UnPackMe!Shielden+DNGuard,雙層變異殼 By:涼游淺筆深畫眉
http://www.52pojie.cn/thread-340591-1-1.html?
脫殼目的:
1.脫掉Shielden? ?難度系數分 ★
2.修復脫掉Shielden之后一系列問題(如區段錯亂,PE入口,亂碼,程序體積過大等),使程序正常運行, 難度系數分 ★★★
3.脫掉Dnguard Hvm,并修復其各種問題使之能正常運行,難度系數分★★★★★
4.反編譯能正常看到源碼(僅限Reflector,別的反編譯工具糾錯能力較強,不適合練手....),難度系數分★★★
注:If you got it ! Welcome to Join Matrix !
-------------------------------------------分割線---------------------------------------------------
這個殼的難度系數非常高,以至于畫眉大俠對其寄予厚望,看介紹說:誰能脫掉的,就可以加入Matrix? 那么加入了這個Matrix,能否獲得畫眉大俠的Dnguard HVM企業版的使用權? 想想還是有點小激動呢。但是由于的難度極高,修復難度極大,以至于在原帖中 沒有人 能及時提供一個明確的解決方案。那么現在請大家跟我一起來解密。
老辦法,運行程序,用先在內存中抓。 為什么要從內存中抓?因為有些加密的東西,總歸會在內存中解密出來,這樣可以最大限度的獲得解密后的數據。
很不幸,剛打開程序就報了一個這樣錯誤:
?
原來是DNGuard HVM試用版過期了,難道我們真的要像原帖中ghostfish描述的一樣放棄了嗎?
?
其實吧,我們還有系統自帶的“月光寶盒”可以用。看看發帖時間是2015年3月17日,那么我們只需要把系統時間修改為3月17日,就可以順利打開了。讓程序跑起來后,我們準備在內存抓,其實這樣的工具有很多,使用起來都大同小異,比如上一篇文章中我說的Task Explorer,還有WinHex也是可以的。今天我再推薦一款DOTNET專用的工具,因為我發現這個工具自帶一定的修復功能。那就是DOTNET Dumper,其實吾愛論壇上也有 http://www.52pojie.cn/thread-67257-1-1.html , 但是這個版本脫殼時會報錯,其版本號是1.0.3936.41928。 我手上的是版本1.0.3938.31576,可以順利脫殼,可以在附件中下載。其實用什么工具都是一樣的,不過如果用Task Explorer需要自己再多修復些東西。
?
找到進程,然后點擊右鍵Dump。
?
Dump了7個文件,我們來看看。
?
那個2.0.50727.42的描述字眼實在太顯眼了,明顯是系統的DLL文件,那么我們只保留dump1.exe 其他的全部刪掉。然后記得把DNGuard的原始HVMRuntm.dll文件放到dump后的目錄中。我們用CFF打開看看這個dump1.exe。
?
打開Section Headers[x]發現了.HVMRunt 這種奇怪的東西。 記住了:.net一般就三個默認的 .text, .?IDAta 和 .rsrc 以后發現不是這三個全部刪掉! 在相應的Section上點擊右鍵使用 “Delete Section (Header And Data)“
再看看Import Directory
?
記住了,.net默認就導入一個mscoree.dll,其他的全部刪掉。 如果換種場景,一個導入函數都沒有怎么辦?那么可以使用Universal Fixer勾選fix import修復。
將上面的刪除后,保存。直接運行程序看看。啊哈哈哈,程序居然可以直接運行了!!!!
?
可是,不要高興的太早。為什么是亂碼??????不錯,我可以確信90%的人會卡在這里,走不下去了。請參考原帖, 我驚奇的發現連二樓Falcon_2015這樣的.net高手也卡在了這里……
?
根據我對于DNGuard 的多年研究,出現上圖右邊所示的錯誤:“試圖使用鏈地址信息(有2個以上的節或有一個TLS節的IAT)加載無法驗證執行文件”,多半是由于入口點位置不正確引起的。而亂碼則是由于dump過程中,沒有處理好字符串解密函數導致的。因此上圖中Falcon_2015在第3步解釋的不準確,真實情況是:DNGuard脫殼和亂碼沒有任何關聯,也就是說,就算是亂碼,DNGuard也是可以被脫殼的。一個是字符串解密函數的問題,一個是入口點不正確的問題,這分別是兩個問題,且沒有關聯。
我們來用CFF打開脫殼后的程序再次觀察一下:
?
再研究研究字符串怎么解密。看原帖第三樓,畫眉的回復:
?
畫眉原文:“你需要Hook Jit 解碼”。
我等菜鳥,被Hook Jit的字樣已經嚇尿…….是的,在dump過程中,由于沒有考慮到字符串解密函數的原因導致dump后出現亂碼。這也是DNGuard加載雙殼的一大特征,根據我最近分析各種畫眉大俠的unpackme的經驗,他比較喜歡的做法就是先用DNGuard加一層強殼,且在此殼中使用字符串加密。然后外面再加一層殼,當你脫去外面這層殼的時候,打開程序后字符串就會變成亂碼。不相信的人,你們自己去用DNGuard加兩層殼試一試。
說句實話,我在這里也卡了很久。但是我不甘心,我想做剩下10%的人可以繼續解密,我是一個工具黨,但是我找遍網絡也沒有找到合適的工具來解決這個問題。每次當我找不到工具的時候,我就會決定自己寫個工具,便把de4dot的源代碼重溫了一遍,終于基于de4dot源碼開發出一個小工具。為了方便大家今后遇到同樣的問題,我直接把工具奉上。
這個工具除了可以解決DNGuard的亂碼問題外, 還可以修復入口點,是的,可以修復任意.net程序被破壞的掉的入口點 。我已經考慮到4種被破壞入口點的情況,所以通用性應該還是不錯的。原理嘛,畫眉也說了: ? http://www.52pojie.cn/thread-383915-1-1.html? 你沒看懂也沒關系,用了我這個工具你再也不用為無法修復.net入口點而苦惱了。
如下圖,把兩個勾都選上,注意在修復亂碼過程中,需要選擇未脫殼的原始文件。
?
點擊開始修復,修復完成后,再用CFF打開看看。
?
但是注意,打開Data Directories[x]項看看,此處還有一處錯誤:
?
請按照上圖所示,將Debug Directory RVA的值直接修改為0,然后保存。
運行再次修復的程序看看。
?
亂碼問題解決了,入口點問題也解決了。但是,別忘了,我們才剛剛把第一層殼脫完。好在這個程序是DNGuard的試用版,因此直接用已有的工具脫殼DNGuard HVM Unpacker。 http://www.52pojie.cn/thread-320711-1-2.html
啊,脫殼失敗了,報錯。一個新的錯誤,但是已經不是“試圖使用鏈地址信息(有2個以上的節或有一個TLS節的IAT)加載無法驗證執行文件”的錯誤了。
?
這個問題比較好修復,直接用Universal Fixer,只修復.net那塊的:
?
再拿出DNGuard HVM Unpacke來脫再次修復的文件。
?
成功了!!!!!!!趕緊拿出ILSpy來看看,源碼出現了!!!
?
激動!!!!!太激動了!!!
運行程序看看:
?
出錯了!!!!What’s the Fuck!!!!!!!對不起,我罵人了,因為被折騰的受不了!!!!
經常搞.net開發的人應該知道,這個問題多半是由于配置文件或者資源不正確引起的。用CFF看看資源情況:
?
脫殼工具將部分資源弄丟了,導致無法運行。修復這里的資源很麻煩,還需要重新定位RVA地址。本文將介紹一種快捷的辦法,那就利用微軟自帶的ILDASM和ILASM,先進行反編譯,再編譯回去。
但是我們發現在編譯回去的過程中,遇到了如下錯誤。
xxx.il(553) : error : syntax error at token '[' in:? ???IL_0002:??newobj? ?? ?[ERROR: INVALID TOKEN 0x0A80003A]
于是代開il文件,找到553行。因為已經脫殼,因此直接把這些非法的地址全部在代碼中注釋掉,不會對程序有影響:
?
繼續用ilasm編譯,發現新的錯誤
xxx.il(605) : warning : Non-nested class has nested visibility (0x001035A7), changed to non-nested (0x001035A0)
xxx.il(606) : error : Base class in interface
于是找到第606行
把下面整個這段代碼刪掉:
.class interface abstract import serializable sealed nested famorassem beforefieldinit specialname rtspecialname $TD$7
? ?? ? extends [mscorlib]System.Object
{
} // end of class $TD$7
保存后再用ilasm編譯,就可以編譯成功了。
運行,完美,沒有錯誤!!至此脫殼完成。
脫殼前大小:793KB,需要HVMRuntm.dll運行庫。脫殼后8K,不需要運行庫。
好了,看完本教程的人都可以拿著脫殼后的文件去找畫眉加入Matrix了。
文中所有工具列表:
1. CFF: http://www.ntcore.com/exsuite.php
2. Universal Fixer : http://www.52pojie.cn/thread-82492-1-1.html?
3. DNGuard HVM Unpacker。 http://www.52pojie.cn/thread-320711-1-2.html
4. ILDASM/ILASM 微軟VS2010以上版本自帶 DOTNET4.0的反編譯/編譯工具。
5. Donet Dumper, 亂碼及入口點修復工具(本人作品),脫殼后的文件:? ? Tools.rar?? (有bug會再更新,最后更新時間2015-11-28 19:34)
6. unpackme原文件:? ? UnpackMe.rar?? (注意,原始unpackme殺毒軟件報毒,為安全起見,請在虛擬機下運行。非本人軟件,不能保證其安全性)
總結
以上是生活随笔為你收集整理的[.NET逆向] 【.NET】UnpackMe!Shielden+DNGuard,双层变异壳 - 脱壳详解 [复制链接]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中二进制与十六进制的转换
- 下一篇: Java俄罗斯方块思想与实现