International CueClub主程式脫殼(Softwrap殼)

看雪資料發表於2004-09-12


下載地址:  ftp://195.23.131.73/.disk1/gamin ... nationalCueClub.exe
軟體大小:  20.4 M 
是Softwrap殼,只能試用3次


International CueClub.exe的程式碼基本沒有被破壞,只是iat表的和跳轉表被Softwrap殼修改到殼中解密。
這個殼的難度是殼的解密程式碼是殼執行時的申請空間裡的,好在這個地址是由幾個固定的段中組成的。
現在的問題是怎麼把這些程式碼放的程式的執行時可見段中來執行,因為到入口處dump下的檔案中沒有了
申請的臨時段,這時如果把臨時段的程式碼複製到執行時可見段中也不能正確執行,因為解密的程式碼是根據
申請段的地址偏移量來計算的,如果簡單的複製地址偏移量不正確就無法解密出來正確的iat跳轉地址。
   如何在程式的可見段中得到完全正確的解密程式碼就是脫殼的方向,下面就沿著這個思路來解決這個問題:
    跟蹤程式發現幾個解密段分別是01050000、01060000、01070000、01080000、和01090000五個段,並且
發現前四個段是在殼的第一部分中完成的,最後一段是在殼的第二部分完成的。這個中間是殼的sdk方式連線的
anti_debug dll(Softwrap.dll),這個dll會檢測偵錯程式和跟蹤工具,以及完成crc效驗等。
在OD中計算這五個段的長度是1000+1000+6000+1000+1000=A000k,在程式的可見段中始終沒有找到適合存放
這些程式碼的地方(我第一個脫的程式把他們放到了程式的data段中的後面發現程式執行時會修改data段是所有資料
程式無法執行),最後只好在殼的程式段後面用LordPE增加一個A000k的段,為了這個增加的段會增加許多的效驗問題
需要逐步的解決。
   下面具體來看看:
用OD載入International CueClub.exe主程式,在異常視窗中選擇忽略 單步中斷 、整數被零除異常。Alt+E開啟模組
視窗,選擇kernel32 (system)這個dll,Ctrl+N開啟kernel32 (system)dll中的所以函式名稱視窗,在這個視窗中
查詢VirtualAlloc這個函式,雙擊來到這個函式的入口:

程式碼:
77E5AC72 >PUSH EBP 77E5AC73  MOV EBP,ESP 77E5AC75  PUSH DWORD PTR SS:[EBP+14] 77E5AC78  PUSH DWORD PTR SS:[EBP+10] 77E5AC7B  PUSH DWORD PTR SS:[EBP+C] 77E5AC7E  PUSH DWORD PTR SS:[EBP+8] 77E5AC81  PUSH -1 77E5AC83  CALL kernel32.VirtualAllocEx 77E5AC88  POP EBP 77E5AC89  RETN 10

在第一行下記憶體訪問中斷斷點,記住不能用F2下斷點。
   為什麼要對這個函式下斷點?因為殼用這個函式來申請臨時空間存放解密程式碼的所以必須對這個函式下斷點。

F9執行程式,首先被中斷在:
程式碼:
009D2ABF  MOV AL,BYTE PTR DS:[EAX] 009D2AC1  ADD AL,0F 009D2AC3  JE SHORT Internat.009D2AD6 009D2AC5  NEG AL 009D2AC7  SUB AL,23 009D2AC9  JE SHORT Internat.009D2AD6 009D2ACB  DEC AL 009D2ACD  JE SHORT Internat.009D2AD6 009D2ACF  DEC AL 009D2AD1  JE SHORT Internat.009D2AD6 009D2AD3  CLC 009D2AD4  JMP SHORT Internat.009D2AF7

這是可對這個函式的前幾個位元組驗證,所以只能下記憶體訪問斷點。
F9繼續執行,這次會中斷在函式的入口中:
程式碼:
77E5AC72 >PUSH EBP                                 ; Internat.009D1688 77E5AC73  MOV EBP,ESP 77E5AC75  PUSH DWORD PTR SS:[EBP+14] 77E5AC78  PUSH DWORD PTR SS:[EBP+10] 77E5AC7B  PUSH DWORD PTR SS:[EBP+C] 77E5AC7E  PUSH DWORD PTR SS:[EBP+8] 77E5AC81  PUSH -1 77E5AC83  CALL kernel32.VirtualAllocEx 77E5AC88  POP EBP 77E5AC89  RETN 10

