2011年5月19日 星期四

新手學習脫殼的入門篇

    

細細回憶,學習Crack技術已經快2個月了,期間我學會的東西遠比我以前任何一年內學的東西都多(專指電腦程式及系統瞭解情況 



說到學脫殼也是最近一個月的時間,開始總是到處詢問學習脫殼的方法,大多的答案就是看雪老大的書,誰也沒有正面回答過.於是就自己摸索,略有一點思路,老大們估計是認為理所當然,對於我們小菜來說還是說白了比較合適 

在這裡我就班門弄斧一回,其實主要也是幫助一些朋友能更快的摸到門,不至於對只會照貓畫虎,這些也是我當初我想問的那些問題的答案,都是些很基礎的東西,說得不好還請高手指正 



在此感謝看雪老大提供了如此之好論壇供大家學習交流,還寫了一本很好的書指導像我這樣的菜鳥,也感謝網上眾多高手貢獻出自己的脫殼手記,特別感謝heXer老大對本菜鳥的細心指點 



順便說一句,脫殼特別需要的是興趣和耐心,如果沒有耐心就......;)  



廢話了一堆,我們下面進入正題:)  

結合娃娃Wom的新KG說說一般面對一個殼的簡單分析方法  



一、找OEP  

脫殼的一般流程是:查殼->尋找OEP->Dump->修復  

查殼沒什麼好說的,FIPEiD,不幸的是FIPEiD都不能識別出這個殼:)  



我找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可以直接GOEP  



此時就可以Dump了,用LordPEDump吧,由於有AntiDump,所以要先Correct Imagesize一下再Dump  



二、修復IAT  

    
由於加密殼對輸入表進行了重定位,所以現在的檔還不能正常使用,我們的目標就是恢復它,先用ImportREC,填入正確的OEP, IAT AutoSearch, Get Import,無效的不少,Show Invalid, 右鍵->Trace Level1(Disasm),失敗!!看來是只有自己恢復了。記下IAT的地址0001C128  

    
好,重新運行,在ODDump視窗裡Go to Expression,0041C128,盯著它默默數著按了多少次Shift+F9,在第13次後發現0041C128變了,而且和最後到OEP處一樣,可見剛才殼修復了IAT也順便破壞了IAT,於是我們重來,Shift+F9 12次以後按照前面說的方法跳過異常,這裡我們可以在0041C128處選擇用記憶體中斷點或硬體中斷點,如Memory, On Write, On AccessHardwareOn 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  

很不錯的樣子:DIAT的重定向已經找到了,正常修復IAT在哪裡呢??多跟幾回,就會發現是在這  

0042C880    61                popad        <---
前面的je就是跳到這  

0042C881    3107              xor dword ptr ds:[edi], eax      <---OK
,到這就好了  

0042C883    58                pop eax  

於是乎,修改jejmpIAT就不會被破壞了,再到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的變形殼,如果忽略單步異常,5Shift+F9運行,第4次按Shift+F9時就會修復和破壞IAT,從而能理解為什麼要在5-2=3次後查找IAT(這個問題我就迷茫過一陣子)  



    
最後列一列我未玩過的殼,哪位大俠有相關的經驗交流交流  

      DBPE        
國產精品,一直未動過,據說常會讓機器重啟……  

      SVKP        
有時間玩玩  

      Armadillo    
新的3.40 CopyMem II沒玩過,據說難度比以前更難了:(  

      Obsidium    
分段加密的猛殼,好像還沒見過相關的手記  

      ACProtect    
感覺和ASPr有點象,另一個國產精品,不過現在怎麼沒有中文的介面了?  

      
這麼多沒玩過......,不寫了,沒前途  


沒有留言:

張貼留言