ASF-AVI-RM-WMV Repair V1.41 脫殼去暗樁+漢化完美爆破

看雪資料發表於2015-11-15

標 題:ASF-AVI-RM-WMV Repair V1.41 脫殼去暗樁+漢化完美爆破

發信人:David

時 間:2004年2月27日 04:25

詳細資訊: 



【脫文標題】 ASF-AVI-RM-WMV Repair V1.41 脫殼去暗樁+完美爆破
  
【脫文作者】 weiyi75[Dfcg] 
  
【作者郵箱】 weiyi75@sohu.com 
  
【作者主頁】 Dfcg官方大本營 
  
【使用工具】 Ollydbg1.10b,ImportREC1.42,Loadpe 
  
【破解平臺】 Win2000/XP 
  
【軟體名稱】 ASF-AVI-RM-WMV Repair V 1.41 
  
【下載地址】 http://www.fixdown.com/soft/9924.htm
  
【軟體簡介】  ASF-AVI-RM-WMV Repair 是一個可以幫助你快速的修復被意外損壞的多媒體影片檔案格式的修復工具,程式支援包括ASF,AVI,RM,RMVB,WMV,WMADIVX,XVID,MPEG-4,等常用的影片檔案格式 

【軟體大小】 639KB 
  
【加殼方式】 ASProtect 1.23 RC4 Registered -> Alexey Solodovnikov
  
【保護方式】 沒有使用Asprotcet的Rsa演算法保護,採用自行研究的加密演算法,啟動時校驗註冊碼,10天試 
用期限制,SDK防脫殼暗樁。 
  
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享: 
  
-------------------------------------------------------------------------------- 
  
【破解內容】 
 
第一部分,脫去Asprotect1.23外殼保護,補上Stolen Code,修復IAT。
 
首先Peid查殼,為ASProtect 1.23 RC4 Registered -> Alexey Solodovnikov。
  
Ollydbg載入程式,隱藏OD,OD異常設定忽略除記憶體異常外的全部異常。 

00401000 >  68 01504A00     PUSH RepairVi.004A5001   //加殼程式入口點
00401005    E8 01000000     CALL RepairVi.0040100B
0040100A    C3              RETN
0040100B    C3              RETN
0040100C    F9              STC
0040100D    9C              PUSHFD
0040100E    31DD            XOR EBP,EBX
00401010    F69A F48AA45C   NEG BYTE PTR DS:[EDX+5CA48AF4]
00401016    AE              SCAS BYTE PTR ES:[EDI]
00401017    25 C4945BC8     AND EAX,C85B94C4
0040101C    D3C4            ROL ESP,CL
0040101E    DC26            FSUB QWORD PTR DS:[ESI]
00401020    9D              POPFD
00401021    94              XCHG EAX,ESP
00401022    B9 E2D941BE     MOV ECX,BE41D9E2
00401027    91              XCHG EAX,ECX
00401028    B4 70           MOV AH,70
0040102A    CA 9058         RETF 5890                                ; 遠距返回
...........................................................................
 
這次用點新東西,用OllyScript的Asprotect1.23 rc4 指令碼到達最後一次異常。 
 
011E3D03    3100            XOR DWORD PTR DS:[EAX],EAX //確定指令碼執行完畢按鈕到達地球人都知道的位置。

011E3D05    64:8F05 0000000>POP DWORD PTR FS:[0]
011E3D0C    58              POP EAX
011E3D0D    833D BC7E1E01 0>CMP DWORD PTR DS:[11E7EBC],0
011E3D14    74 14           JE SHORT 011E3D2A
011E3D16    6A 0C           PUSH 0C
011E3D18    B9 BC7E1E01     MOV ECX,11E7EBC
011E3D1D    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]
011E3D20    BA 04000000     MOV EDX,4
011E3D25    E8 E6D2FFFF     CALL 011E1010
011E3D2A    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
011E3D2D    FF75 F8         PUSH DWORD PTR SS:[EBP-8]
011E3D30    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
011E3D33    8338 00         CMP DWORD PTR DS:[EAX],0
011E3D36    74 02           JE SHORT 011E3D3A
011E3D38    FF30            PUSH DWORD PTR DS:[EAX]
011E3D3A    FF75 F0         PUSH DWORD PTR SS:[EBP-10]
011E3D3D    FF75 EC         PUSH DWORD PTR SS:[EBP-14]
011E3D40    C3              RETN  //這裡下斷點,Shift+F9到這裡後取消斷點。
...........................................................................
 
雖然多種辦法可以到達Stolen Code,複習一下手動找Stolen Code位置,也很快的。

如無特別說明,一律F7步進,F4跳出迴圈或到達指定位置。

011F60D8    80F0 44         XOR AL,44
011F60DB    0F84 09000000   JE 011F60EA
011F60E1    81D1 DC1DA872   ADC ECX,72A81DDC
011F60E7    0FB7FF          MOVZX EDI,DI
011F60EA    E8 0B000000     CALL 011F60FA

011F60FA    50              PUSH EAX                                 ; RepairVi.004A595D
011F60FB    81C7 0DA0B27D   ADD EDI,7DB2A00D
011F6101    81E9 1A917F18   SUB ECX,187F911A
011F6107    B5 7A           MOV CH,7A
011F6109    5F              POP EDI
011F610A    66:81C7 792D    ADD DI,2D79
011F610F    5B              POP EBX
011F6110    68 6C2A8437     PUSH 37842A6C
011F6115    BF 5881BF7D     MOV EDI,7DBF8158
011F611A    59              POP ECX
011F611B    0F83 22000000   JNB 011F6143