殼現在用這個函式申請臨時空間了。執行到RETN 10處時發現EAX=01050000,這就是申請的臨時段地址,用滑鼠雙擊EAX
修改這個值=009D6000 (增加的段中),繼續執行再次被中斷在這個函式中,發現EAX=01060000,這是申請的第二個臨時
段,雙擊EAX修改這個值=009D7000,再次執行會再次中斷在這個函式中,發現EAX=01070000,修改這個值=009D8000,又
一次執行中斷後發現EAX=01080000,修改這個值=009DD000。現在申請的段地址全部被修改到增加的段中了。

F9執行,被中斷在:
程式碼:
009D2ABF  MOV AL,BYTE PTR DS:[EAX] 009D2AC1  ADD AL,0F 009D2AC3  JE SHORT Internat.009D2AD6 009D2AC5  NEG AL 009D2AC7  SUB AL,23 009D2AC9  JE SHORT Internat.009D2AD6 009D2ACB  DEC AL 009D2ACD  JE SHORT Internat.009D2AD6 009D2ACF  DEC AL 009D2AD1  JE SHORT Internat.009D2AD6 009D2AD3  CLC 009D2AD4  JMP SHORT Internat.009D2AF7

殼又一次驗證這個函式的程式碼了。
F9繼續,到這裡:
程式碼:
009D30FA  MOV AL,BYTE PTR DS:[ECX] 009D30FC  INC ECX 009D30FD  OR EDX,DWORD PTR DS:[ESI+EAX*4] 009D3100  TEST DL,8 009D3103  JNZ SHORT Internat.009D30F7 009D3105  CMP AL,0F6 009D3107  JE SHORT Internat.009D313F 009D3109  CMP AL,0F7 009D310B  JE SHORT Internat.009D313F 009D310D  CMP AL,0CD 009D310F  JE SHORT Internat.009D314C 009D3111  CMP AL,0F 009D3113  JE SHORT Internat.009D3159 009D3115  TEST DH,80 009D3118  JNZ SHORT Internat.009D316C 009D311A  TEST DH,40 009D311D  JNZ SHORT Internat.009D3192 009D311F  TEST DL,20 009D3122  JNZ SHORT Internat.009D3178 009D3124  TEST DH,20 009D3127  JNZ SHORT Internat.009D3185 009D3129  MOV EAX,ECX 009D312B  SUB EAX,DWORD PTR SS:[ESP+28] 009D312F  AND EDX,707 009D3135  ADD AL,DL 009D3137  ADD AL,DH 009D3139  MOV DWORD PTR SS:[ESP+1C],EAX 009D313D  POPAD 009D313E  RETN


