-
-
[原创]菜鸟也玩 ZProtect v1.4(demo) IAT 修复
-
发表于:
2012-8-30 12:52
8957
-
[原创]菜鸟也玩 ZProtect v1.4(demo) IAT 修复
【文章标题】:菜鸟也玩 ZProtect v1.4(demo) IAT 修复
【作者邮箱】: a474528738@163.com
【软件名称】: XXX邮件推广
【使用工具】: OD,exeinfoPE
【操作平台】: XP SP3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
Zp脱壳的实例资料在我们论坛比较少,正好我在我电脑上看见了一ZP加壳的软件,就顺便脱了,写了我
的第一篇脱文。第一次写脱文,难免有错误与遗漏,到时请各位不吝指出!在此感谢。
OD载入,先F7单步,到达
009C89DC 60 PUSHAD
009C89DD ^ E9 F7FCFFFF JMP 009C86D9 <---此步之后下好断点: hr esp
下好断点后F9运行,弹出注册对话框,点试用,断下,单步F7到达OEP:
0084F914 55 PUSH EBP <------OEP
0084F915 8BEC MOV EBP,ESP
0084F917 83C4 F0 ADD ESP,-10
0084F91A B8 9CEA8400 MOV EAX,0084EA9C
0084F91F E8 8489BBFF CALL 004082A8 <----
0084F924 A1 0C738600 MOV EAX,DWORD PTR DS:[86730C]
0084F929 8B00 MOV EAX,DWORD PTR DS:[EAX]
0084F92B E8 48CAC5FF CALL 004AC378
0084F930 A1 0C738600 MOV EAX,DWORD PTR DS:[86730C]
进入CALL 004082A8,再进入第一个call:
004081CC - FF25 B0138700 JMP DWORD PTR DS:[8713B0] ; 1_72.009CAE9C
004081D2 8BC0 MOV EAX,EAX
004081D4 - FF25 AC138700 JMP DWORD PTR DS:[8713AC]
004081DA 8BC0 MOV EAX,EAX
004081DC - FF25 A8138700 JMP DWORD PTR DS:[8713A8] ; 1_72.009C9EF4
004081E2 8BC0 MOV EAX,EAX
004081E4 - FF25 A4138700 JMP DWORD PTR DS:[8713A4]
IAT已被加密,跟随到数据窗口-->内存地址,看到
008713B0 009CAE9C 1_72.009CAE9C <--------第一种加密
008713B4 00000000
008713B8 009CA578 1_72.009CA578
008713BC 009CAAAC 1_72.009CAAAC
008713C0 01AF0196 <----------第二种加密
008713C4 01AF01A4
008713C8 01AF01B2
到IAT尾部:
00871CA8 01B001F8<--------第三种加密
00871CAC 01B00206
00871CB0 01B00214
00871CB4 01B00222
00871CB8 00000000
00871CBC 009CAB48 1_72.009CAB48
00871CC0 01B00230
第一种加密,009XXXXX
第二种加密,01AXXXXX
第三种加密,01BXXXXX
在 008713B0 009CAE9C 1_72.009CAE9C <--------第一种加密 上新建EIP,注意,此时先前用来到达OEP的硬件断点不要删!F8一路步过,最后
来到
018673DD C3 RETN
此时堆栈已出现解密后的地址:
0012FFC0 7C80B741 kernel32.GetModuleHandleA
那 018673DD 就是IAT解密完成后的跳转。我们得到第一种加密的关键地方:018673DD
又新建EIP,跟随后两种加密方式,都可以看到这样的形式:
PUSH EAX
PUSHAD
PUSH XXXXXXXX
CALL 018A43A0
POPAD
RETN
在RETN一句,堆栈也已经解密出真实地址了。
其中 CALL 018A43A0 是一个关键地方,大家可以进去分析分析。
现在要修复IAT就比较简单了,我写了一个脚本,供大家参考:
var cur_addr
var old_esp
var old_eip
var end_addr
var bp_addr
mov old_esp,esp ;保存eip,esp,脚本运行后我们要还原
mov old_eip,eip
bphwc ;删除所有断点
bc
ask "输入起始的IAT地址-4"
cmp $RESULT, 0
je exit
mov cur_addr,$RESULT ;IAT起始地址-4
ask "输入结束的IAT地址+4"
cmp $RESULT, 0
je exit
mov end_addr,$RESULT
mainloop:
BPHWC
BC
mov esp,old_esp
add cur_addr,4
cmp cur_addr,end_addr ;IAT结束+4,当前地址大于这个值,IAT修复完毕
jae exit
cmp [cur_addr],0 ;DLL结束的地方,不处理
je mainloop
CMP [cur_addr],00A00000
JB loop1 ;调向第一种加密处理
JMP loop2 ;调向第二三种加密处理
loop:
mov eip,[cur_addr] ;在目标地址新建EIP
esto
mov [cur_addr],[esp] ;栈顶出现真实函数地址,我们把它写回到 IAT
jmp mainloop
loop1: ;第一种加密处理
BPHWS 018673DD
JMP loop
loop2: ;第二三种加密处理
MOV bp_addr,[cur_addr]
ADD bp_addr,0D
BPHWS bp_addr,"x"
JMP loop
exit:
mov eip,old_eip
mov esp,old_esp
bc
BPHWC
ret
起始IAT-4=008712A4
结束IAT+4=00871D78
此脚本已经测试通过。ZProtect会对PE头做比较大的手脚,修复的时候要注意
取消lordpe勾选“从磁盘文件粘贴PE头”,然后DUMP下来,修复,成功!这是为什么?
原来,我们之前脱壳抓取镜像的时候,使用的从磁盘文件(加壳文件)贴过来的PE头,
而对于加壳文件来说,资源表是被修改了的。这样就会出错。 以下是脱壳试练品,有兴趣的可以试一试。你还有别的脱壳思路吗?
http://pan.baidu.com/share/link?shareid=7962&uk=4280448916
--------------------------------------------------------------------------------
【版权声明】: 本文原创于红绡枫叶, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)