2024年3月27日发(作者:给儿子的生日祝福语)
ZProtect IAT修复分析
手上也有正版的ZProtect了,就加了几个样本玩儿了一下,总结出了一些小方法,分享给大
家。
本文的目的旨在讨论如何去除ZP保护的程序(不带SDK)。主要讨论一下如何修复IAT。
第一个样品是个VB程序,按默认保护了输入表。
ZP中的输入表的保护方式有三种:
1,加密等级1
2,加密等级2
3,模拟
还有一个额外的输入表保护方式---Anti-Hook,这里不讨论修复这种保护。
默认保护下,IAT中的一部分函数使用的是等级1,剩下的使用的是等级2。至于模拟这种保
护,貌似在ZP1.44中是被动选择。只能对GetModuleHandleA这个函数使用。知道了这个,
修复这个函数也就不在话下。
闲话少说,OD载入,配置好StrongOD,确保程序能在OD中运行,这样会减少我们不少麻
烦~
F7单步走几步,探索一下壳的代码。
走了一段时间就会看清楚ZP的代码变形引擎的本质:
ZP壳会把程序的代码按指令分割起来,然后用Jmp连接起来。
当然如果仅仅是这样的话,反跟踪的难度绝对不够的。还要对Jmp进行变形。
这里用下面的例子说明一下:
006E1ACF E8 02000000 call Farsight.006E1AD6
006E1AD4 6C ins byte ptr es:[edi],dx---这两个是花指令
006E1AD5 19 ---
006E1AD6 872C24 xchg dword ptr ss:[esp],ebp
006E1AD9 8DAD B0F9FFFF lea ebp,dword ptr ss:[ebp-650]
006E1ADF 872C24 xchg dword ptr ss:[esp],ebp
006E1AE2 C3 retn
上面的代码就相当于Jmp 006E1A6F
原理是这样:
call Farsight.006E1AD6这条指令指令完以后会把它下面指令的地址压入堆栈,所以现在
[ESP]=006E1AD4。
然后xchg dword ptr ss:[esp],ebp 把006E1AD4传递给ebp。
接着lea ebp,dword ptr ss:[ebp-650] 把ebp-650=006E1A6F
在赋值给esp,最后retn返回就返回到006E1A6F了。
这段代码的二进制是E8 02 00 00 00 27 EB 87 0C 24 8D 89 63 01 00 00 87 0C 24 C3
E8 02 00 00 00 这个是call 87 0C 24 8D 89 63 01 00 00 87 0C 24 C3
27 EB 是花指令,个数不确定,一般是0-2个
87 0C 24 其中的0C决定使用的寄存器。
8D 89 63 01 00 00 其中89表示寄存器,后面的四个字节就是相应的差。
有一定编程能力的人,相信应该能写出去掉代码变形的工具。
弄清楚代码变形的过程 就不看在代码里面晃了,实在很痛苦。下面说一个通用的到达OEP
的方法:
重新载入程序,然后F7走,一直看到Pushad这条指令以后,走过去,使用ESP定律,运行,
停下来以后,走几步就到OEP了!
这个方法通用1.3x-1.4x保护的程序。其他版本没验证过„„ 从这点来看,ZP在技术上还只
算一个压缩壳„„
好了,到了OEP,下面开始修复IAT。
00412940 - E9 DBB73300 jmp manager.0074E120
00412945 90 nop
00412946 - E9 11BB3300 jmp manager.0074E45C
0041294B 90 nop
0041294C - E9 FFBD3300 jmp manager.0074E750
00412951 90 nop
00412952 - E9 65B83300 jmp manager.0074E1BC
00412957 90 nop
00412958 - E9 7FB93300 jmp manager.0074E2DC
0041295D 90 nop
0041295E - E9 D9B63300 jmp manager.0074E03C
00412963 90 nop
00412964 - E9 27B73300 jmp manager.0074E090
00412F0A - E9 F5B83300 jmp manager.0074E804
00412F0F 90 nop
00412F10 68 7C5B4100 push manager.00415B7C ; <---OEP
00412F15 E8 F0FFFFFF call manager.00412F0A VB的程序这个call应该是
jmp.&Main 这个函数。
看来这处IAT调用00412F0A - E9 F5B83300 jmp manager.0074E804应该是跳转到
ThunRTMain这个函数的
我们来仔细跟踪到这里看一下,下面是去掉了jmp和变型以后的代码
0074E804 68 14E693AD push AD93E614 《---注意这个值,这就是IAT调用的jmp执
行以后的第一条指令
01504660 68 F9E1932D push 2D93E1F9
01526465 9C pushfd
01526466 E8 01000000 call 0152646C
0152646B 97 xchg eax,edi
0152646C 871424 xchg dword ptr ss:[esp],edx
0152646F 8D92 3AD3FFFF lea edx,dword ptr ds:[edx-2CC6] === jmp 0015237A5
01526475 871424 xchg dword ptr ss:[esp],edx
01526478 C3 retn
015237A5 83EC 3E sub esp,3E
0151D99C 896424 2C mov dword ptr ss:[esp+2C],esp
01521064 894424 28 mov dword ptr ss:[esp+28],eax
0151BDBC 8B4424 42 mov eax,dword ptr ss:[esp+42]
0151CBF6 894424 36 mov dword ptr ss:[esp+36],eax
015212DE 8B4424 3E mov eax,dword ptr ss:[esp+3E]
本文发布于:2024-03-27 08:30:09,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/88/60846.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:ZProtectIAT修复分析.doc
本文 PDF 下载地址:ZProtectIAT修复分析.pdf
留言与评论(共有 0 条评论) |