其他分享
首页 > 其他分享> > 脱壳之Mole Box壳

脱壳之Mole Box壳

作者:互联网

文件名称 xbtszmV3.5.exe

大小:14804 KB

MD5: C76B6A5A99D6B4261110B2BF2A14EA73

使用PEID和Exeinfo PE查看exe文件,发现是加了Mole Box壳的程序:

 

 

直接用OllyDbg打开,按惯例先找到OEP。

可以看到程序入口点处有熟悉的PUSHAD,我们直接使用ESP定律,先单步执行到PUSHAD的下一条指令处,然后在ESP处下硬件断点。

按F9运行程序,程序断在0x14F17B1处,单步到CALL EAX处,再F7单步进去后就到了原OEP。

得到OEP处的地址0x4558DE

找到原OEP后,我们去查看IAT的情况,在OEP处附近的就有GetVersion的调用,在该行指令上右键-》数据窗口中跟随-》内存地址:

观察数据窗口中的IAT,发现有几处异常地址:

在这种情况下,直接dump内存是不可行的,我们要先恢复IAT中这些异常的地址。

我们取消之前在ESP的硬件断点,在地址异常处下硬件写入断点,记住下断点的地址,这里是0x4751E0:

重新运行程序,在数据窗口中定位到下断点的位置0x4751E0,观察IAT中的地址,F9运行,直到0x4751E0中显示的是正常的函数地址,也就是说程序在运行到0x14F8EF8这里的时候IAT还是正常的。

下一步就是找到IAT被修改的地方,按F9运行程序,同时注意数据窗口中的变化

到这里,我们也知道0x14F9682就是修改IAT的地方。有了这些信息,我们就可以使用OllySubScript编写脚本,进行修复IAT了。

脚本的大概逻辑:如果运行到获取IAT的地方,就将函数地址保存好,然后再运行到修改IAT时,将保存的函数地址恢复到EAX,如此循环知道IAT填充完毕,然后运行到原OEP处断下:

//清除断点
BPHWC
BC

//创建变量
MOV dwOEP,04558DE       //OEP地址
MOV dwGetIAT,014F8EF8   //获取IAT
MOV dwAmendIAT,014F9682 //修改IAT
VAR dwAddr               //函数地址

//设置硬件断点
BPHWS dwOEP,"x"
BPHWS dwGetIAT,"x"
BPHWS dwAmendIAT,"x"

//循环
LOOP1:
RUN               //运行
CMP eip,dwGetIAT   //是否运行到获取IAT的地方
JNZ LOOP2
MOV dwAddr,eax     //保存函数地址
JMP LOOP1

LOOP2:
CMP eip,dwAmendIAT //是否运行到修改IAT的地方
JNZ LOOP3
MOV eax,dwAddr     //恢复正确的函数地址
JMP LOOP1

LOOP3:
CMP eip,dwOEP
JNZ LOOP1
BPHWC             //清除硬件断点
MSG "到达OEP!"

脚本编写完毕,接下来是测试效果,在这过程中我们可以停下来喝杯茶去了

脚本测试完成后提示到达OEP,在数据窗口查看IAT信息,原先有异常的地址都已经恢复正常。

这个时候就可以在OEP处dump内存了,然后使用ImportREC修复IAT,在第5步中点击“转储到文件”,选择在OllyDbg中Dump出来的文件即可。

至此,脱壳已经完成,再次使用PEID和Exeinfo PE查看,已经没有加壳的信息。

 

 

最后测试程序,运行正常。

 

 

 源文件:

链接:https://pan.xunlei.com/s/VN5SuAJT_o4cfJG1Ah4kmh5CA1
提取码:3e74

标签:Box,脱壳,OEP,程序,地址,IAT,断点,Mole,运行
来源: https://www.cnblogs.com/maotouyingx/p/16413112.html