ZProtect 1.4.9脱壳过程的一次分享

查壳, ZPotect 1.4.9

拉进OD,F7单步,到push ad ESP定律下断,断下后单步几次,来到OEP

记住OEP的地址4011A0

然后Ctrl+B,查找FF 15 或者FF 25,查找到一个CALL

回车进入CALL,长这样

跟随第二行的jmp,到达后再回车进jmp

到达后长这样

回车跟进这个CALL

找到ExitProcss下面的call,复制出来,记住CALL []内的地址 0x32652C

然后Shift+*,回到EIP的位置,用ImportREC附加进程,查找IAT表,记下IAT的Start和End地址

现在一共四个地址

OEP 0x4011A0

CALL [0x32652C]

IAT Start 408000

IAT End 4080E4
(这里在脚本中应该多写4字节,否则最后一个函数获取不到,所以应该写4080E8)

脚本代码:

Code

1
B8 00 80 40 00 8B 18 83 FB 00 74 36 80 3B 68 75 40 8B 4B 01 50 51 FF 15 2C 65 21 00 8B F0 A1 646C 21 00 2B 05 60 6C 21 00 C1 F8 02 3B F0 72 05 E8 E9 6A 8E FF A1 60 6C 21 00 8B 04 B0 5F 57 8907 58 83 C0 04 3D E8 80 40 00 72 B9 E9 35 4C FF FF 66 81 3B 50 60 75 EA 80 7B 02 68 75 E4 8B 4B03 EB B1

在OEP往下拉,找到一片空白位置,写脚本

二进制粘贴

粘贴好有时候第一行代码会变成

Code

1
add byte ptr ds:[eax+0x408000],bh

选中按下Ctrl+↑即可

粘贴后代码

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
0040B9B0    B8 00804000     mov eax,HelloWor.00408000                ; IAT Start
0040B9B5    8B18            mov ebx,dword ptr ds:[eax]
0040B9B7    83FB 00         cmp ebx,0x0
0040B9BA    74 36           je short HelloWor.0040B9F2
0040B9BC    803B 68         cmp byte ptr ds:[ebx],0x68
0040B9BF    75 40           jnz short HelloWor.0040BA01
0040B9C1    8B4B 01         mov ecx,dword ptr ds:[ebx+0x1]
0040B9C4    50              push eax                 ;kernel32.BaseThreadInitThunk
0040B9C5    51              push ecx
0040B9C6    FF15 2C652100   call dword ptr ds:[0x21652C];修改前几位不同位数,与CALL[]内地址相同
0040B9CC    8BF0            mov esi,eax                              ; kernel32.BaseThreadInitThunk
0040B9CE    A1 646C2100     mov eax,dword ptr ds:[0x216C64];修改前几位
0040B9D3    2B05 606C2100   sub eax,dword ptr ds:[0x216C60];修改前几位
0040B9D9    C1F8 02         sar eax,0x2
0040B9DC    3BF0            cmp esi,eax                              ; kernel32.BaseThreadInitThunk
0040B9DE    72 05           jb short HelloWor.0040B9E5
0040B9E0    E8 E96A8EFF     call FFCF24CE
0040B9E5    A1 606C2100     mov eax,dword ptr ds:[0x216C60];修改前几位
0040B9EA    8B04B0          mov eax,dword ptr ds:[eax+esi*4]
0040B9ED    5F              pop edi                                  ; kernel32.775FED6C
0040B9EE    57              push edi
0040B9EF    8907            mov dword ptr ds:[edi],eax               ; kernel32.BaseThreadInitThunk
0040B9F1    58              pop eax                                  ; kernel32.775FED6C
0040B9F2    83C0 04         add eax,0x4
0040B9F5    3D E8804000     cmp eax,HelloWor.004080E8                ; IAT End
0040B9FA  ^ 72 B9           jb short HelloWor.0040B9B5
0040B9FC  ^ E9 9F57FFFF     jmp HelloWor.004011A0                    ; JMP OEP
0040BA01    66:813B 5060    cmp word ptr ds:[ebx],0x6050
0040BA06  ^ 75 EA           jnz short HelloWor.0040B9F2
0040BA08    807B 02 68      cmp byte ptr ds:[ebx+0x2],0x68
0040BA0C  ^ 75 E4           jnz short HelloWor.0040B9F2
0040BA0E    8B4B 03         mov ecx,dword ptr ds:[ebx+0x3]
0040BA11  ^ EB B1           jmp short HelloWor.0040B9C4

如何修改CALL [ ]地址

Code

1
2
3
4
5
6
7
8
9
10
11
kernel32.BaseThreadInitThunk
0040B9C5    51              push ecx
0040B9C6    FF15 2C652100   call dword ptr ds:[0x21652C];修改前几位不同位数,与CALL[]内地址相同
0040B9CC    8BF0            mov esi,eax                              ; kernel32.BaseThreadInitThunk
0040B9CE    A1 646C2100     mov eax,dword ptr ds:[0x216C64];修改前几位
0040B9D3    2B05 606C2100   sub eax,dword ptr ds:[0x216C60];修改前几位
0040B9D9    C1F8 02         sar eax,0x2
0040B9DC    3BF0            cmp esi,eax                              ; kernel32.BaseThreadInitThunk
0040B9DE    72 05           jb short HelloWor.0040B9E5
0040B9E0    E8 E96A8EFF     call FFCF24CE
0040B9E5    A1 606C2100     mov eax,dword ptr ds:[0x216C60];修改前几位

比如40B9C6处为 CALL [0X21652C],而前面跟随CALL获取到的为CALL [0x32652C]

只有前2位不同,所以只需将 [0X21652C]中的21改为32

然后将后面注释为“修改前几位”的数据,都将21修改为32,后面的数据不变

修改后为

Code

1
2
3
4
5
6
7
8
9
0040B9C6    FF15 2C653200   call dword ptr ds:[0x32652C]
0040B9CC    8BF0            mov esi,eax                              ; kernel32.BaseThreadInitThunk
0040B9CE    A1 646C3200     mov eax,dword ptr ds:[0x326C64]
0040B9D3    2B05 606C3200   sub eax,dword ptr ds:[0x326C60]
0040B9D9    C1F8 02         sar eax,0x2
0040B9DC    3BF0            cmp esi,eax                              ; kernel32.BaseThreadInitThunk
0040B9DE    72 05           jb short HelloWor.0040B9E5
0040B9E0    E8 E96A8EFF     call FFCF24CE
0040B9E5    A1 606C3200     mov eax,dword ptr ds:[0x326C60]

修改完成后,在脚本第一行新建EIP,取消ESP硬断

在OEP处下断点,然后F9运行,断在OEP

DUMP,ImportREC修复转储

版权保护: 本文由蓝域安全网所发布,转载请保留本文链接: http://www.yemogege.cn/nxxg-jswz/542.html

免责声明:蓝域安全网所发布的一切渗透技术视频文章,逆向脱壳病毒分析教程,以及相关实用源码仅限用于学习和研究目的
请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除! 

侵权删帖/违法举报/投稿等事物联系邮箱:yemogege@vip.qq.com 网站地图