011F6143    81E9 CECCD86D   SUB ECX,6DD8CCCE      //這裡停一下。
011F6149    81C3 0E160000   ADD EBX,160E
011F614F    BF E852A012     MOV EDI,12A052E8
011F6154    2BD2            SUB EDX,EDX
011F6156    E8 09000000     CALL 011F6164
011F615B    3D 32830039     CMP EAX,39008332
011F6160  ^ 7E DF           JLE SHORT 011F6141   //中間的迴圈過程等沒必要執行。
011F6162    2C F5           SUB AL,0F5
011F6164    66:B8 7158      MOV AX,5871
011F6168    58              POP EAX
011F6169    0F8B 11000000   JPO 011F6180
011F616F    52              PUSH EDX
011F6170    68 2ECA6E55     PUSH 556ECA2E
011F6175    59              POP ECX
011F6176    5F              POP EDI
011F6177    66:8BC2         MOV AX,DX
011F617A    81F1 9217F440   XOR ECX,40F41792
011F6180    E9 05000000     JMP 011F618A         //F4直接下來。

011F618A    8B3413          MOV ESI,DWORD PTR DS:[EBX+EDX]
011F618D    66:8BFA         MOV DI,DX
011F6190    81C6 B27ADE78   ADD ESI,78DE7AB2
011F6196    51              PUSH ECX
011F6197    8ACA            MOV CL,DL
011F6199    0FBFF9          MOVSX EDI,CX
011F619C    59              POP ECX
011F619D    81EE 03AAC857   SUB ESI,57C8AA03
011F61A3    0F8E 0C000000   JLE 011F61B5

011F61B5    E9 07000000     JMP 011F61C1

011F61C1    81EE 807D8F45   SUB ESI,458F7D80
011F61C7    8BFE            MOV EDI,ESI
011F61C9    893413          MOV DWORD PTR DS:[EBX+EDX],ESI
011F61CC    8BCB            MOV ECX,EBX
011F61CE    66:8BC1         MOV AX,CX
011F61D1    66:8BC7         MOV AX,DI
011F61D4    E8 0B000000     CALL 011F61E4
011F61D9  ^ 77 E4           JA SHORT 011F61BF
011F61DB    4D              DEC EBP
011F61DC    0213            ADD DL,BYTE PTR DS:[EBX]
011F61DE    50              PUSH EAX
011F61DF    49              DEC ECX
011F61E0    4E              DEC ESI
011F61E1    6F              OUTS DX,DWORD PTR ES:[EDI]               ; I/O 命令
011F61E2    7C 05           JL SHORT 011F61E9
011F61E4    B5 18           MOV CH,18
011F61E6    B8 03C9DE24     MOV EAX,24DEC903
011F61EB    0FBFFE          MOVSX EDI,SI
011F61EE    58              POP EAX
011F61EF    81EA D6EBD358   SUB EDX,58D3EBD6
011F61F5    E9 12000000     JMP 011F620C           //同理直接下來,看都不用看。

011F620C    81C2 D2EBD358   ADD EDX,58D3EBD2
011F6212    66:81C8 0C99    OR AX,990C
011F6217    B4 6E           MOV AH,6E
011F6219    81FA 60EBFFFF   CMP EDX,-14A0
011F621F    0F85 1C000000   JNZ 011F6241
011F6225    8BFE            MOV EDI,ESI
011F6227    66:B8 2F83      MOV AX,832F
011F622B    E9 31000000     JMP 011F6261   //F4直接下來。

011F6261    5B              POP EBX                                  ; RepairVi.00400000
011F6262    58              POP EAX
011F6263    05 2662FEDE     ADD EAX,DEFE6226
011F6268    5C              POP ESP
011F6269    EB 3F           JMP SHORT 011F62AA

011F62AA    03C3            ADD EAX,EBX                              ; RepairVi.00400000
011F62AC    BB F2000000     MOV EBX,0F2
011F62B1    0BDB            OR EBX,EBX
011F62B3    75 02           JNZ SHORT 011F62B7
011F62B5    50              PUSH EAX
011F62B6    C3              RETN
011F62B7    E8 00000000     CALL 011F62BC
011F62BC    5D              POP EBP
011F62BD    81ED 23014B00   SUB EBP,4B0123
011F62C3    8D85 D2004B00   LEA EAX,DWORD PTR SS:[EBP+4B00D2]
011F62C9    8D8D 69014B00   LEA ECX,DWORD PTR SS:[EBP+4B0169]
011F62CF    03CB            ADD ECX,EBX
011F62D1    8941 01         MOV DWORD PTR DS:[ECX+1],EAX
011F62D4    8D85 11014B00   LEA EAX,DWORD PTR SS:[EBP+4B0111]
011F62DA    8D8D D6004B00   LEA ECX,DWORD PTR SS:[EBP+4B00D6]
011F62E0    8901            MOV DWORD PTR DS:[ECX],EAX
011F62E2    B8 58140000     MOV EAX,1458
011F62E7    8D8D DB004B00   LEA ECX,DWORD PTR SS:[EBP+4B00DB]
011F62ED    8901            MOV DWORD PTR DS:[ECX],EAX
011F62EF    8D8D 69014B00   LEA ECX,DWORD PTR SS:[EBP+4B0169]
011F62F5    8D85 69134B00   LEA EAX,DWORD PTR SS:[EBP+4B1369]
011F62FB    51              PUSH ECX
011F62FC    50              PUSH EAX
011F62FD    E8 7BFFFFFF     CALL 011F627D
011F6302    64:EB 02        JMP SHORT 011F6307         //F4直接下來。

011F6307   /2E:EB 01        JMP SHORT 011F630B                       ; 多餘的字首

011F630B    83EC 1A         SUB ESP,1A
011F630E    83C4 16         ADD ESP,16
011F6311    66:8135 1A631F0>XOR WORD PTR DS:[11F631A],0C6CB
011F7E0A    F2:             PREFIX REPNE:                            ; 多餘的字首

011F7E0E    50              PUSH EAX
011F7E0F    2E:EB 02        JMP SHORT 011F7E14                       ; 多餘的字首

011F7E14    8F4424 00       POP DWORD PTR SS:[ESP]                   ; 011F7DF2
011F7E18    65:EB 02        JMP SHORT 011F7E1D                       ; 多餘的字首

011F7E1D    F2:             PREFIX REPNE:                            ; 多餘的字首

011F7E21    66:0FBCC7       BSF AX,DI
011F7E25    66:812D 2E7E1F0>SUB WORD PTR DS:[11F7E2E],6B2A