F9繼續,到這裡:
程式碼:
009D2CBF  PUSH EBP 009D2CC0  MOV EBP,ESP 009D2CC2  ADD ESP,-11C 009D2CC8  PUSHAD 009D2CC9  MOV EAX,DWORD PTR SS:[EBP+10] 009D2CCC  MOV DWORD PTR SS:[EBP-8],EAX 009D2CCF  MOV EAX,DWORD PTR SS:[EBP+C] 009D2CD2  MOV DWORD PTR SS:[EBP-C],EAX 009D2CD5  SUB EAX,EAX 009D2CD7  LEA EDI,DWORD PTR SS:[EBP-11C] 009D2CDD  MOV ECX,40 009D2CE2  REP STOS DWORD PTR ES:[EDI] 009D2CE4  LEA EDI,DWORD PTR SS:[EBP-18] 009D2CE7  STOS DWORD PTR ES:[EDI] 009D2CE8  LEA EDI,DWORD PTR SS:[EBP-1C] 009D2CEB  STOS DWORD PTR ES:[EDI] 009D2CEC  LEA EDI,DWORD PTR SS:[EBP-10] 009D2CEF  STOS DWORD PTR ES:[EDI] 009D2CF0  XCHG EAX,EBX 009D2CF1  CMP DWORD PTR SS:[EBP+14],0 009D2CF5  JE Internat.009D2DBD 009D2CFB  DEC DWORD PTR SS:[EBP+14] 009D2CFE  PUSH DWORD PTR SS:[EBP-8] 009D2D01  PUSH DWORD PTR SS:[EBP+8] 009D2D04  CALL Internat.009D30EA 009D2D09  ADD ESP,8 009D2D0C  CMP EAX,-1 009D2D0F  ADD DWORD PTR SS:[EBP-1C],EAX 009D2D12  MOV DWORD PTR SS:[EBP-4],EAX 009D2D15  SUB EBX,EBX 009D2D17  MOV ESI,DWORD PTR SS:[EBP-8] 009D2D1A  LODS WORD PTR DS:[ESI] 009D2D1C  CMP AL,0E2 009D2D1E  JE Internat.009D2DDD 009D2D24  CMP AL,0E1 009D2D26  JE Internat.009D2DDD 009D2D2C  CMP AL,0E0 009D2D2E  JE Internat.009D2DDD 009D2D34  CMP AL,0CC 009D2D36  CMP AL,0E8 009D2D38  JE Internat.009D2F40 009D2D3E  CMP AL,0C3 009D2D40  JE Internat.009D2F25 009D2D46  CMP AL,0C2 009D2D48  JE Internat.009D2F25 009D2D4E  CMP AX,15FF 009D2D52  JE Internat.009D2EE5 009D2D58  CMP AL,0E9 009D2D5A  JE Internat.009D2ECF 009D2D60  CMP AX,25FF 009D2D64  JE Internat.009D2EB4 009D2D6A  CMP AL,0EB 009D2D6C  JE Internat.009D2E9D 009D2D72  CMP AL,0E3 009D2D74  JE Internat.009D2E01 009D2D7A  MOV BX,AX 009D2D7D  SHR BL,4 009D2D80  CMP BL,7 009D2D83  JE SHORT Internat.009D2E01 009D2D85  MOV BX,AX 009D2D88  CMP BL,0F 009D2D8B  JNZ SHORT Internat.009D2D99 009D2D8D  SHR EBX,0C 009D2D90  CMP BL,8 009D2D93  JE Internat.009D2E76 009D2D99  MOV EDI,DWORD PTR SS:[EBP-C] 009D2D9C  MOV ESI,DWORD PTR SS:[EBP-8] 009D2D9F  MOV ECX,DWORD PTR SS:[EBP-4] 009D2DA2  REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 009D2DA4  CMP DWORD PTR SS:[EBP-10],0E 009D2DA8  JA SHORT Internat.009D2DAA 009D2DAA  MOV EAX,DWORD PTR SS:[EBP-4] 009D2DAD  SUB DWORD PTR SS:[EBP-10],EAX 009D2DB0  ADD DWORD PTR SS:[EBP-8],EAX 009D2DB3  ADD EAX,ECX 009D2DB5  ADD DWORD PTR SS:[EBP-C],EAX 009D2DB8  JMP Internat.009D2CF1 009D2DBD  MOV EDX,DWORD PTR SS:[EBP-8] 009D2DC0  MOV EBX,DWORD PTR SS:[EBP-C] 009D2DC3  SUB EDX,5 009D2DC6  SUB EDX,EBX 009D2DC8  MOV BYTE PTR DS:[EBX],0E9 009D2DCB  MOV DWORD PTR DS:[EBX+1],EDX 009D2DCE  MOV EAX,DWORD PTR SS:[EBP-C] 009D2DD1  ADD EAX,5 009D2DD4  MOV DWORD PTR SS:[ESP+1C],EAX 009D2DD8  POPAD 009D2DD9  LEAVE 009D2DDA  RETN 10


這個程式碼就是殼把函式的前面位元組程式碼複製到殼的解密段中,然後程式執行時先在殼中執行一段API程式碼再jmp的
函式中,這樣就避免了對API函式下中斷了,因為API函式的前面幾行程式碼不在函式中執行了。自然是不能中斷了。
修改這段的程式碼可以得到完整的IAT表,這裡就不說了。因為比較免費,且這個程式可以用殼的程式碼來直接解密
IAT表執行。

F4到 009D2DDA  RETN 10

F8執行到:
程式碼:
009D33B9  MOV DWORD PTR SS:[EBP+1B6A],EAX                     ; Internat.009D8A96 009D33BF  POP EAX 009D33C0  MOV EBX,DWORD PTR SS:[EBP+28D8] 009D33C6  LEA EDX,DWORD PTR DS:[ESI-8] 009D33C9  SUB EDX,DWORD PTR SS:[EBP+28EC] 009D33CF  SHR EDX,1 009D33D1  ADD EBX,4 009D33D4  XOR EAX,186177C9 009D33D9  MOV DWORD PTR DS:[EBX+EDX],EAX 009D33DC  JMP Internat.009D3334


