avatar

目录
ZProtect 1.4.9脱壳

ZProtect 脱壳

查壳, 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修复转储

文章作者: Yenn_
文章链接: https://0xdf1001f.github.io/2019/12/13/ZProtect-1-4-9%E8%84%B1%E5%A3%B3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Wei's Blog

评论