011F7E2E    F2:             PREFIX REPNE:                            ; 多餘的字首

011F7E33    83E0 67         AND EAX,67
011F7E36    66:812D 3F7E1F0>SUB WORD PTR DS:[11F7E3F],0B47A

011F7E3F   /EB 01           JMP SHORT 011F7E42

011F7E42   /EB 02           JMP SHORT 011F7E46

011F7E46    8D83 3A184A79   LEA EAX,DWORD PTR DS:[EBX+794A183A]
011F7E4C    F2:             PREFIX REPNE:                            ; 多餘的字首

011F7E51    66:812D 5B7E1F0>SUB WORD PTR DS:[11F7E5B],98C5

011F7E5A   /3E:EB 02        JMP SHORT 011F7E5F                       ; 多餘的字首

011F7E5F    06              PUSH ES
011F7E60    EB 02           JMP SHORT 011F7E64

011F7E64    C74424 00 477E1>MOV DWORD PTR SS:[ESP],11F7E47
011F7E6C    58              POP EAX
011F7E6D    FF50 2B         CALL DWORD PTR DS:[EAX+2B]

011F7E7B    58              POP EAX                                  ; 011F7E70
011F7E7C    EB 01           JMP SHORT 011F7E7F

011F7E7F   /EB 02           JMP SHORT 011F7E83

011F7E83    8D4458 6F       LEA EAX,DWORD PTR DS:[EAX+EBX*2+6F]
011F7E87    F2:             PREFIX REPNE:                            ; 多餘的字首

011F7E8B    F2:             PREFIX REPNE:                            ; 多餘的字首

011F7E90    8D81 4CDFC21F   LEA EAX,DWORD PTR DS:[ECX+1FC2DF4C]
011F7E96    58              POP EAX
011F7E97    64:EB 02        JMP SHORT 011F7E9C                       ; 多餘的字首

011F7E9C    55              PUSH EBP      *     //這裡看到ESP的值是0012FFA4,難怪12ffc0的硬體寫入斷點沒斷下來,EBP的值也不是12fff0模擬跟蹤也失敗,所以這個程式用0012FFA0的硬體寫入斷點一步就可以斷下來,不過手動跟蹤也非常快。
011F7E9D    8BEC            MOV EBP,ESP   *    //執行的結果是esp=ebp=12ffa0
011F7E9F    6A FF           PUSH -1       *        帶*的內容是Stolen Code
011F7EA1    68 30284700     PUSH 472830   *
011F7EA6    68 E4234400     PUSH 4423E4   *
011F7EAB    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]   *
011F7EB1    64:EB 02        JMP SHORT 011F7EB6                       ; 多餘的字首

011F7EB6    50              PUSH EAX      *
011F7EB7    64:8925 0000000>MOV DWORD PTR FS:[0],ESP   *
011F7EBE    83EC 58         SUB ESP,58           *
011F7EC1    64:EB 02        JMP SHORT 011F7EC6                       ; 多餘的字首

011F7EC6    53              PUSH EBX    *
011F7EC7    64:EB 02        JMP SHORT 011F7ECC                       ; 多餘的字首

011F7ECC    56              PUSH ESI    *
011F7ECD    64:EB 02        JMP SHORT 011F7ED2                       ; 多餘的字首

011F7ED2    57              PUSH EDI    *
011F7ED3    8965 E8         MOV DWORD PTR SS:[EBP-18],ESP  *
011F7ED6    64:EB 02        JMP SHORT 011F7EDB                       ; 多餘的字首

011F7EDB   /64:EB 01        JMP SHORT 011F7EDF                       ; 多餘的字首

011F7EDF    68 EA3E4400     PUSH 443EEA
011F7EE4    68 5B7D1F01     PUSH 11F7D5B
011F7EE9    C3              RETN

011F7D5B    60              PUSHAD
011F7D5C    9C              PUSHFD
011F7D5D    FC              CLD
011F7D5E    BF 9A7D1F01     MOV EDI,11F7D9A
011F7D63    B9 58140000     MOV ECX,1458
011F7D68    F3:AA           REP STOS BYTE PTR ES:[EDI]   //F7可以看著它迴圈執行Stolen Code 
011F7D6A    9D              POPFD
011F7D6B    61              POPAD
011F7D6C    C3              RETN

....................................................................... 

整理一下Stolen Code 
PUSH EBP
MOV EBP,ESP
PUSH -1
PUSH 00472830
PUSH 004423E4                     
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
SUB ESP,58
PUSH EBX
PUSH ESI
PUSH EDI
MOV DWORD PTR SS:[EBP-18],ESP
....................................................... 

00443EC4    0000            ADD BYTE PTR DS:[EAX],AL          //真Oep,OD直接補上整理的Stolen Code 
00443EC6    0000            ADD BYTE PTR DS:[EAX],AL
00443EC8    0000            ADD BYTE PTR DS:[EAX],AL
00443ECA    0000            ADD BYTE PTR DS:[EAX],AL
00443ECC    0000            ADD BYTE PTR DS:[EAX],AL
00443ECE    0000            ADD BYTE PTR DS:[EAX],AL
00443ED0    0000            ADD BYTE PTR DS:[EAX],AL
00443ED2    0000            ADD BYTE PTR DS:[EAX],AL
00443ED4    0000            ADD BYTE PTR DS:[EAX],AL
00443ED6    0000            ADD BYTE PTR DS:[EAX],AL
00443ED8    0000            ADD BYTE PTR DS:[EAX],AL
00443EDA    0000            ADD BYTE PTR DS:[EAX],AL
00443EDC    0000            ADD BYTE PTR DS:[EAX],AL
00443EDE    0000            ADD BYTE PTR DS:[EAX],AL
00443EE0    0000            ADD BYTE PTR DS:[EAX],AL
00443EE2    0000            ADD BYTE PTR DS:[EAX],AL
00443EE4    0000            ADD BYTE PTR DS:[EAX],AL
00443EE6    0000            ADD BYTE PTR DS:[EAX],AL
00443EE8    0000            ADD BYTE PTR DS:[EAX],AL
00443EEA    FF15 C4834600   CALL DWORD PTR DS:[4683C4]       偽OEP,捲軸往上面看。 
00443EF0    33D2            XOR EDX,EDX
00443EF2    8AD4            MOV DL,AH
00443EF4    8915 C0F24800   MOV DWORD PTR DS:[48F2C0],EDX
00443EFA    8BC8            MOV ECX,EAX
00443EFC    81E1 FF000000   AND ECX,0FF
00443F02    890D BCF24800   MOV DWORD PTR DS:[48F2BC],ECX
00443F08    C1E1 08         SHL ECX,8
00443F0B    03CA            ADD ECX,EDX
00443F0D    890D B8F24800   MOV DWORD PTR DS:[48F2B8],ECX
00443F13    C1E8 10         SHR EAX,10
00443F16    A3 B4F24800     MOV DWORD PTR DS:[48F2B4],EAX
00443F1B    6A 01           PUSH 1
00443F1D    E8 84330000     CALL RepairVi.004472A6
........................................................... 
 
