手动脱PEcompact 2.x

本文介绍了一种手动去除PEcompact2.x壳的方法,包括使用OllyDbg调试器忽略内存访问异常来加载主程序,跟踪关键指令并设置断点以找到原始导入表地址,最后完成脱壳。

手动脱PEcompact 2.x的壳

一、

OllyDbg忽略内存访问异常,载入主程序:

00401000 >  B8 1CBA5000     MOV     EAX,0050BA1C
00401005    50              PUSH    EAX
00401006    64:FF35 0000000>PUSH    DWORD PTR FS:[0]
0040100D    64:8925 0000000>MOV     DWORD PTR FS:[0],ESP
00401014    33C0            XOR     EAX,EAX
00401016    8908            MOV     DWORD PTR DS:[EAX],ECX
00401018    50              PUSH    EAX
00401019    45              INC     EBP
0040101A    43              INC     EBX
0040101B    6F              OUTS    DX,DWORD PTR ES:[EDI]            ; I/O command
0040101C    6D              INS     DWORD PTR ES:[EDI],DX            ; I/O command

bp VirtualAlloc  运行

返回到用户代码:

Ctrl+F搜索命令:call edi

0050BAC1    8B4B 0C         MOV     ECX,DWORD PTR DS:[EBX+C]
0050BAC4    894E 14         MOV     DWORD PTR DS:[ESI+14],ECX
0050BAC7    FFD7            CALL    EDI        ;跟进去
0050BAC9    8985 23120010   MOV     DWORD PTR SS:[EBP+10001223],EAX
0050BACF    8BF0            MOV     ESI,EAX
0050BAD1    59              POP     ECX
0050BAD2    5A              POP     EDX

进入call edi,来到:

01240258    53              PUSH    EBX                              ; GameThru.0050B9F8
01240259    57              PUSH    EDI
0124025A    56              PUSH    ESI
0124025B    55              PUSH    EBP
0124025C    E8 00000000     CALL    01240261
01240261    5D              POP     EBP
01240262    81ED 30120010   SUB     EBP,10001230
01240268    8DB5 27120010   LEA     ESI,DWORD PTR SS:[EBP+10001227]
0124026E    8B46 FC         MOV     EAX,DWORD PTR DS:[ESI-4]

Ctrl+F搜索命令:mov ecx,[esi+34]

01240333    90              NOP
01240334    90              NOP
01240335    8B4E 34         MOV     ECX,DWORD PTR DS:[ESI+34]
01240338    85C9            TEST    ECX,ECX      ; ecx=8D000保存原始Import,把它改成零
0124033A    0F84 89000000   JE      012403C9      ; 这里强制跳过去,跟tE一样
01240340    034E 08         ADD     ECX,DWORD PTR DS:[ESI+8]
01240343    51              PUSH    ECX
01240344    56              PUSH    ESI

bp VirtualFree,中断两次以后返回(thx2fly):

0050BADC    57              PUSH    EDI
0050BADD    FF11            CALL    DWORD PTR DS:[ECX]
0050BADF    8BC6            MOV     EAX,ESI                          ; GameThru.00487228
0050BAE1    5A              POP     EDX
0050BAE2    5E              POP     ESI
0050BAE3    5F              POP     EDI
0050BAE4    59              POP     ECX
0050BAE5    5B              POP     EBX
0050BAE6    5D              POP     EBP
0050BAE7    FFE0            JMP     EAX        ; 飞向光明之颠^o^

完全dump下来,修正输入表为8D000,收工。

【OS自动脚本】

////////////////////////////////////////////

////    PECompact V2.X 完美脱壳脚本

////    cyclotron [BCG][DFCG][FCG][OCN]

////////////////////////////////////////////

msg  "请忽略内存访问异常!"

var  dwImport

gpa  "VirtualAlloc","kernel32.dll"
bp  $RESULT
run

bc  $RESULT 
rtu

findop  eip,#FFD7#  //call edi
bp  $RESULT
run

bc  $RESULT
sti

findop  eip,#8B4E34#  //mov ecx,[esi+34h]
bp  $RESULT
run

bc  $RESULT
sti
mov  dwImport,ecx
mov  ecx,0

gpa  "VirtualFree","kernel32.dll"
bp  $RESULT
run
run

bc  $RESULT
rtu

findop  eip,#FFE0#  //jmp eax
bp  $RESULT
run
bc  $RESULT

msg  dwImport
msg  "请转储文件!"


Regards,
cyclotron
05.2.6

