这不是完整的脱文,只是简单记录一下我自己认为的一些要点,太多的细节我也不知所以然,
能蒙混过去的我就暂且欺骗一下自己了,我也懒得去跟踪每一段代码的细节
这个1.25版本和上次脱的1.20版难易度基本差不多,现在完全忘了上次怎么脱的了
这次多花了不少时间,所以这次才决定留下点简单记录
如果你自己亲自跟踪过,我想应该能看懂我的思路

开工喽:
set seh:memory voilation
set seh:div 0
ignore others 

第一次div 0
008D9A28   F7F0             DIV EAX                              ;第一次div 0
008D9A2A   8381 B8000000 02 ADD DWORD PTR DS:[ECX+B8],2
008D9A31   5B               POP EBX
008D9A32   5D               POP EBP
008D9A33   C3               RETN

008D99DB   64:8F00          POP DWORD PTR FS:[EAX]               ;goto here
008D99DE   83C4 04          ADD ESP,4
008D99E1   5B               POP EBX
008D99E2   C3               RETN

bp VirtualAlloc
0044DE1C   FF93 80000000    CALL DWORD PTR DS:[EBX+80]           ;VirtualAlloc
0044DE22   85C0             TEST EAX,EAX                         ;返回这里,eax=9F0000
0044DE24   0F84 3A010000    JE Obsidium.0044DF64                 ;new imagebase

下面开始解码过程
解码后这里处理reloc,为了脱壳后使base定位在400000h,就需要在这里做些手脚了,大家自己想吧
0044DF27   8B43 10          MOV EAX,DWORD PTR DS:[EBX+10]        ;new imagebase
0044DF2A   2B43 10          SUB EAX,DWORD PTR DS:[EBX+3C]        ;old imagebase
0044DF2D   FF77 08          PUSH DWORD PTR DS:[EDI+8]
0044DF30   FF77 04          PUSH DWORD PTR DS:[EDI+4]
0044DF33   FF73 78          PUSH DWORD PTR DS:[EBX+78]
0044DF36   50               PUSH EAX
0044DF37   FF73 10          PUSH DWORD PTR DS:[EBX+10]
0044DF3A   FF53 70          CALL DWORD PTR DS:[EBX+70]
0044DF3D   83C7 14          ADD EDI,14
0044DF40   FF4D FC          DEC DWORD PTR SS:[EBP-4]
0044DF43  ^0F85 F4FEFFFF    JNZ Obsidium.0044DE3D

继续shift F9几次看到这样的代码:
008DC4B2   F7F0             DIV EAX                              ;div 0
008DC4B4   8B00             MOV EAX,DWORD PTR DS:[EAX]           ;紧接着一个这样的异常
008DC4B6   85C0             TEST EAX,EAX
008DC4B8   74 19            JE SHORT 008DC4D3
008DC4BA   8B53 04          MOV EDX,DWORD PTR DS:[EBX+4]
008DC4BD   C702 07000000    MOV DWORD PTR DS:[EDX],7
008DC4C3   C740 08 00000000 MOV DWORD PTR DS:[EAX+8],0
008DC4CA   8343 04 0C       ADD DWORD PTR DS:[EBX+4],0C
008DC4CE   52               PUSH EDX
008DC4CF   51               PUSH ECX
008DC4D0   FF63 4C          JMP DWORD PTR DS:[EBX+4C]
008DC4D3   64:67:8F06 0000  POP DWORD PTR FS:[0]                 ;goto here
008DC4D9   83C4 04          ADD ESP,4
008DC4DC   5B               POP EBX
008DC4DD   C3               RETN

下面是关于IAT处理的:
ctrl+g 8DC5D0 ,hard break point on exec
(关于8DC5D0这个地址是怎么找到的,我是多次运行过去,观察后下硬件断点,逐层回溯过来的
 然后把它记下来了,让我重新再找一次的话,我也要尝试并思考几次才能定位的)