00443EC4    55              PUSH EBP        //OD用外掛脫殼,修正入口為 43Ec4 重建輸入表選方式2
00443EC5    8BEC            MOV EBP,ESP
00443EC7    6A FF           PUSH -1
00443EC9    68 30284700     PUSH RepairVi.00472830
00443ECE    68 E4234400     PUSH RepairVi.004423E4
00443ED3    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]
00443ED9    50              PUSH EAX
00443EDA    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00443EE1    83EC 58         SUB ESP,58
00443EE4    53              PUSH EBX
00443EE5    56              PUSH ESI
00443EE6    57              PUSH EDI
00443EE7    8965 E8         MOV DWORD PTR SS:[EBP-18],ESP
00443EEA    FF15 C4834600   CALL DWORD PTR DS:[4683C4]
00443EF0    33D2            XOR EDX,EDX
00443EF2    8AD4            MOV DL,AH
00443EF4    8915 C0F24800   MOV DWORD PTR DS:[48F2C0],EDX
00443EFA    8BC8            MOV ECX,EAX
00443EFC    81E1 FF000000   AND ECX,0FF
00443F02    890D BCF24800   MOV DWORD PTR DS:[48F2BC],ECX
00443F08    C1E1 08         SHL ECX,8
00443F0B    03CA            ADD ECX,EDX
00443F0D    890D B8F24800   MOV DWORD PTR DS:[48F2B8],ECX
00443F13    C1E8 10         SHR EAX,10
00443F16    A3 B4F24800     MOV DWORD PTR DS:[48F2B4],EAX
00443F1B    6A 01           PUSH 1
00443F1D    E8 84330000     CALL RepairVi.004472A6
........................................................... 
 
IAT修復 
 
執行ImportREC,OEP填入00043EC4,自動搜尋,獲得輸入資訊,先用跟蹤等級1修復,然後用Asprotect1.3外掛
修復剩下的幾個指標,修復先脫殼的Unpack.exe。 
 
第二部分,去除暗樁
 
OD載入修復的檔案,F9執行。 

OD提示訪問違反。 

看堆疊友好提示 

0012BEB0   0040DF22  返回到 Unpack_.0040DF22 來自 011E14A4 //錯誤來自0040DF22
0012BEB4   00469440  Unpack_.00469440
0012BEB8   00000004
0012BEBC   FFFFFFFF
0012BEC0   004872C8  Unpack_.004872C8
0012BEC4   FFFFFFFF
0012BEC8   0012C3C8
0012BECC   0012FF08  指標到下一個 SEH 記錄
 
那麼Ctrl+G 去0040DF22 看看。 
 
