本帖最后由 Blackk 于 2014-11-17 12:57 编辑
尽管它是老壳,尽管它已被通杀,但某些壳注定一出身就不平凡!
这么多年过去了,依然通过它还可以学习到很多!
~
我是小菜,只能玩di版本,记录一下自己的学习记录。图片更换为高清大图,点击“实际大小”即可
一、查壳
使用PEID的OEp查找插件可以直接找到OEp的位置
二、脱壳
下面开始手动找到OEp,OD载入,停在入口点。忽略除了“非法访问内存”的所有异常
21次SHIFT+F9之后程序运行。
重载程序,在20次SHIFT+F9之后,停到此处,我们对代码段下内存访问断点
SHIFT+F9之后就停在OEp了
可以看到程序的IAT都已被移到壳的区段了
我们来看一下怎么还原IAT
重载程序,忽略所有异常,对00460ADC下内存写入断点
第二次断在这里
EDX指向要处理的IAT,EAX是该IAT的值(处理过),ESI可以看到IAT的名称
在上面的第一个CALL下F2断点
F9运行,此时EAX的值就是真实的函数地址,这里是个循环,直到IAT处理完毕
如果你时间够多我不介意你一个一个手动修复,我很懒的,还是写一个脚本吧~
//定义要用到的变量,并且清除断点var oep
var getapi
var apiaddress
var fixapi
bphwc
//获取GetSystemTime函数的地址(因为壳会用到这个函数,方便我们找到壳的区段)
rtr是执行到返回,那么就到了壳区段,然后搜索二进制(这个二进制就是CALL上面的那几句代码,你也可以自己找,我样本不多,不通用也说不定)
找到就继续处理,没找到就停止脚本
gpa "GetSystemTime","kernel32.dll"
bp $RESULT
esto
bc $RESULT
rtr
find eip,#8DB5FFFEFFFF568B450C50#
cmp $RESULT,0
je error
//设置OEP、IAT获取、IAT处理的地址(就是我们找到的CALL和写入的地址)
运行一次mov oep,4271b0
mov getapi,$RESULT+10
mov fixapi,$RESULT+19
bphws getapi
bphws fixapi
bphws oep
esto
//此时停在CALL处,将EAX的值(函数地址)保存
运行一次
将函数地址修复
是否停在OEp?停在OEp就停止脚本fixbegin:
mov apiaddress,eax
esto
mov [edx],apiaddress
esto
cmp eip,oep
je finsh
jmp fixbegin
//错误和脚本的停止处理finsh:
MSG "IAT修复完成,请检查"
ret
error:
MSG "未搜索到获取API地址,请使用手动输入。"
ret
好了,全部组合起来,OD开始跑脚本,可以在数据窗口查看IAT的修复情况
IAT修复完成后,我们检查一下,发现还有一个函数没有修复
来到指向的函数地址,我们手动修复一下
三、收尾
在OEp处Dump程序,然后修复IAT,没有错误^_^
附件下载,脚本在第一个附件中,测试了一下,这个脚本也支持1.23RC =-=
我是附件.zip
(2.38 MB, 下载次数: 349)
|