F9 两次停到这里:
008DC5D0   E8 3F040000      CALL 008DCA14                        ;
008DC5D5   85C0             TEST EAX,EAX
008DC5D7   74 55            JE SHORT 008DC62E
008DC5D9   8B45 F4          MOV EAX,DWORD PTR SS:[EBP-C]
008DC5DC   05 679D4100      ADD EAX,419D67
008DC5E1   8B56 04          MOV EDX,DWORD PTR DS:[ESI+4]
008DC5E4   0353 44          ADD EDX,DWORD PTR DS:[EBX+44]
008DC5E7   52               PUSH EDX
008DC5E8   50               PUSH EAX
008DC5E9   E8 26040000      CALL 008DCA14
008DC5EE   85C0             TEST EAX,EAX
008DC5F0   74 3C            JE SHORT 008DC62E
...
008DC692   FF36             PUSH DWORD PTR DS:[ESI]
008DC694   53               PUSH EBX
008DC695   52               PUSH EDX
008DC696   50               PUSH EAX
008DC697   FF76 0C          PUSH DWORD PTR DS:[ESI+C]
008DC69A   E8 F4000000      CALL 008DC793                        ;进入

下面关于还原IAT代码的修改,我直接借鉴前人有关OB脱壳文章中的方法,仍然有效
008DC793   55               PUSH EBP
008DC794   8BEC             MOV EBP,ESP
008DC796   56               PUSH ESI
008DC797   57               PUSH EDI
008DC798   8B75 10          MOV ESI,DWORD PTR SS:[EBP+10]
008DC79B   8B7D 0C          MOV EDI,DWORD PTR SS:[EBP+C]
008DC79E   66:F706 2000     TEST WORD PTR DS:[ESI],20            ;改为 TEST WORD PTR DS:[ESI],8
008DC7A3   74 46            JE SHORT 008DC7EB                    ;改为 JNE SHORT 008DC7EB
008DC7A5   66:F706 0200     TEST WORD PTR DS:[ESI],2
008DC7AA   75 1F            JNZ SHORT 008DC7CB
008DC7AC   66:C706 0400     MOV WORD PTR DS:[ESI],4
008DC7B1   8B45 14          MOV EAX,DWORD PTR SS:[EBP+14]
008DC7B4   6A 01            PUSH 1
008DC7B6   6A 00            PUSH 0
008DC7B8   FF76 04          PUSH DWORD PTR DS:[ESI+4]
008DC7BB   6A 00            PUSH 0
008DC7BD   FF75 18          PUSH DWORD PTR SS:[EBP+18]
008DC7C0   FF50 50          CALL DWORD PTR DS:[EAX+50]
008DC7C3   85C0             TEST EAX,EAX                         ;改为 JE SHORT 008DC7EB
008DC7C5   74 38            JE SHORT 008DC7FF
008DC7C7   8907             MOV DWORD PTR DS:[EDI],EAX
008DC7C9   EB 20            JMP SHORT 008DC7EB
008DC7CB   66:C706 0400     MOV WORD PTR DS:[ESI],4
008DC7D0   8B45 14          MOV EAX,DWORD PTR SS:[EBP+14]
008DC7D3   0FB756 02        MOVZX EDX,WORD PTR DS:[ESI+2]
008DC7D7   6A 01            PUSH 1
008DC7D9   52               PUSH EDX
008DC7DA   6A 00            PUSH 0
008DC7DC   FF76 04          PUSH DWORD PTR DS:[ESI+4]
008DC7DF   FF75 18          PUSH DWORD PTR SS:[EBP+18]
008DC7E2   FF50 50          CALL DWORD PTR DS:[EAX+50]
008DC7E5   85C0             TEST EAX,EAX
008DC7E7   74 16            JE SHORT 008DC7FF                    ;改为 JE SHORT 008DC7EB
008DC7E9   8907             MOV DWORD PTR DS:[EDI],EAX
008DC7EB   83C6 08          ADD ESI,8
008DC7EE   83C7 04          ADD EDI,4
008DC7F1   FF4D 08          DEC DWORD PTR SS:[EBP+8]
008DC7F4  ^75 A8            JNZ SHORT 008DC79E
008DC7F6   33C0             XOR EAX,EAX
008DC7F8   40               INC EAX
008DC7F9   5F               POP EDI
008DC7FA   5E               POP ESI
008DC7FB   5D               POP EBP
008DC7FC   C2 1400          RETN 14