0040DF1C    FF15 08FF4700   CALL DWORD PTR DS:[47FF08] //ds:[47FF08]指向殼中,跟蹤原程式發現其
作用是呼叫解壓程式。 
0040DF22    FF15 00FF4700   CALL DWORD PTR DS:[47FF00] //這裡出錯,這個Call是加密剛才解壓的程式
繼續執行,脫殼後要NOP掉。 
0040DF28    E9 27000000     JMP Unpack_.0040DF54
0040DF2D    D5 24           AAD 24       //點清除分析可看到和我一樣的程式碼。
0040DF2F    2D 81F42C54     SUB EAX,542CF481
0040DF34    3D 463DA974     CMP EAX,74A93D46
0040DF39    3938            CMP DWORD PTR DS:[EAX],EDI
0040DF3B    EC              IN AL,DX                                 ; I/O 命令
0040DF3C    9B              WAIT
0040DF3D    872A            XCHG DWORD PTR DS:[EDX],EBP
0040DF3F    C2 44D6         RETN 0D644
0040DF42    92              XCHG EAX,EDX
0040DF43    08DF            OR BH,BL
0040DF45    A9 1EF9B175     TEST EAX,75B1F91E
0040DF4A    45              INC EBP
0040DF4B    D9CA            FXCH ST(2)
0040DF4D    05 44530606     ADD EAX,6065344
0040DF52    5E              POP ESI
0040DF53    F1              INT1
0040DF54    FF15 04FF4700   CALL DWORD PTR DS:[47FF04]
0040DF5A    8D86 F43A0000   LEA EAX,DWORD PTR DS:[ESI+3AF4]
0040DF60    50              PUSH EAX
0040DF61    FF15 5C834600   CALL DWORD PTR DS:[<&kernel32.Initialize>; KERNEL32.InitializeCriticalSection
0040DF67    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
0040DF6B    8BC6            MOV EAX,ESI
0040DF6D    5F              POP EDI
0040DF6E    5E              POP ESI
0040DF6F    5B              POP EBX
0040DF70    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040DF77    83C4 10         ADD ESP,10
0040DF7A    C2 0400         RETN 4
...........................................................................
  
看DS:[47FF08]裡面的內容是011E14A4,ds:[48D4E0]裡面的內容是011E1440。兩個地方都是指向殼中,SDK! 
 
Od載入原程式
 
跟進 0040DF1C    FF15 08FF4700   CALL DWORD PTR DS:[47FF08]
 
011E14A4    55              PUSH EBP   //跟進,暈,好多程式碼啊,殼是不可能搬回的,它進殼中的過程我
們沒必有知道,但它從殼中取出程式碼動態修改程式領空程式碼我們脫殼後是需要的。 
011E14A5    8BEC            MOV EBP,ESP
011E14A7    53              PUSH EBX
011E14A8    56              PUSH ESI
011E14A9    8B5D 0C         MOV EBX,DWORD PTR SS:[EBP+C]
011E14AC    8B75 08         MOV ESI,DWORD PTR SS:[EBP+8]
011E14AF    8BC3            MOV EAX,EBX
011E14B1    E8 8E10FFFF     CALL 011D2544
011E14B6    A3 1C631E01     MOV DWORD PTR DS:[11E631C],EAX
011E14BB    8B15 1C631E01   MOV EDX,DWORD PTR DS:[11E631C]
011E14C1    8BC6            MOV EAX,ESI
011E14C3    8BCB            MOV ECX,EBX
011E14C5    E8 8611FFFF     CALL 011D2650
011E14CA    891D 007D1E01   MOV DWORD PTR DS:[11E7D00],EBX
011E14D0    53              PUSH EBX
011E14D1    8BCE            MOV ECX,ESI
011E14D3    8B15 FC7C1E01   MOV EDX,DWORD PTR DS:[11E7CFC]
011E14D9    A1 F87C1E01     MOV EAX,DWORD PTR DS:[11E7CF8]
011E14DE    E8 2DFBFFFF     CALL 011E1010
011E14E3    833D B0791E01 0>CMP DWORD PTR DS:[11E79B0],0
011E14EA    75 05           JNZ SHORT 011E14F1
011E14EC    E8 4FFFFFFF     CALL 011E1440
011E14F1    5E              POP ESI
011E14F2    5B              POP EBX
011E14F3    5D              POP EBP
011E14F4    C2 0800         RETN 8  //返回40DF22
......................................................... 
 
0040DF1C    FF15 08FF4700   CALL DWORD PTR DS:[47FF08]   //透過  011E14F4    C2 0800     RETN 8  返回40DF22,這裡知道了隨便給它一個retn 8就可以過關。

0040AF15    FF15 D8D44800   CALL DWORD PTR DS:[48D4D8]  //到這裡,下面和我們脫殼後看到的一樣。但是F8透過這句話,下面的程式碼發生大變化。

0040DF28   /E9 01000000     JMP RepairVi.0040DF2E
0040DF2D   |ED              IN EAX,DX                                ; I/O 命令
0040DF2E   391D 4CDA4700   CMP DWORD PTR DS:[47DA4C],EBX
0040DF34    7F 05           JG SHORT RepairVi.0040DF3B
0040DF36    E8 05EDFFFF     CALL RepairVi.0040CC40
0040DF3B    E8 70ECFFFF     CALL RepairVi.0040CBB0
0040DF40    85C0            TEST EAX,EAX
0040DF42    77 0A           JA SHORT RepairVi.0040DF4E
0040DF44    C786 E0380000 0>MOV DWORD PTR DS:[ESI+38E0],19720203
0040DF4E    EB 04           JMP SHORT RepairVi.0040DF54
0040DF50    EA 54F978FF 150>JMP FAR 0415:FF78F954                    ; 遠距跳轉
0040DF57    FF47 00         INC DWORD PTR DS:[EDI]
0040DF5A    8D86 F43A0000   LEA EAX,DWORD PTR DS:[ESI+3AF4]
0040DF60    50              PUSH EAX
0040DF61    FF15 5C834600   CALL DWORD PTR DS:[46835C]
0040DF67    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
0040DF6B    8BC6            MOV EAX,ESI
0040DF6D    5F              POP EDI
0040DF6E    5E              POP ESI
0040DF6F    5B              POP EBX
0040DF70    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040DF77    83C4 10         ADD ESP,10
0040DF7A    C2 0400         RETN 4
..........................................................
 
原先地址內容,未執行Call之前。
 
0040DF28   /E9 27000000     JMP Unpack_.0040DF54
0040DF2D   |D5 24           AAD 24
0040DF2F   |2D 81F42C54     SUB EAX,542CF481
0040DF34   |3D 463DA974     CMP EAX,74A93D46
0040DF39   |3938            CMP DWORD PTR DS:[EAX],EDI
0040DF3B   |EC              IN AL,DX                                 ; I/O 命令
0040DF3C   |9B              WAIT
0040DF3D   |872A            XCHG DWORD PTR DS:[EDX],EBP
0040DF3F   |C2 44D6         RETN 0D644
0040DF42   |92              XCHG EAX,EDX
0040DF43   |08DF            OR BH,BL
0040DF45   |A9 1EF9B175     TEST EAX,75B1F91E
0040DF4A   |45              INC EBP
0040DF4B   |D9CA            FXCH ST(2)
0040DF4D   |05 44530606     ADD EAX,6065344
0040DF52   |5E              POP ESI
0040DF53   |F1              INT1
0040DF54   FF15 04FF4700   CALL DWORD PTR DS:[47FF04]
0040DF5A    8D86 F43A0000   LEA EAX,DWORD PTR DS:[ESI+3AF4]
0040DF60    50              PUSH EAX
0040DF61    FF15 5C834600   CALL DWORD PTR DS:[<&kernel32.Initialize>; KERNEL32.InitializeCriticalSection
0040DF67    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
0040DF6B    8BC6            MOV EAX,ESI
0040DF6D    5F              POP EDI
0040DF6E    5E              POP ESI
0040DF6F    5B              POP EBX
0040DF70    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040DF77    83C4 10         ADD ESP,10
0040DF7A    C2 0400         RETN 4
....................................................................
 
看到這些,你說說我們脫殼的程式能正常執行嗎?
 
為了驗證下面兩個語句作用。

0040DF1C    FF15 08FF4700   CALL DWORD PTR DS:[47FF08]     //不用說,是從殼中解壓需要的資料。
0040DF22    FF15 00FF4700   CALL DWORD PTR DS:[47FF00]     F2在這裡下斷點,F9執行。 
0040DF28   /E9 27000000     JMP RepairVi.0040DF54     //呵呵,程式又變成這種樣子,所以0040DF22處的Call是加密0040DF1C解壓出來的資料,反脫殼用的,我們脫殼時已經執行了這句,中了招。
0040DF2D   |D5 24           AAD 24
0040DF2F   |2D 81F42C54     SUB EAX,542CF481
0040DF34   |3D 463DA974     CMP EAX,74A93D46
0040DF39   |3938            CMP DWORD PTR DS:[EAX],EDI
0040DF3B   |EC              IN AL,DX                                 ; I/O 命令
0040DF3C   |9B              WAIT
0040DF3D   |872A            XCHG DWORD PTR DS:[EDX],EBP
0040DF3F   |C2 44D6         RETN 0D644
0040DF42   |92              XCHG EAX,EDX
0040DF43   |08DF            OR BH,BL
0040DF45   |A9 1EF9B175     TEST EAX,75B1F91E
0040DF4A   |45              INC EBP
0040DF4B   |D9CA            FXCH ST(2)
0040DF4D   |05 44530606     ADD EAX,6065344
0040DF52   |5E              POP ESI
0040DF53   |F1              INT1
0040DF54   FF15 04FF4700   CALL DWORD PTR DS:[47FF04]
0040DF5A    8D86 F43A0000   LEA EAX,DWORD PTR DS:[ESI+3AF4]
0040DF60    50              PUSH EAX
0040DF61    FF15 5C834600   CALL DWORD PTR DS:[46835C]
0040DF67    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
0040DF6B    8BC6            MOV EAX,ESI
0040DF6D    5F              POP EDI
0040DF6E    5E              POP ESI
0040DF6F    5B              POP EBX
0040DF70    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040DF77    83C4 10         ADD ESP,10
0040DF7A    C2 0400         RETN 4
............................................................
 
修復第一處暗樁。
 
0040DF1C    FF15 08FF4700   CALL DWORD PTR DS:[47FF08]     //不用說,是從殼中解壓需要的資料。資料我們在後面補上,看到它最後用retn 8返回。
 
Ctrl+F隨便在程式中找個返回地址給它吧。 

0040EB41    C2 0800         RETN 8   //我選的這裡。 
 
命令列 dd 47FF08  
 
修改殼中資料  00B41C08  為  0040EB41 
 
0040DF22    FF15 00FF4700   CALL DWORD PTR DS:[47FF00]    //它是個加密Call,當然要NOP掉,直接用OD修改,注意使用NOP填充核取方塊要打上,這是基本的彙編知識。
 
第二步,用正確的解碼替換錯誤的程式碼,OD直接二進位制複製下面的全部內容,這裡OD一個工具足夠了,Winhex
不要嫉妒啊。先分析一下下面的內容有沒有花指令,指向殼中的程式碼。
 
0040DF28   /E9 01000000     JMP RepairVi.0040DF2E
0040DF2D   |ED              IN EAX,DX                                ; I/O 命令
0040DF2E   391D 4CDA4700   CMP DWORD PTR DS:[47DA4C],EBX
0040DF34    7F 05           JG SHORT RepairVi.0040DF3B
0040DF36    E8 05EDFFFF     CALL RepairVi.0040CC40
0040DF3B    E8 70ECFFFF     CALL RepairVi.0040CBB0
0040DF40    85C0            TEST EAX,EAX
0040DF42    77 0A           JA SHORT RepairVi.0040DF4E
0040DF44    C786 E0380000 0>MOV DWORD PTR DS:[ESI+38E0],19720203
0040DF4E    EB 04           JMP SHORT RepairVi.0040DF54   //注意這裡。
0040DF50    EA 54F978FF 150>JMP FAR 0415:FF78F954                    ; 遠距跳轉
0040DF57    FF47 00         INC DWORD PTR DS:[EDI]

0040DF54    FF15 04FF4700   CALL DWORD PTR DS:[47FF04]  //這也是加密Call,NOP掉。

0040DF54   > 90            NOP
0040DF55   .  90            NOP
0040DF56   .  90            NOP
0040DF57   .  90            NOP
0040DF58   .  90            NOP
0040DF59   .  90            NOP

0040DF5A    8D86 F43A0000   LEA EAX,DWORD PTR DS:[ESI+3AF4]
0040DF60    50              PUSH EAX
0040DF61    FF15 5C834600   CALL DWORD PTR DS:[46835C]
0040DF67    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
0040DF6B    8BC6            MOV EAX,ESI
0040DF6D    5F              POP EDI
0040DF6E    5E              POP ESI
0040DF6F    5B              POP EBX
0040DF70    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040DF77    83C4 10         ADD ESP,10
0040DF7A    C2 0400         RETN 4
..........................................................

將上面解碼的內容二進位制貼上進入脫殼的程式,注意位置小心操作。

補上程式碼後。
 
0040DF1C    FF15 08FF4700   CALL DWORD PTR DS:[47FF08]          //注意DS:[48D4E0]指標要修改指向程式中。     
0040DF22    90              NOP
0040DF23    90              NOP
0040DF24    90              NOP
0040DF25    90              NOP
0040DF26    90              NOP
0040DF27    90              NOP
0040DF28    E9 01000000     JMP fsfsfsf.0040DF2E
0040DF2D    ED              IN EAX,DX                                ; I/O 命令
0040DF2E    391D 4CDA4700   CMP DWORD PTR DS:[47DA4C],EBX
0040DF34    7F 05           JG SHORT fsfsfsf.0040DF3B
0040DF36    E8 05EDFFFF     CALL fsfsfsf.0040CC40
0040DF3B    E8 70ECFFFF     CALL fsfsfsf.0040CBB0
0040DF40    85C0            TEST EAX,EAX
0040DF42    77 0A           JA SHORT fsfsfsf.0040DF4E
0040DF44    C786 E0380000 0>MOV DWORD PTR DS:[ESI+38E0],19720203
0040DF4E    EB 04           JMP SHORT fsfsfsf.0040DF54
0040DF50    EA 54F97890 909>JMP FAR 9090:9078F954                    ; 遠距跳轉
0040DF57    90              NOP
0040DF58    90              NOP
0040DF59    90              NOP
0040DF5A    8D86 F43A0000   LEA EAX,DWORD PTR DS:[ESI+3AF4]
0040DF60    50              PUSH EAX
0040DF61    FF15 5C834600   CALL DWORD PTR DS:[<&kernel32.Initialize>; KERNEL32.InitializeCriticalSection
0040DF67    8B4C24 10       MOV ECX,DWORD PTR SS:[ESP+10]
0040DF6B    8BC6            MOV EAX,ESI
0040DF6D    5F              POP EDI
0040DF6E    5E              POP ESI
0040DF6F    5B              POP EBX
0040DF70    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040DF77    83C4 10         ADD ESP,10
0040DF7A    C2 0400         RETN 4
.................................................................
 
將所有修改內容複製到程式中,儲存為一個檔案。
 
這個程式校驗處較多,處理方式相同,我就不一一解釋了。
 
修復第二處暗樁。
 
OD載入修復後的程式,F9執行,程式介面出來了。別高興,最關鍵的修復功能還沒有試,肯定還有暗樁。
 
執行修復檔案功能。 

OD提示訪問違反。 

看堆疊友好提示 
 
0012B8C4   0040FB65  返回到 Unpack1.0040FB65 來自 011E1440   //錯誤來自0040FB65
0012B8C8   0012C3C8
0012B8CC   0012C3C8
0012B8D0   00000001
0012B8D4   0012C3C8
0012B8D8   0012C3C8
0012B8DC   0012B8F8  指標到下一個 SEH 記錄
0012B8E0   004654AA  SE 控制程式碼
.................................................. 
 
Ctrl+G 0040FB65
 
0040FB5F    FF15 00FF4700   CALL DWORD PTR DS:[47FF00]  //加密解壓程式碼,NOP掉。
0040FB65    E9 DA000000     JMP Unpack1.0040FC44      //一眼看出這是錯誤的程式碼,必須修正。
0040FB6A    06              PUSH ES
0040FB6B    96              XCHG EAX,ESI
0040FB6C    B6 1D           MOV DH,1D
0040FB6E    16              PUSH SS
0040FB6F    6B54C9 3B D1    IMUL EDX,DWORD PTR DS:[ECX+ECX*8+3B],-2F
0040FB74    27              DAA
0040FB75    D6              SALC
0040FB76    E2 4C           LOOPD SHORT Unpack1.0040FBC4
0040FB78    53              PUSH EBX
0040FB79    CB              RETF                                     ; 遠距返回
0040FB7A    3A87 D5FEDB1A   CMP AL,BYTE PTR DS:[EDI+1ADBFED5]
0040FB80    FD              STD
0040FB81    9B              WAIT
0040FB82  ^ EB F6           JMP SHORT Unpack1.0040FB7A
0040FB84    44              INC ESP
0040FB85    71 00           JNO SHORT Unpack1.0040FB87
0040FB87    4F              DEC EDI
0040FB88    7A F4           JPE SHORT Unpack1.0040FB7E
.........................................................................
 
切換到加殼程式中,Ctrl+G 0040FB5F 

0040FB5F    FF15 00FF4700   CALL DWORD PTR DS:[47FF00] //下斷點,執行檔案修復時中斷,取消斷點。
0040FB65    E9 DA000000     JMP RepairVi.0040FC44  F8執行到這句程式動態解碼。
0040FB6A    06              PUSH ES
0040FB6B    96              XCHG EAX,ESI
0040FB6C    B6 1D           MOV DH,1D
0040FB6E    16              PUSH SS
0040FB6F    6B54C9 3B D1    IMUL EDX,DWORD PTR DS:[ECX+ECX*8+3B],-2F
0040FB74    27              DAA
0040FB75    D6              SALC
0040FB76    E2 4C           LOOPD SHORT RepairVi.0040FBC4
0040FB78    53              PUSH EBX
0040FB79    CB              RETF                                     ; 遠距返回
................................................................

0040FB5F    FF15 00FF4700   CALL DWORD PTR DS:[47FF00]     //解碼後,二進位制複製下面全部內容。這個加密Call當然要NOP掉。
0040FB65   /E9 01000000     JMP RepairVi.0040FB6B
0040FB6A   |3E:8B86 D038000>MOV EAX,DWORD PTR DS:[ESI+38D0]
0040FB71    8B78 04         MOV EDI,DWORD PTR DS:[EAX+4]
0040FB74    8B4F 24         MOV ECX,DWORD PTR DS:[EDI+24]
0040FB77    8B57 20         MOV EDX,DWORD PTR DS:[EDI+20]
0040FB7A    51              PUSH ECX
0040FB7B    52              PUSH EDX
0040FB7C    E8 3FCDFFFF     CALL RepairVi.0040C8C0
0040FB81    83C4 08         ADD ESP,8
0040FB84    85C0            TEST EAX,EAX
0040FB86    75 09           JNZ SHORT RepairVi.0040FB91
0040FB88    A1 4CDA4700     MOV EAX,DWORD PTR DS:[47DA4C]
0040FB8D    85C0            TEST EAX,EAX
0040FB8F    7E 05           JLE SHORT RepairVi.0040FB96
0040FB91    BB 01000000     MOV EBX,1
0040FB96    57              PUSH EDI
0040FB97    E8 94CDFFFF     CALL RepairVi.0040C930
0040FB9C    83C4 04         ADD ESP,4
0040FB9F    8986 E8380000   MOV DWORD PTR DS:[ESI+38E8],EAX
0040FBA5    85DB            TEST EBX,EBX
0040FBA7    8996 EC380000   MOV DWORD PTR DS:[ESI+38EC],EDX
0040FBAD    0F84 8B000000   JE RepairVi.0040FC3E
0040FBB3    8D4424 0C       LEA EAX,DWORD PTR SS:[ESP+C]
0040FBB7    50              PUSH EAX
0040FBB8    6A 04           PUSH 4
0040FBBA    56              PUSH ESI
0040FBBB    68 F0F74000     PUSH RepairVi.0040F7F0
0040FBC0    6A 00           PUSH 0
0040FBC2    6A 00           PUSH 0
0040FBC4    FF15 48834600   CALL DWORD PTR DS:[468348]
0040FBCA    85C0            TEST EAX,EAX
0040FBCC    8986 303B0000   MOV DWORD PTR DS:[ESI+3B30],EAX
0040FBD2    75 12           JNZ SHORT RepairVi.0040FBE6
0040FBD4    5F              POP EDI
0040FBD5    5E              POP ESI
0040FBD6    5B              POP EBX
0040FBD7    8B4C24 08       MOV ECX,DWORD PTR SS:[ESP+8]
0040FBDB    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040FBE2    83C4 14         ADD ESP,14
0040FBE5    C3              RETN
0040FBE6    6A 00           PUSH 0
0040FBE8    8D8E 380F0000   LEA ECX,DWORD PTR DS:[ESI+F38]
0040FBEE    C786 2C3B0000 0>MOV DWORD PTR DS:[ESI+3B2C],0
0040FBF8    E8 387A0400     CALL RepairVi.00457635
0040FBFD    6A 00           PUSH 0
0040FBFF    8D8E 20190000   LEA ECX,DWORD PTR DS:[ESI+1920]
0040FC05    E8 2B7A0400     CALL RepairVi.00457635
0040FC0A    6A 00           PUSH 0
0040FC0C    8D8E 141E0000   LEA ECX,DWORD PTR DS:[ESI+1E14]
0040FC12    E8 1E7A0400     CALL RepairVi.00457635
0040FC17    6A 00           PUSH 0
0040FC19    8D8E 08230000   LEA ECX,DWORD PTR DS:[ESI+2308]
0040FC1F    E8 117A0400     CALL RepairVi.00457635
0040FC24    6A 01           PUSH 1
0040FC26    8D8E E8310000   LEA ECX,DWORD PTR DS:[ESI+31E8]
0040FC2C    E8 047A0400     CALL RepairVi.00457635
0040FC31    8B8E 303B0000   MOV ECX,DWORD PTR DS:[ESI+3B30]
0040FC37    51              PUSH ECX
0040FC38    FF15 4C834600   CALL DWORD PTR DS:[46834C]
0040FC3E    EB 04           JMP SHORT RepairVi.0040FC44  //這裡還藏有一句花指令。
0040FC40    E5 87           IN EAX,87                                ; I/O 命令
0040FC42    2E:72 FF        JB SHORT RepairVi.0040FC44               ; 多餘的字首

0040FC3E  |> EB 04         JMP SHORT Crackme.0040FC44
                       
0040FC44  |>  FF15 04FF4700 CALL DWORD PTR DS:[47FF04]  //加密Call,脫殼後必須NOP掉,因為它指向殼中。

0040FC45    15 04FF4700     ADC EAX,RepairVi.0047FF04
0040FC4A    85DB            TEST EBX,EBX
0040FC4C    75 43           JNZ SHORT RepairVi.0040FC91
0040FC4E    6A 6C           PUSH 6C
0040FC50    E8 29880400     CALL RepairVi.0045847E
0040FC55    83C4 04         ADD ESP,4
0040FC58    894424 10       MOV DWORD PTR SS:[ESP+10],EAX
0040FC5C    85C0            TEST EAX,EAX
0040FC5E    895C24 1C       MOV DWORD PTR SS:[ESP+1C],EBX
0040FC62    74 0C           JE SHORT RepairVi.0040FC70
0040FC64    53              PUSH EBX
0040FC65    8BC8            MOV ECX,EAX
0040FC67    E8 14D3FFFF     CALL RepairVi.0040CF80
0040FC6C    8BF0            MOV ESI,EAX
0040FC6E    EB 02           JMP SHORT RepairVi.0040FC72
0040FC70    33F6            XOR ESI,ESI
0040FC72    85F6            TEST ESI,ESI
0040FC74    C74424 1C FFFFF>MOV DWORD PTR SS:[ESP+1C],-1
0040FC7C    74 13           JE SHORT RepairVi.0040FC91
0040FC7E    8B16            MOV EDX,DWORD PTR DS:[ESI]
0040FC80    8BCE            MOV ECX,ESI
0040FC82    FF92 B8000000   CALL DWORD PTR DS:[EDX+B8]
0040FC88    8B06            MOV EAX,DWORD PTR DS:[ESI]
0040FC8A    6A 01           PUSH 1
0040FC8C    8BCE            MOV ECX,ESI
0040FC8E    FF50 04         CALL DWORD PTR DS:[EAX+4]
0040FC91    8B4C24 14       MOV ECX,DWORD PTR SS:[ESP+14]
0040FC95    5F              POP EDI
0040FC96    5E              POP ESI
0040FC97    B8 01000000     MOV EAX,1
0040FC9C    5B              POP EBX
0040FC9D    64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040FCA4    83C4 14         ADD ESP,14
0040FCA7    C3              RETN
.....................................................................

儲存所有的修改,兩處暗樁去掉後,程式正常執行並可以修復檔案,另外10天試用期隨著殼的脫去化為烏有。

最後爆破它,用別人的KEY註冊感覺不爽。

破解分析參考我的  AVI MPEG RM WMV Joiner4.11脫殼+破解,過程查不多。
 
關鍵跳轉分析如下。
 
0040D73F   .  E8 FCEEFFFF   CALL Crack.0040C640
0040D744   .  83C4 0C       ADD ESP,0C
0040D747   .  85C0          TEST EAX,EAX
0040D749   .  74 0A         JE SHORT Crack.0040D755      //爆破點,jne 40D755
0040D74B   .  C786 C0000000>MOV DWORD PTR DS:[ESI+C0],1  //全域性標誌位賦值。 
 
破解後任意名字註冊。
 
--------------------------------------------------------------------------------  
  
  
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!

相關文章