繼續:
程式碼:
009D3334  CMP ESI,DWORD PTR SS:[EBP+28BC]                     ; Internat.009D4FB0 009D333A  JA Internat.009D33E1 009D3340  LODS DWORD PTR DS:[ESI] 009D3341  MOV EBX,EAX 009D3343  LODS DWORD PTR DS:[ESI] 009D3344  MOV DWORD PTR DS:[ESI-4],0 009D334B  MOV DWORD PTR DS:[ESI-8],0 009D3352  TEST EAX,EAX 009D3354  JE Internat.009D33E1 009D335A  TEST BL,1 009D335D  JNZ SHORT Internat.009D337F 009D335F  PUSH EAX 009D3360  PUSH DWORD PTR SS:[EBP+28A0] 009D3366  CALL Internat.009D2B71 009D336B  XLAT BYTE PTR DS:[EBX+AL] 009D336C  XOR CH,BYTE PTR DS:[ECX] 009D336E  PUSH CS 009D336F  IMUL ECX,EBP,736F14D7 009D3375  TEST EAX,EAX 009D3377  JE Internat.009D341A 009D337D  JMP SHORT Internat.009D339A


如果要跟蹤到沒有解密的IAT表可以修改程式碼,我不想這樣了,所以在
程式碼:
009D333A  JA Internat.009D33E1 回車 009D33E1  INC ECX 009D33E2  JMP Internat.009D327D <--這裡回車


到這裡:
程式碼:
009D327D  CMP ECX,DWORD PTR SS:[EBP+28C4] 009D3283  JE Internat.009D33E7             //修改這個跳轉,到009D33E7 009D3289  MOV EDI,DWORD PTR SS:[EBP+28F0] 009D328F  MOV EAX,DWORD PTR SS:[EBP+28F8] 009D3295  LEA EAX,DWORD PTR DS:[EAX+ECX*4] 009D3298  ADD EDI,DWORD PTR DS:[EAX] 009D329A  PUSHAD 009D329B  PUSH EDI 009D329C  MOV EAX,ECX 009D329E  SHL EAX,2 009D32A1  PUSH EAX 009D32A2  CALL Internat.009D2C39


然後執行到:
程式碼:
009D2720   CMP EAX,DWORD PTR DS:[EDX+C] 009D2723   JNZ Internat.009D1F0A 009D2729   PUSH ECX 009D272A   PUSH EDI 009D272B   XOR EAX,EAX 009D272D   MOV EDI,EDX 009D272F   MOV ECX,8 009D2734   REP STOS DWORD PTR ES:[EDI] 009D2736   POP EDI 009D2737   POP ECX 009D2738   DEC ECX 009D2739   LEA EDX,DWORD PTR DS:[EDX+20] 009D273C   JNZ SHORT Internat.009D26EF 009D273E   POPAD 009D273F   ADD DWORD PTR SS:[ESP],6 009D2743   RETN


這個程式碼是殼對程式的CRC效驗的地方,一共3次驗證,修改JNZ Internat.009D1F0A 這個跳轉就可以避免CRC驗證。

