來個新手學習脫殼的入門篇吧(結合娃娃的Wom新KG)
前 言
細細回憶,學習Crack技術已經快2個月了,期間我學會的東西遠比我以前任何一年內學的東西都多(專指計算機程式及系統瞭解情況)
說到學脫殼也是最近一個月的時間,開始總是到處詢問學習脫殼的方法,大多的答案就是看雪老大的書,誰也沒有正面回答過.於是就自己摸索,略有一點思路,老大們估計是認為理所當然,對於我們小菜來說還是說白了比較合適.
在這裡我就班門弄斧一回,其實主要也是幫助一些朋友能更快的摸到門,不至於對只會照貓畫虎,這些也是我當初我想問的那些問題的答案,都是些很基礎的東西,說得不好還請高手指正.
在此感謝看雪老大提供瞭如此之好論壇供大家學習交流,還寫了一本很好的書指導像我這樣的菜鳥,也感謝網上眾多高手貢獻出自己的脫殼手記,特別感謝heXer老大對本菜鳥的細心指點!
順便說一句,脫殼特別需要的是興趣和耐心,如果沒有耐心就......;)
廢話了一堆,我們下面進入正題:)
結合娃娃Wom的新KG說說一般面對一個殼的簡單分析方法
一、找OEP
脫殼的一般流程是:查殼->尋找OEP->Dump->修復
查殼沒什麼好說的,FI和PEiD,不幸的是FI和PEiD都不能識別出這個殼:)
我找OEP的一般思路如下:
先看殼是加密殼還是壓縮殼,壓縮殼相對來說容易些,一般是沒有異常,找到對應的popad後就能到入口,跳到入口的方式一般為
1、 jmp OEP
2、 push OEP
ret
3、 call OEP
當然也有其他的,如 je OEP等等,一般都是段之間的大跳轉,OD的反彙編視窗裡都是同一個段的內容,所以更好區別是否是段間跳轉
『這裡我說說關於F8(Step Over)和F7(Step in)的一般方法,粗跟的時候一般都是常用F8走,但是有些call是變形的Jmp,此時就需要F7代過,區別是否是變形Jmp的一個簡單方法是比較call的目標地址和當前地址,如果兩者離的很近,一般就是變形Jmp了,用F7走 』
對於加密殼,我的方法一般是用OD載入,鉤掉所有異常(不忽略任何異常,有時由於異常過多可以適當忽略一些異常),執行,數著用了多少次Shift+F9程式執行,顯然最後一次異常後,程式會從殼跳到OEP開始執行,這就是我們尋找OEP的一個關鍵,而對於這個殼可知是加密殼,Shift+F9 16次後執行,重來,Shift+F1 15次後到這
0042CBD3 ^73 DC jnb short kill_luj.0042CBB1
0042CBD5 CD 20 int 20
0042CBD7 64:67:8F06 0000 pop dword ptr fs:[0] <---這裡
一般的處理方法是找到pop fs:[0]處下斷點或者是[esp+4]處下斷點,如果學習一下SEH的處理會更好些
0012FF58 0012FFE0 Pointer to next SEH record
0012FF5C 0042CBB7 SE handler <---這裡一般包含Anti-Debug的程式碼
0012FF60 0042CB8A RETURN to kill_luj.0042CB8A from kill_luj.0042CB90
我首選第一種,在0042CBD7處下斷之後,耐心的用F7走,因為變形call太多了...,關鍵注意一下往回跳的跳轉,尋找合適的位置跳出迴圈,有耐心的話你就能這樣走到OEP了;)
當然你也可以用另一個好東西――Trace,在Command裡來個tc eip<42b000 (42b000是當前段的起始位置,捲軸拖到最上面就能看到了,一般程式編譯的基地址為400000),OK,稍等一會我們就會停在這了(如果是ASPr可能要幾分鐘了)
00419F68 55 push ebp <----停在這
00419F69 8BEC mov ebp, esp
00419F6B 83C4 F0 add esp, -10
呵呵,OEP找到了;)
當然,這個用PEiD就能找到OEP,比較一下,是不是一樣:D,對於用PEiD找到的OEP可以直接G到OEP
此時就可以Dump了,用LordPE來Dump吧,由於有Anti-Dump,所以要先Correct Imagesize一下再Dump
二、修復IAT
由於加密殼對輸入表進行了重定位,所以現在的檔案還不能正常使用,我們的目標就是恢復它,先用ImportREC,填入正確的OEP, IAT AutoSearch, Get Import,無效的不少,Show Invalid, 右鍵->Trace Level1(Disasm),失敗!!看來是隻有自己恢復了。記下IAT的地址0001C128
好,重新執行,在OD的Dump視窗裡Go to Expression,到0041C128,盯著它默默數著按了多少次Shift+F9,在第13次後發現0041C128變了,而且和最後到OEP處一樣,可見剛才殼修復了IAT也順便破壞了IAT,於是我們重來,Shift+F9 12次以後按照前面說的方法跳過異常,這裡我們可以在0041C128處選擇用記憶體斷點或硬體斷點,如Memory, On Write, On Access,Hardware,On Access等,我用Memory On Write,在殼幾次解碼IAT以後(0041C128處變了好幾次),我們可以到這裡
0042C7C7 60 pushad
0042C7C8 8327 00 and dword ptr ds:[edi], 0 <----停在這
0042C7CB 8B85 5B314000 mov eax, dword ptr ss:[ebp+40315B]
0042C7D1 40 inc eax
0042C7D2 0F84 A8000000 je kill_luj.0042C880
0042C7D8 80A5 04294000 FF and byte ptr ss:[ebp+402904], 0FF
0042C7DF 0F84 9B000000 je kill_luj.0042C880 <----這個地址跳轉就不被破壞
0042C7E5 80A5 05294000 FF and byte ptr ss:[ebp+402905], 0FF
0042C7EC 0F84 8E000000 je kill_luj.0042C880
0042C7F2 8B85 5F314000 mov eax, dword ptr ss:[ebp+40315F]
0042C7F8 8907 mov dword ptr ds:[edi], eax <-----看這裡,被破壞了;)
再看一下eax的值,
eax 77F525CA ntdll.DeleteCriticalSection
很不錯的樣子:D,IAT的重定向已經找到了,正常修復IAT在哪裡呢??多跟幾回,就會發現是在這
0042C880 61 popad <---前面的je就是跳到這
0042C881 3107 xor dword ptr ds:[edi], eax <---OK,到這就好了
0042C883 58 pop eax
於是乎,修改je為jmp,IAT就不會被破壞了,再到OEP處用ImportREC修復就好了
這裡我說的似乎很輕鬆,其實這些東西要靠跟出來的,下面是一些我找到的關鍵點的分析
首次解碼IAT 0042c3ef
解碼 Dll Name 0042c4ea -> 解碼出正確 Dll Name
Clear dll Name 0042c645 -> 清除 Dll 的名字
0042c6ac -> 解碼出正確 First Thunk
0042c66d -> 解碼出正確 First Thunk
最後解碼IAT 0042c693 -> 解碼出正確的RVA 指向函式名
ReDirect 0042c7c8 -> Import 重定向, 這裡會置0 必經路線
0042c7f8 -> Import 重定向, 這裡指向殼裡
Normal 0042c881 -> 不重定向時正常輸入表地址
Clear Function Name 0042c88d -> 清除 函式 名字
Repair IAT Over 0042c8fa -> BreakPoint 到這裡IAT修復完成
解碼 dll 名的那段程式碼沒仔細找;),你如果有興趣可以找找
當然再有興趣的朋友可以自己新增程式碼修復IAT,這樣就可以不用ImportREC,手動修復IAT
一般來說殼到這就差不多了,不過也會有某些變態殼要修修補補,這就沒法說了也超出了本文的範圍了
後 記
我本人對於對於脫殼的思路大致就是如此,當然對於某些特殊殼還需要特殊待遇:D,我希望本文代給朋友的不是娃娃這個KG的殼如何脫,而是能更好的理解殼,理解如何分析殼,脫殼。也能更好的理解大俠手記裡一些不易理解的地方。例如本殼實際使telock的變形殼,如果忽略單步異常,5次Shift+F9執行,第4次按Shift+F9時就會修復和破壞IAT,從而能理解為什麼要在5-2=3次後查詢IAT(這個問題我就迷茫過一陣子)
最後列一列我未玩過的殼,哪位大俠有相關的經驗交流交流
DBPE 國產精品,一直未動過,據說常會讓機器重啟……
SVKP 有時間玩玩
Armadillo 新的3.40 CopyMem II沒玩過,據說難度比以前更難了:(
Obsidium 分段加密的猛殼,好像還沒見過相關的手記
ACProtect 感覺和ASPr有點象,另一個國產精品,不過現在怎麼沒有中文的介面了?
這麼多沒玩過......,不寫了,沒前途
我的e-mail:shinegood@163.com,歡迎多多指教交流
QQ:31536111 Cracker為暗號:)
相關文章
- iOS逆向學習之五(加殼?脫殼?)2019-10-10iOS
- JavaScript新手入門學習系列2020-11-25JavaScript
- 寫給新手
- 淺談脫殼方法2004-12-18
- 想開發iPhone App?來看看這個6個適合新手的專案吧2014-12-26iPhoneAPP
- EZIP1.0脫殼手記 ――娃娃/[CCG] (3千字)2001-11-16
- 給學習 OpenStack 架構的新手入門指南2016-08-25架構
- 殼的工作原理脫殼2013-04-10
- 廖雪峰JS學習總結-入門篇2017-03-08JS
- 如果你也剛入門React,來一起學習吧2018-09-05React
- 這裡是強化學習入門,的入門 | 絕對新手友好2018-04-05強化學習
- 新手入門前端,需要學習的基礎內容。2020-10-16前端
- 如何學習Python,新手如何入門2021-04-07Python
- Java新手入門學習路線圖2020-11-20Java
- 前端學習小結(一)—基礎入門篇2016-12-19前端
- APK加固之靜態脫殼機編寫入門2015-10-30APK
- 結合例項學習F#(一) --快速入門2009-08-12
- 適合新手入門Spring Security With JWT的demo2019-09-28SpringJWT
- 天草脫殼視訊學習筆記(逆向 OD)2013-05-30筆記
- 來自Java程式設計師的Python新手入門小結2021-12-28Java程式設計師Python
- 逆向基礎——軟體手動脫殼技術入門2020-08-19
- Linux系統新手入門學習的四點建議2019-08-18Linux
- 新手學習Java,如何快速從入門到精通!2022-01-19Java
- 新手入門之——Linux學習基礎(轉)2007-08-12Linux
- pandas 學習筆記 (入門篇)2019-10-18筆記
- 新手學習 Vim 的五個技巧2016-08-04
- 推薦:一個適合於Python新手的入門練手專案2019-01-03Python
- 半個前端新手入門Electron的過程2023-02-01前端
- Web前端入門的學習路線總結2021-05-19Web前端
- 非常適合小白入門的Python學習路線2020-09-18Python
- Latex排版學習筆記(2)——Latex新手入門教程2020-04-05筆記
- 脫殼----對用pecompact加殼的程式進行手動脫殼
(1千字)2000-07-30
- Jwt的新手入門教程2021-09-21JWT
- Linux 學習:入門十法篇2019-07-28Linux
- 來入門一下kotlin吧2018-08-22Kotlin
- Linux新手入門怎麼學?如何學習好Linux?2020-04-23Linux
- 一個適合初學者學習Web開發的網站(入門到精通)2016-03-12Web網站
- Android程式猿的react學習之路-入門指南篇2016-03-07AndroidReact
- 壹次脫殼法――Armadillo 雙程式標準殼 快速脫殼2015-11-15