blackk 发表于 2014-11-17 12:12:24

AsProtect 1.2 简单脱壳分析

本帖最后由 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 ,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 =-=


逍遥枷锁 发表于 2014-11-17 12:58:21

来支持下,脱壳太不了解了,谢谢。

zxy20014 发表于 2014-11-17 13:42:53

膜拜
学习下~

wgz001 发表于 2014-11-17 14:01:05

{:soso_e179:} 学习了
又开始玩壳了啊

ccdecf 发表于 2014-11-17 20:42:47

学习下~                                    

sndncel 发表于 2014-11-17 21:27:51

{:soso_e141:}进来学习了呀。谢谢楼主分享呀。

cfc1680 发表于 2014-11-18 08:11:30

膜拜学习

JZL 发表于 2014-11-18 20:26:13

感谢分享了,步骤很详细。

lucky_789 发表于 2014-11-18 21:47:42

膜拜

yber 发表于 2016-10-14 08:38:17

很不错,学习了
页: [1] 2
查看完整版本: AsProtect 1.2 简单脱壳分析