F8執行:
程式碼:
009D3670   PUSH EBX 009D3671   MOV EBX,ESP 009D3673   SUB ESP,104 009D3679   PUSHAD 009D367A   LEA EDI,DWORD PTR DS:[EBX-104] 009D3680   MOV DWORD PTR DS:[EDI],74666F73 009D3686   MOV DWORD PTR DS:[EDI+4],70617277 009D368D   MOV DWORD PTR DS:[EDI+8],6C6C642E 009D3694   AND DWORD PTR DS:[EDI+C],0 009D3698   PUSH EDI 009D3699   PUSH EBX 009D369A   PUSH EDI 009D369B   CALL DWORD PTR SS:[EBP+2D7C] 009D36A1   POP EBX 009D36A2   POP EDI 009D36A3   MOV DWORD PTR DS:[EBX-4],EAX 009D36A6   PUSH EAX 009D36A7   CALL Internat.009D39F4 009D36AC   TEST EAX,EAX 009D36AE   JE Internat.009D1F0A 009D36B4   MOV WORD PTR SS:[EBP+20FC],AX 009D36BB   MOV DWORD PTR DS:[EDI],63417773 009D36C1   MOV DWORD PTR DS:[EDI+4],73736563 009D36C8   MOV DWORD PTR DS:[EDI+8],72657551 009D36CF   MOV DWORD PTR DS:[EDI+C],79 009D36D6   PUSH ESI 009D36D7   PUSH EDI 009D36D8   PUSH EBX 009D36D9   PUSH ECX 009D36DA   PUSH EDX 009D36DB   PUSH EDI 009D36DC   PUSH DWORD PTR DS:[EBX-4] 009D36DF   CALL DWORD PTR SS:[EBP+2D74] 009D36E5   POP EDX 009D36E6   POP ECX 009D36E7   POP EBX 009D36E8   POP EDI 009D36E9   POP ESI 009D36EA   TEST EAX,EAX 009D36EC   JE Internat.009D1F0A 009D36F2   MOV EDX,EAX 009D36F4   MOV EAX,DWORD PTR SS:[EBP+C7E] 009D36FA   XOR EAX,FA179D15 009D36FF   ADD EAX,DWORD PTR SS:[EBP+C7E] 009D3705   MOV DWORD PTR SS:[EBP+2100],EAX 009D370B   LEA ESI,DWORD PTR SS:[EBP+210C] 009D3711   MOV EDI,ESI 009D3713   MOV ECX,40 009D3718   REP STOS DWORD PTR ES:[EDI] 009D371A   PUSH EBX 009D371B   PUSH EDI 009D371C   PUSH ESI 009D371D   PUSH DWORD PTR DS:[EBX+8] 009D3720   PUSH ESI 009D3721   PUSH EAX 009D3722   CALL EDX 009D3724   ADD ESP,0C 009D3727   MOV DWORD PTR SS:[EBP+20F8],EAX 009D372D   POP ESI 009D372E   POP EDI 009D372F   POP EBX 009D3730   LEA EAX,DWORD PTR SS:[EBP+20F8] 009D3736   PUSH EAX 009D3737   PUSH ESI 009D3738   CALL Internat.009D3894 009D373D   ADD ESI,8 009D3740   CMP ESI,EDI 009D3742   JNZ SHORT Internat.009D3730 009D3744   MOV EDX,DWORD PTR SS:[EBP+2100] 009D374A   MOV ECX,40 009D374F   SUB ESI,100 009D3755   XOR EDX,EDX 009D3757   LODS DWORD PTR DS:[ESI] 009D3758   ADD EDX,EAX 009D375A   DEC ECX 009D375B   JNZ SHORT Internat.009D3757 009D375D   SUB EDX,DWORD PTR SS:[EBP+2108] 009D3763   JNZ SHORT Internat.009D3779 009D3765   PUSH DWORD PTR DS:[EBX-4] 009D3768   CALL DWORD PTR SS:[EBP+2B9F] 009D376E   POPAD 009D376F   MOV ESP,EBX 009D3771   POP EBX 009D3772   ADD DWORD PTR SS:[ESP],5 009D3776   RETN 4


這個段就是殼的sdk介面程式碼,分析發現這個程式碼是以PUSHAD 入口到 POPAD 結束的介面,就是說這個介面是
可以越過的。(如果不越過,後面的殼效驗太麻煩了)
執行到009D367A   LEA EDI,DWORD PTR DS:[EBX-104],這時PUSHAD有效了,然後游標移動到009D376E POPAD
右擊現在選擇 在此處新建EIP,呵呵這樣躲過了sdk的驗證了。

第一部分完成了。

下面到了第二部分

F9執行,中斷到異常:
程式碼:
009D23B1   UD2 009D23B3   POPAD 009D23B4   ADD DWORD PTR SS:[ESP],6 009D23B8   RETN

Shift+F9執行,被中斷在:
程式碼:
77E5AC72   PUSH EBP                                            ; Internat.009D1688 77E5AC73   MOV EBP,ESP 77E5AC75   PUSH DWORD PTR SS:[EBP+14] 77E5AC78   PUSH DWORD PTR SS:[EBP+10] 77E5AC7B   PUSH DWORD PTR SS:[EBP+C] 77E5AC7E   PUSH DWORD PTR SS:[EBP+8] 77E5AC81   PUSH -1 77E5AC83   CALL kernel32.VirtualAllocEx 77E5AC88   POP EBP 77E5AC89   RETN 10


呵呵又到VirtualAlloc函式中了,最後一個解密的臨時段申請的時候到了,執行到RETN 10 發現EAX=01090000
修改這個值=009DE000 到這裡解密段的修改全部完成了。按我的願望修改到了增加的段中了。

F9執行到異常:
程式碼:
009D1D15   UD2 009D1D17   CALL Internat.009D3499 009D1D1C   LOCK PFCMPGE MM0,QWORD PTR SS:[EBP+ECX*8+E80B0F2F]  ; 鎖定字首是不允許的 009D1D26   PUSH ES 009D1D27   ADD BYTE PTR DS:[EAX],AL 009D1D29   JE SHORT Internat.009D1D11