二、

 今天还有朋友在问PeCompact2.x的脱壳方法,我再这里把我的通用脱法提一下(在看其它高手们文章的基础上总结的,在此表示感谢).
  [法则]:
   PeCompact2.x是制造了两个异常(00000000内存写异常和Single Step单步循环异常),我们可以轻松通过查看SEH链来进行脱壳

下面我说一下通用简单脱壳法:

1、去掉所有异常忽略,保留kernel32里的内存读写异常忽略
2、F9,run
3、遇到写[00000000]内存异常,暂停
4、查看SEH 链,也可从esp+4获得第一个SE Handle,Ctrl+G,来到此地址
5、向下找jmp eax,大概在$+CB处,记住此地址
6、ollydbg重新载入,下硬件执行断点: he 第5步的地址,F9,Shift+F9,中断
7、F8
8、dump,imprec fix iat,完工

  [例子]:
   GameThrust1.2: http://www.onlinedown.net/soft/37372.htm
   工具: Ollydbg/LordPE/Imprec
   依照上面提及通用方法,去掉ollydbg中所有异常忽略,保留kernel32里的内存读写异常忽略
   用ollydbg载入GameThrust.exe,F9

引用:
00401000 > B8 34C05000      MOV EAX,GameThru.0050C034
00401005   50               PUSH EAX
00401006   64:FF35 00000000 PUSH DWORD PTR FS:[0]
0040100D   64:8925 00000000 MOV DWORD PTR FS:[0],ESP
00401014   33C0             XOR EAX,EAX
00401016   8908             MOV DWORD PTR DS:[EAX],ECX  ;****此处异常****
00401018   50               PUSH EAX
00401019   45               INC EBP
0040101A   43               INC EBX


查看SEH 链,也可从esp+4获得第一个SE Handle

引用:
0012FFBC   0012FFE0  Pointer to next SEH record
0012FFC0   0050C034  SE handler  ;******SE handle  50C034*****
0012FFC4   7C816D4F  RETURN to kernel32.7C816D4F
0012FFC8   7C930738  ntdll.7C930738
0012FFCC   FFFFFFFF
0012FFD0   7FFD9000
0012FFD4   8054C038

 

Ctrl+G,50C034

