Encyrptpe 2003.5.18主程序Unpacking tut

EnCryPtPE 2003.5.18主程序的脫殼
【目    標】:EnCryPtPE 2003.5.18主程序
【工    具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任    務】:脫馬甲
【操作平臺】:Windows Xp sp1
【作    者】:loveboom[DFCG][FCG][US]
【簡要說明】:不打算髮布出去,只是當做自己以後參考用而已
【詳細過程】:
設置:
忽略全部異常,其它選上加上0EEDFADE和C0000008(INVALID HANDLE)兩個異常地址並隱身先.
第一步:找程序的OEP
準備好後,我們先找到OEP對後面有用的.
004B7000 >  60              PUSHAD                     ;殼的入口
004B7001    9C              PUSHFD
載入後並設置好然後按f9運行,出現那個很長時間的異常
後.取消int3異常,這裏要等很久的,可以先去做一點別的事.N久之後,在INT3處異常中斷了.
7119CF58    90              NOP                     ;第一次斷在這裏
7119CF59    64:8F05 0000000>POP DWORD PTR FS:[0]
下按一次shift+f9進入第二次int3異常中斷:
7119CF58    90              NOP                     ;第二次也是斷在這裏
7119CF59    64:8F05 0000000>POP DWORD PTR FS:[0]
7119CF60    C3              RETN
現在打開內存頁面,在程序所在段處下F2斷點:
然後再按一次程序就斷在程序的oep處了:
現在再找一下輸入表的位置,隨便選一處就行了:
00406AA0    90              NOP                    ;我找的是這裏
00406AA1  - E9 7EB3AB00     JMP 00EC1E24
第一步也就算完成了,這一步要記下程序的OEP: 499780,和00406aa0那個地址,看一下就知道殼改了東西,讓IAT跳到殼裏去了,後面還有很長一段,直接修復嗎?當然不是了,重來準備修復程序的代碼了.
 
第二步:修復程序代碼
 
再次載入後同樣在那個很長時間的時候,在00406AA0處下內存訪問中斷.
711A451A    8B07     MOV EAX,DWORD PTR DS:[EDI]           ;第一次斷下
711A451C    8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]
711A451F    83F2 FF         XOR EDX,FFFFFFFF
……
711A4569    66:8B03         MOV AX,WORD PTR DS:[EBX]               
 ; 第二處中斷處
好了,現在我們要記下711A4569這個地址,再來一次,在711a4569處下一下硬件執行斷點,因程序一開始沒有711a4569這個地址,所以我們要讓程序運行一會兒,然後就可以下斷了.
711A456C    66:3D FF25      CMP AX,25FF
711A4570    74 0B           JE SHORT 711A457D
711A4572    66:3D FF15      CMP AX,15FF
711A4576    74 05           JE SHORT 711A457D
711A4578    E8 EF7BF8FF     CALL 7112C16C
711A457D    8B7D FC         MOV EDI,DWORD PTR SS:[EBP-4]             ; EncryptP.0049D250
711A4580    8B37            MOV ESI,DWORD PTR DS:[EDI]
;這裏要改我們的東西了,所以這時改成mov esi,edi
711A4582    81FE 00000080   CMP ESI,80000000
711A4588    72 05           JB SHORT 711A458F
711A458A    E8 DD7BF8FF     CALL 7112C16C
711A458F    66:813B FF25    CMP WORD PTR DS:[EBX],25FF
;這裏判斷是不是跳去api的了,如果是就改代碼。
711A4594    75 07           JNZ SHORT 711A459D
;所以我們這裏就要改成 jmp 711a459d
711A4596    66:C703 90E9    MOV WORD PTR DS:[EBX],0E990
;這裏把正常的東西填成jmp xxxx nop的方式了
711A459B    EB 05           JMP SHORT 711A45A2
711A459D    66:C703 90E8    MOV WORD PTR DS:[EBX],0E890
;這裏也要改,否則變成了call xxxx,nop的方式,所以這裏要nop掉
711A45A2    8B5D E8         MOV EBX,DWORD PTR SS:[EBP-18]
711A45A5    83C3 06         ADD EBX,6
711A45A8    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]
711A45AB    03C0            ADD EAX,EAX
711A45AD    03D8            ADD EBX,EAX
711A45AF    8B45 E8         MOV EAX,DWORD PTR SS:[EBP-18]
711A45B2    8B38            MOV EDI,DWORD PTR DS:[EAX]
711A45B4    0FB703          MOVZX EAX,WORD PTR DS:[EBX]
711A45B7    2D 00300000     SUB EAX,3000
711A45BC    03F8            ADD EDI,EAX
711A45BE    037D DC         ADD EDI,DWORD PTR SS:[EBP-24]
 
711A45C1    2BF7            SUB ESI,EDI    ;********
711A45C3    83EE 04         SUB ESI,4                   ;********
;這裏兩行又是進行破壞操作,nop掉去
711A45C6    8937            MOV DWORD PTR DS:[EDI],ESI
711A45C8    33C0            XOR EAX,EAX
改好後的圖如下:
修改完成後,取消剛纔的硬件斷點.再和第一步一樣到oep處,現在我們看看發生了什麼變化:
00406AA0  - FF25 50D24900   JMP DWORD PTR DS:[49D250]               ;怎麼樣,已經改好了代碼吧
00406AA6    8BC0            MOV EAX,EAX
00406AA8  - FF25 4CD24900   JMP DWORD PTR DS:[49D24C]
現在把程序給dump下來.進入第三步.
 
第三步:修復程序的輸入表
 
現在就差輸入表沒有處理了.現在我們再次載入程序,然後在我們前面記下的OEP的那個地址處下內存訪問斷點然後運行之,結果在這裏斷下了:
71122943    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
71122945    89C1            MOV ECX,EAX
 
斷下後,取消內存訪問斷點,下MR GetProcAddress,的內存訪問斷點。再次運行,斷下了:
在7119D30C處斷下後,按ctrl+B找334DFC89088955F8,找到這裏:
711A3385    334D FC         XOR ECX,DWORD PTR SS:[EBP-4]
;這裏改成mov ecx,ss:[ebp-4]
711A3388    8908            MOV DWORD PTR DS:[EAX],ECX
711A338A    8955 F8         MOV DWORD PTR SS:[EBP-8],EDX
;這裏又是進行破壞,NOP掉這裏
711A338D    85FF            TEST EDI,EDI
 
改好後的情況:
改好後,去掉所有的內存斷點,並下斷HE 711a4569,並運行之,再次中斷後,我們可以得到完全的輸入表了.現在看看iat的位置和大小,大小可以不算,寫一個可以得到全部IAT的大概值就OK的.
我是偷懶我選擇的是iat開始地址: 9d160(RVA),大小爲1000,然後把無效的給cut掉J.
這好了,現在填上oep然後fixdump就行了.
現在程序就可以正常運行了.
後面的就不再寫了.
改進一下我自己上次的脫殼方法,直接在EPE0段下F2斷點,斷下後下斷mr getprocaddress,再然如果不是中斷在GetProcaddress入口處的話,找:
711A3385    334D FC         XOR ECX,DWORD PTR SS:[EBP-4]
;這裏改成mov ecx,ss:[ebp-4]
711A3388    8908            MOV DWORD PTR DS:[EAX],ECX
711A338A    8955 F8         MOV DWORD PTR SS:[EBP-8],EDX
 
 
 
Greetz:
 Fly.Jingulong,yock,tDasm.David.ahao.UFO(brother).alan(sister).all of my friends and you!
 
By loveboom[DFCG][FCG]
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章