stolen code 我没去找,我只是翻看一下代码,看到下面这个就知道oep就在附近,自己手工修复几行就可以了
009F15FE           43 2B 2B 48 4F 4F 4B                       C++HOOK
OB是从这里开始进入原始程序代码的:
009F161E   E8 A1B41500      CALL 00B4CAC4
009F1623   8BD0             MOV EDX,EAX
009F1625   E8 46E11400      CALL 00B3F770
009F162A   5A               POP EDX
009F162B   E8 A4E01400      CALL 00B3F6D4
009F1630   E8 7BE11400      CALL 00B3F7B0
009F1635   6A 00            PUSH 0
009F1637   E8 80F61400      CALL 00B40CBC

象下面这种结构是动态解码的SDK
009F1BB0   68 A4000000      PUSH 0A4                             ;len
009F1BB5   FF15 EA104000    CALL DWORD PTR DS:[4010EA]
...
009F1C5F   68 A4000000      PUSH 0A4
009F1C64   FF15 EE104000    CALL DWORD PTR DS:[4010EE]

修改下面代码用于SDK FIX:
008DB38C   55               PUSH EBP
008DB38D   8BEC             MOV EBP,ESP
008DB38F   81EC 30010000    SUB ESP,130
008DB395   60               PUSHAD
008DB396   E8 00000000      CALL 008DB39B
008DB39B   5E               POP ESI
008DB39C   8D96 60010000    LEA EDX,DWORD PTR DS:[ESI+160]
008DB3A2   33C0             XOR EAX,EAX
008DB3A4   52               PUSH EDX
008DB3A5   83C5 04          ADD EBP,4                            ;已修改
008DB3A8   BE 7FD34400      MOV ESI,44D37F                       ;
008DB3AD   90               NOP                                  ;
008DB3AE   90               NOP                                  ;
008DB3AF   EB 02            JMP SHORT 008DB3B3                   ;
008DB3B1  ^EB FA            JMP SHORT 008DB3AD
008DB3B3   8B7D 04          MOV EDI,DWORD PTR SS:[EBP+4]
008DB3B6   8D85 D0FEFFFF    LEA EAX,DWORD PTR SS:[EBP-130]
008DB3BC   50               PUSH EAX
008DB3BD   57               PUSH EDI
008DB3BE   FF96 30010000    CALL DWORD PTR DS:[ESI+130]
...
008DB437   2B46 10          SUB EAX,DWORD PTR DS:[ESI+10]
008DB43A   8B4E 3C          MOV ECX,DWORD PTR DS:[ESI+3C]         ; Obsidium.00400000
008DB43D   8B55 08          MOV EDX,DWORD PTR SS:[EBP+8]
008DB440   2B4E 10          SUB ECX,DWORD PTR DS:[ESI+10]
008DB443   81E2 FFFFFF1F    AND EDX,1FFFFFFF
008DB449   52               PUSH EDX
008DB44A   50               PUSH EAX
008DB44B   FF76 78          PUSH DWORD PTR DS:[ESI+78]
008DB44E   51               PUSH ECX
008DB44F   FF76 10          PUSH DWORD PTR DS:[ESI+10]
008DB452   83C4 14          ADD ESP,14                           ;已修改,为了定位到400000
008DB455   8B45 08          MOV EAX,DWORD PTR SS:[EBP+8]
008DB458   8D8D F0FEFFFF    LEA ECX,DWORD PTR SS:[EBP-110]
008DB45E   25 FFFFFF1F      AND EAX,1FFFFFFF
008DB463   50               PUSH EAX
008DB464   FF75 04          PUSH DWORD PTR SS:[EBP+4]
008DB467   6A 0E            PUSH 0E
008DB469   51               PUSH ECX
008DB46A   FF56 28          CALL DWORD PTR DS:[ESI+28]
008DB46D   837E 70 00       CMP DWORD PTR DS:[ESI+70],0
008DB471   74 52            JE SHORT 008DB4C5
008DB473   F745 08 00000080 TEST DWORD PTR SS:[EBP+8],80000000
008DB47A   75 49            JNZ SHORT 008DB4C5
008DB47C   8B45 04          MOV EAX,DWORD PTR SS:[EBP+4]
008DB47F   8B4E 10          MOV ECX,DWORD PTR DS:[ESI+10]
008DB482   8B55 08          MOV EDX,DWORD PTR SS:[EBP+8]
008DB485   2B46 10          SUB EAX,DWORD PTR DS:[ESI+10]
008DB488   2B4E 3C          SUB ECX,DWORD PTR DS:[ESI+3C]
008DB48B   81E2 FFFFFF1F    AND EDX,1FFFFFFF
008DB491   52               PUSH EDX
008DB492   50               PUSH EAX
008DB493   FF76 78          PUSH DWORD PTR DS:[ESI+78]
008DB496   51               PUSH ECX
008DB497   FF76 10          PUSH DWORD PTR DS:[ESI+10]
008DB49A   83C4 14          ADD ESP,14                           ;已修改,为了定位到400000
...
008DB4E5   FF96 1C020000    CALL DWORD PTR DS:[ESI+21C]
008DB4EB   83ED 04          SUB EBP,4                            ;已修改
008DB4EE   90               NOP                                  ;
008DB4EF   90               NOP                                  ;
008DB4F0   90               NOP                                  ;
008DB4F1   83C4 04          ADD ESP,4
008DB4F4   61               POPAD
008DB4F5   8BE5             MOV ESP,EBP
008DB4F7   5D               POP EBP
008DB4F8   C2 0400          RETN 4