引用:
0050C034   B8 DEAE50F0      MOV EAX,F050AEDE    ;***来到这里***
0050C039   8D88 79110010    LEA ECX,DWORD PTR DS:[EAX+10001179]
0050C03F   8941 01          MOV DWORD PTR DS:[ECX+1],EAX
0050C042   8B5424 04        MOV EDX,DWORD PTR SS:[ESP+4]
0050C046   8B52 0C          MOV EDX,DWORD PTR DS:[EDX+C]
0050C049   C602 E9          MOV BYTE PTR DS:[EDX],0E9
0050C04C   83C2 05          ADD EDX,5
0050C04F   2BCA             SUB ECX,EDX
0050C051   894A FC          MOV DWORD PTR DS:[EDX-4],ECX
0050C054   33C0             XOR EAX,EAX
0050C056   C3               RETN
0050C057   B8 78563412      MOV EAX,12345678
0050C05C   64:8F05 00000000 POP DWORD PTR FS:[0]
0050C063   83C4 04          ADD ESP,4
0050C066   55               PUSH EBP
0050C067   53               PUSH EBX
0050C068   51               PUSH ECX
0050C069   57               PUSH EDI
0050C06A   56               PUSH ESI
0050C06B   52               PUSH EDX
0050C06C   8D98 32110010    LEA EBX,DWORD PTR DS:[EAX+10001132]
0050C072   8B53 18          MOV EDX,DWORD PTR DS:[EBX+18]
0050C075   52               PUSH EDX
0050C076   8BE8             MOV EBP,EAX
0050C078   6A 40            PUSH 40
0050C07A   68 00100000      PUSH 1000
0050C07F   FF73 04          PUSH DWORD PTR DS:[EBX+4]
0050C082   6A 00            PUSH 0
0050C084   8B4B 10          MOV ECX,DWORD PTR DS:[EBX+10]
0050C087   03CA             ADD ECX,EDX
0050C089   8B01             MOV EAX,DWORD PTR DS:[ECX]
0050C08B   FFD0             CALL EAX
0050C08D   5A               POP EDX
0050C08E   8BF8             MOV EDI,EAX
0050C090   50               PUSH EAX
0050C091   52               PUSH EDX
0050C092   8B33             MOV ESI,DWORD PTR DS:[EBX]
0050C094   8B43 20          MOV EAX,DWORD PTR DS:[EBX+20]
0050C097   03C2             ADD EAX,EDX
0050C099   8B08             MOV ECX,DWORD PTR DS:[EAX]
0050C09B   894B 20          MOV DWORD PTR DS:[EBX+20],ECX
0050C09E   8B43 1C          MOV EAX,DWORD PTR DS:[EBX+1C]
0050C0A1   03C2             ADD EAX,EDX
0050C0A3   8B08             MOV ECX,DWORD PTR DS:[EAX]
0050C0A5   894B 1C          MOV DWORD PTR DS:[EBX+1C],ECX
0050C0A8   03F2             ADD ESI,EDX
0050C0AA   8B4B 0C          MOV ECX,DWORD PTR DS:[EBX+C]
0050C0AD   03CA             ADD ECX,EDX
0050C0AF   8D43 1C          LEA EAX,DWORD PTR DS:[EBX+1C]
0050C0B2   50               PUSH EAX
0050C0B3   57               PUSH EDI
0050C0B4   56               PUSH ESI
0050C0B5   FFD1             CALL ECX
0050C0B7   5A               POP EDX
0050C0B8   58               POP EAX
0050C0B9   0343 08          ADD EAX,DWORD PTR DS:[EBX+8]
0050C0BC   8BF8             MOV EDI,EAX
0050C0BE   52               PUSH EDX
0050C0BF   8BF0             MOV ESI,EAX
0050C0C1   8B46 FC          MOV EAX,DWORD PTR DS:[ESI-4]
0050C0C4   83C0 04          ADD EAX,4
0050C0C7   2BF0             SUB ESI,EAX
0050C0C9   8956 08          MOV DWORD PTR DS:[ESI+8],EDX
0050C0CC   8B4B 10          MOV ECX,DWORD PTR DS:[EBX+10]
0050C0CF   894E 24          MOV DWORD PTR DS:[ESI+24],ECX
0050C0D2   8B4B 14          MOV ECX,DWORD PTR DS:[EBX+14]
0050C0D5   51               PUSH ECX
0050C0D6   894E 28          MOV DWORD PTR DS:[ESI+28],ECX
0050C0D9   8B4B 0C          MOV ECX,DWORD PTR DS:[EBX+C]
0050C0DC   894E 14          MOV DWORD PTR DS:[ESI+14],ECX
0050C0DF   FFD7             CALL EDI
0050C0E1   8985 23120010    MOV DWORD PTR SS:[EBP+10001223],EAX
0050C0E7   8BF0             MOV ESI,EAX
0050C0E9   59               POP ECX
0050C0EA   5A               POP EDX
0050C0EB   03CA             ADD ECX,EDX
0050C0ED   68 00800000      PUSH 8000
0050C0F2   6A 00            PUSH 0
0050C0F4   57               PUSH EDI
0050C0F5   FF11             CALL DWORD PTR DS:[ECX]
0050C0F7   8BC6             MOV EAX,ESI
0050C0F9   5A               POP EDX
0050C0FA   5E               POP ESI
0050C0FB   5F               POP EDI
0050C0FC   59               POP ECX
0050C0FD   5B               POP EBX
0050C0FE   5D               POP EBP
0050C0FF   FFE0             JMP EAX           ;*****JMP EAX*****
0050C101   0000             ADD BYTE PTR DS:[EAX],AL
0050C103   0000             ADD BYTE PTR DS:[EAX],AL

 

 

向下找jmp eax,大概在$+CB处,记住此地址50c0ff

用ollydbg重新载入,下硬件执行断点: he 50c0ff,F9,Shift+F9,中断
F8,来到487228处

引用:
00487228   55               PUSH EBP  *****OEP******
00487229   8BEC             MOV EBP,ESP
0048722B   B9 35000000      MOV ECX,35
00487230   6A 00            PUSH 0
00487232   6A 00            PUSH 0
00487234   49               DEC ECX
00487235  ^75 F9            JNZ SHORT GameThru.00487230
00487237   51               PUSH ECX
00487238   53               PUSH EBX
00487239   56               PUSH ESI
0048723A   57               PUSH EDI
0048723B   B8 706E4800      MOV EAX,GameThru.00486E70
00487240   E8 97EDF7FF      CALL GameThru.00405FDC
00487245   33C0             XOR EAX,EAX

 


dump,imprec fix iat,完工.


  别看写了这么多,真正做起来就几步,实际上有经验的话,几个F8,然后shift+F8,跟踪几下就到了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值