仔仔爱逆向 发表于 2017-1-14 14:55

某款加密壳脱壳详解

本帖最后由 仔仔爱逆向 于 2017-1-18 21:18 编辑

第一次发帖,希望大家支持下!{:5_116:}
环境:win7 x86工具:OllyDbg/UIF通用修复工具/ImportRec/LoadPE      
首先查壳,不知道什么写的:
看看区段,虽然都被修改了,但可以猜测是VC6.0写的
先让程序运行起来,找特征码:83EC58只找到一处,所以的确是VC6.0写的,但是看第一个call,发现IAT被加密了,真实的OEP应该为00409486,我们下一个硬件执行断点
00409486,我们下一个硬件执行断点
重新运行程序,点F9运行,程序没有断下来说明壳有反调试,把硬件断点清除了。
那么清除硬件断点有2种方法:1.使用API:SetThreadContext2.使用异常首先把OD的异常选项都取消,
StrongOD的选项也改下,如下图:
第一次:内存访问异常
点击SEH链中第一个,分析函数,发现这个不会改变硬件断点
按Shift+F9跳过这个异常第二个异常:除0异常
点击SEH链中第一个,分析函数,发现这个不会改变硬件断点
按Shift+F9跳过这个异常第三个异常:特权指令异常
点击SEH链中第一个,发现有点可疑,0043AF42下一个硬件执行断点
按Shift+F9跳过这个异常,到达这个硬件断点我们查看下eax+0x4的内存,发现跟硬件断点地址一样,就可以确定这个是修改硬件断点的地方
把调试选项改成这样:
重新运行,按F9,断在这里,选中以下
填充为nop
继续运行按F9

发现可以断下,但是IAT还是被加密查找所有模块间的调用
发现有部分API是正常显示的,但是有部分应该被加密了
我们随便进入一个API,数据窗口跟随一下
我们往上找,发现IAT的起始地址为00422000
在IAT的起始地址00422000下一个硬件写入断点:
断下来后,nop掉清除硬件断点的代码,后最后一次断在这里004398CF:
重新运行,重复之前操作,最后断在004398CF后单步跟踪发现调用了dll
寄存器窗口也有可疑字符串,之后发现这里面是一个循环,应该是遍历导出表
找到循环的结尾,我们在004338FAD按F4跳出循环

发现断在这里,因为advapi32.dll中RegCloseKey在程序运行的时候还能看到,那么RegCloseKey就是未加密的函数了,也就是说004390F7就是未加密IAT的赋值地址了。
关于加密的函数,我们知道一个Kernel32.dll中的GetVersion,那么我们就在Kernel32.dll的导出地址表中GetVersion的位置下断点,用PE工具查看GetVersion的导出地址表RVA是000B5A74,转换为VA后我们下硬件访问断点
转换为VA(这里的VA为770A5A74)后,我们下硬件访问断点:
重新运行程序,重复之前操作,发现最后断在这里:
我们单步F8一下,eax就是GetVersion的地址,那么这里就是原始IAT的地方了
我们先到真实OEP地方:
还是看GetVersion这个函数,因为这里被加密,所以我们需要知道什么时候加密的,那么我们下0043CFCD硬件写入断点重新运行程序,重复之前操作,去除不可疑的地方,发现最后断在这里:
看上面的EDI=0043CFCD与之前的call 的地址一样,并且EAX=00330742与之前看的001F0742的地址相似,可以断定,这是堆空间的地址,但是RVA是一样的都是0742,可以肯定这就是关键的地方。我们往上看,发现写入断点虽然生效,但是却没有写入EDI的地方,所以判断这是反汇编引擎的识别问题
但是应该就在上面附近,那么我们就用CTRL+G查看0043918C之前的n个字节的地址的反汇编,0043918B是pop es,这个不对,那么我们试试0043918A跳转,果然加密IAT写入:
我们在执行完取得原始IAT后才能下0043918C的硬件断点,所以我们为了方便需要写脚本处理:模拟手工脱壳1.下断点,清除掉清除硬件断点的代码0043AF42 ,nop掉43AF51-43AF72,共0x22字节2.下断点,原始IAT的下一条语句的地方                                                         00438f9f不加密,写入IAT的地方                                                                     004390f9加密,写入IAT的地方 ,这个可以不下断点                                        0043918c原始OEP                                                                                  00409486
OD脚本代码:
VAR vAPIAddr // API地址
BPHWC// 清除所有硬件断点BPHWS 0043AF42,"x" // 清除硬件断点的异常处理函数,nop掉清除硬件断点的代码BPHWS 00438f9f,"x" // 原始IAT的下一条语句的地方BPHWS 0043918c,"x" // 加密,写入IAT的地方BPHWS 00409486,"x" // OEP
RUN      // 运行程序cmp eip,0043AF42// 清除硬件断点的异常处理函数fill 0043AF51,22,90//填充为nop
LOOP_1:RUN               // 运行程序
cmp eip,00438f9f // 获取IAT函数地址的地方mov vAPIAddr,eax // 保存IAT的函数地址
RUN      // 运行程序
cmp eip,0043918c // 加密,写入IAT的地方mov ,vAPIAddrJE LOOP_1
cmp eip,00409486JE EXIT_1JMP LOOP_1
EXIT_1:   MSG "修复完毕"

修复完毕后,dump出来
然后重建导入表:
最后用ImpRec修复dump文件的导入表
最后结果正常打开软件:
用PEID查看:
最后,感谢大家能看完,感觉就是贴图不易,希望论坛越办越好!{:5_121:}

cqr2287 发表于 2017-1-14 15:39

cc2008cb 发表于 2017-1-14 15:44

欸,我得学习

DEEMO 发表于 2017-1-14 16:32

膜拜大佬、、、

hackysh 发表于 2017-1-14 19:50

写的真不错,学习了   

piaoyi01 发表于 2017-1-14 23:07

可以的。。 厉害了。。

topcookie 发表于 2017-1-15 01:08

太强大了,看的偶晕晕糊糊的

tom2017 发表于 2017-1-15 01:16

谢谢楼主分享 学习

动物凶猛 发表于 2017-1-18 14:57

真正的大牛啊

joesen 发表于 2017-1-18 17:14

感谢楼主学习学习
页: [1] 2 3 4
查看完整版本: 某款加密壳脱壳详解