红绡枫叶 发表于 2012-8-30 14:01

菜鸟也玩 ZProtect v1.4(demo) IAT 修复

【软件名称】: 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:
0084F929    8B00            MOV EAX,DWORD PTR DS:
0084F92B    E8 48CAC5FF   CALL 004AC378
0084F930    A1 0C738600   MOV EAX,DWORD PTR DS:

进入CALL 004082A8,再进入第一个call:
004081CC- FF25 B0138700   JMP DWORD PTR DS:                ; 1_72.009CAE9C
004081D2    8BC0            MOV EAX,EAX
004081D4- FF25 AC138700   JMP DWORD PTR DS:
004081DA    8BC0            MOV EAX,EAX
004081DC- FF25 A8138700   JMP DWORD PTR DS:                ; 1_72.009C9EF4
004081E2    8BC0            MOV EAX,EAX
004081E4- FF25 A4138700   JMP DWORD PTR DS:


IAT已被加密,跟随到数据窗口-->内存地址,看到
008713B0009CAE9C1_72.009CAE9C<--------第一种加密
008713B400000000
008713B8009CA5781_72.009CA578
008713BC009CAAAC1_72.009CAAAC
008713C001AF0196    <----------第二种加密
008713C401AF01A4
008713C801AF01B2
到IAT尾部:
00871CA801B001F8<--------第三种加密
00871CAC01B00206
00871CB001B00214
00871CB401B00222
00871CB800000000
00871CBC009CAB481_72.009CAB48
00871CC001B00230

第一种加密,009XXXXX
第二种加密,01AXXXXX
第三种加密,01BXXXXX
在 008713B0009CAE9C1_72.009CAE9C<--------第一种加密   上新建EIP,注意,此时先前用来到达OEP的硬件断点不要删!F8一路步过,最后
来到
018673DD    C3            RETN
此时堆栈已出现解密后的地址:
0012FFC0   7C80B741kernel32.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 ,0    ;DLL结束的地方,不处理
je mainloop
CMP ,00A00000
JB loop1         ;调向第一种加密处理
JMPloop2         ;调向第二三种加密处理


loop:
mov eip,      ;在目标地址新建EIP
esto            
mov ,      ;栈顶出现真实函数地址,我们把它写回到 IAT
jmp mainloop

loop1:    ;第一种加密处理
BPHWS 018673DD
JMP loop

loop2:   ;第二三种加密处理
MOV bp_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
--------------------------------------------------------------------------------
【版权声明】: 本文原创于红绡枫叶, 转载请注明作者并保持文章的完整, 谢谢!

huabian 发表于 2012-8-30 14:23

支持原创啊,呵呵

FishSauce 发表于 2012-8-30 14:24

我连菜鸟都算不上...惭愧{:17_1075:}

Chief 发表于 2012-8-30 15:19

整体算蛮详细的,期待继续分析讨论。

sky_line 发表于 2012-8-30 15:24

看上去好复杂啊。。

沉思 发表于 2012-8-30 15:45

这个 我都看不懂连菜鸟也不算啊

可乐煎饼 发表于 2012-8-30 16:05

给楼主说的我连菜鸟都不算了唉我再仔细看看

王者之剑 发表于 2012-8-30 17:07

不错,又一高手出现

、小细 发表于 2012-10-15 01:27

看看啦
感谢

305830505 发表于 2012-10-15 01:30


不错,又一高手出现
页: [1] 2
查看完整版本: 菜鸟也玩 ZProtect v1.4(demo) IAT 修复