- UID
- 66880
注册时间2010-5-23
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 开心 2023-6-2 15:44 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
|
本帖最后由 blackk 于 2014-11-17 12:39 编辑
尽管它是老壳,尽管它已被通杀,但某些壳注定一出身就不平凡!
这么多年过去了,依然通过它还可以学习到很多!
~
我是小菜,只能从低版本开始玩了,1.2版本的强度还不是很高,先调戏一下它。
一、查壳
使用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 =-=
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|