有了上面的一段修改,随便找个空闲空间写入下面代码,就可以修复动态解码的SDK
009F0800   BE 00109F00      MOV ESI,9F1000
009F0805   4E               DEC ESI
009F0806   46               INC ESI
009F0807   81FE 00E0B400    CMP ESI,0B4E000         
009F080D   7D 41            JGE SHORT 009F0850
009F080F   803E 68          CMP BYTE PTR DS:[ESI],68
009F0812  ^75 F2            JNZ SHORT 009F0806
009F0814   66:817E 05 FF15  CMP WORD PTR DS:[ESI+5],15FF
009F081A  ^75 EA            JNZ SHORT 009F0806
009F081C   817E 07 EA104000 CMP DWORD PTR DS:[ESI+7],4010EA
009F0823  ^75 E1            JNZ SHORT 009F0806
009F0825   FF76 01          PUSH DWORD PTR DS:[ESI+1]
009F0828   8D46 0B          LEA EAX,DWORD PTR DS:[ESI+B]
009F082B   50               PUSH EAX
009F082C   FF15 EA104000    CALL DWORD PTR DS:[4010EA]           ;8DB38C,进入我们上面那段修改过的还原SDK代码
009F0832   5A               POP EDX
009F0833   8BFE             MOV EDI,ESI
009F0835   B0 90            MOV AL,90
009F0837   B9 0B000000      MOV ECX,0B
009F083C   F3:AA            REP STOS BYTE PTR ES:[EDI]
009F083E   03FA             ADD EDI,EDX
009F0840   B9 0B000000      MOV ECX,0B
009F0845   F3:AA            REP STOS BYTE PTR ES:[EDI]
009F0847   83C6 0B          ADD ESI,0B
009F084A  ^EB BA            JMP SHORT 009F0806
009F084C   90               NOP
009F084D   90               NOP
009F084E   90               NOP
009F084F   90               NOP
009F0850   CC               INT 3
009F0851   90               NOP
009F0852   90               NOP
009F0853   90               NOP

还有一种有key才能还原的SDK保护代码,没key的情况下手工修改跳过就可以了,我不解释了
我思维已经有些混乱了,因此写内容也比较混乱,错误之处欢迎指正,想扔鸡蛋的请使点劲
就到这里结束吧,还有剩下的其他一些体力活就略过了

heXer
2005.3.13