和:
程式碼:
009D1D22   UD2 009D1D24   CALL Internat.009D23B9 009D1D29   JE SHORT Internat.009D1D11 009D1D2B   CMP BYTE PTR DS:[3471516C],CH 009D1D31   PUSHAD


下面到了計算入口的地方了。這個入口的計算竟然用到了CRC值,所以繼續執行會異常退出,為了這個異常退出,我化了近一天的時間來解決,原因是這個程式碼的執行是靠單步中斷異常執行的。次數大得驚人,單步可能要一天也不一定能執行完。現在說來簡單些了:
先Ctrl+G到:
程式碼:
009D1DFC   MOV AH,92 009D1DFE   JMP 1CBA08A0 009D1E03   NOP                                                 ; 多餘的字首 009D1E05   JECXZ SHORT Internat.009D1DC6 009D1E07   MOV BH,0B9 009D1E09   JNO SHORT Internat.009D1DBC 009D1E0B   XCHG EAX,ECX 009D1E0C   JMP FAR 7D64:62C17C7C                               ; 遠距跳轉 009D1E13   SHR ECX,0E9                                         ; 移動常數超出 1..31 的範圍 009D1E16   JMP FAR B9E7:95F96228                               ; 遠距跳轉 009D1E1D   MOV EBX,75B1B370 009D1E22   JE SHORT Internat.009D1DB8 009D1E24   IN AL,DX                                            ; I/O 命令 009D1E25   MOV EDI,33B71C62 009D1E2A   XCHG EAX,ESI 009D1E2B   STD 009D1E2C   ADD ECX,EBP 009D1E2E   JMP FE0C081C 009D1E33   INT 0B3 009D1E35   JLE SHORT Internat.009D1EB5 009D1E37   XCHG EAX,EDI 009D1E38   OUT DX,AL                                           ; I/O 命令 009D1E39   OUTS DX,BYTE PTR ES:[EDI]                           ; I/O 命令 009D1E3A   AAD 0CD 009D1E3C   OUTS DX,BYTE PTR ES:[EDI]                           ; I/O 命令 009D1E3D   AAD 0CD 009D1E3F   XOR EAX,E9EC668D 009D1E44   JMP 2E080832

在上面的程式碼中下訪問中斷,執行中斷在:
程式碼:
009D1D64   LODS BYTE PTR DS:[ESI] 009D1D65   FADDP ST(3),ST 009D1D67   INC EDI 009D1D68   MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 009D1D69   CWDE 009D1D6A   DIV DWORD PTR DS:[EAX-73] 009D1D6D   MOV EBP,533 009D1D72   MOV ECX,1BC 009D1D77   REP STOS BYTE PTR ES:[EDI] 009D1D79   JPE SHORT Internat.009D1D87 009D1D7B   JNS SHORT Internat.009D1D7D

這是單步異常對上面段的解密程式碼,執行直到:
程式碼:
009D1E08    PUSH EAX 009D1E09    CWDE 009D1E0A    POP EAX 009D1E0B    JS SHORT Internat.009D1E10               //斷點

上面的程式碼完成了解碼,在

009D1E0B    JS SHORT Internat.009D1E10  下中斷,取消原來的斷點,執行到這個地方,發現EAX=896817BD這個是因為程式增加了段長度和時間等改變了,所以這個入口值是錯誤的,要修改為正確的值EAX=0003C66C
然後可以在記憶體視窗中對程式的程式碼段下訪問中斷,執行就會停在程式的OEP處:
程式碼:
0043C66C >PUSH EBP 0043C66D  MOV EBP,ESP 0043C66F  PUSH -1 0043C671  PUSH Internat.00446AB0 0043C676  PUSH Internat.00440FBC                   ;  SE handler installation 0043C67B  MOV EAX,DWORD PTR FS:[0] 0043C681  PUSH EAX 0043C682  MOV DWORD PTR FS:[0],ESP 0043C689  SUB ESP,58 0043C68C  PUSH EBX 0043C68D  PUSH ESI 0043C68E  PUSH EDI 0043C68F  MOV DWORD PTR SS:[EBP-18],ESP 0043C692  CALL DWORD PTR DS:[9D1200]               ;  Internat.009D3B90



另外這樣脫出來的程式程式碼有問題,可以用直接dump下的程式碼來修復。然後用LordPE增加iat表中的函式就可以執行了。


                                                            fxyang

                                                           2004.9.3 晚

相關文章