再战加密壳-通过加壳工具加壳的程序

程序运行:
再战加密壳-通过加壳工具加壳的程序
这个加壳程序在使用Die查壳的时候,查不出来壳,但是用PEid查的时候显示有壳但是又查不出具体是什么壳.(很奇怪,我也不知道是什么类型的壳,毕竟是加壳程序加的,但是实现原理是加密IAT的方式)
接下来正式脱壳:
还是遵循一把的脱壳方式,先找OEP,找到OEP之后脱壳:
(通过找大跳转的方式进行寻找)
再战加密壳-通过加壳工具加壳的程序
找到大跳转之后,直接运行过去准备脱壳:
再战加密壳-通过加壳工具加壳的程序
但是,之这个时候进行脱壳是存物的,虽然我们的OEP没有问题,但是,之前的介绍已经讲明,这是一个加密壳(加密了IAT表的壳),这个时候脱壳的话,拖出来的程序是不能运行的,因为IAT表还没有修复.我们可以跟过去看一下,这个时候IAT表的内容:
再战加密壳-通过加壳工具加壳的程序
总结之前脱IAT加密壳的经验,我们需要把握三个重要的地址:
第一个就是获取到正确的IAT内容的地址
第二个就是找到对IAT进行修改的地方
第三个就是找到OEP

以上三个要素,OEP我们已经找到,接下来的工作就是寻找获取正确IAT内容的地址以及找到修改IAT内容的地址

还是老方法,我们找修改IAT表的地址,通过在IAT表内部下硬件写入断点,来找到相应的地址:
再战加密壳-通过加壳工具加壳的程序
之后将程序重新加载,直接运行,记录程序段下来的地址:
(在重载之后运行之前,需要确认自己下的硬件写入断点是不是被程序清除掉了,如果清除掉了,重新在IAT表下断点,再执行,而且再进行这个操作的时候一定要清除所有的程序断点,保持唯一变量)
程序重新加载之后直接F9跑起来,记录程序段下来的地址:
第一次断:49D2B4
第二次断:49D5F0
经过调试运行,可以知道,程序在我们的硬件写入断点的条件下,只断下来两次,需要注意,我们要寻找的修改IAT表的地方应该是最后的修改的地方,因为第一次的IAT写入断点我们不是很关心(这个时候,还在运行加壳程序),但是在第二次的IAT写入的时候就是为我们的程序运行做准备了,所以我们要第二次的IAT写入断点的地址:也就是49D5F0.
再战加密壳-通过加壳工具加壳的程序
在这里断下来之后,我们可以掌握一个信息,那就是在这里对IAT表的内容进行修改,在这个地址往上看,发现有异或和赋值的操作,这时候就要敏感,会不会是将原来的IAT数据进行加密之后再存回去,为了验证我们的猜想,我们可以在这里进行调试一下,下断点之后直接定位让程序运行到这里:
再战加密壳-通过加壳工具加壳的程序
接下来开始调试:
可以看到程序执行GetProcAddress来获取函数的地址:
再战加密壳-通过加壳工具加壳的程序
在这里,在执行完这个API的时候,获取的函数地址的返回值,存储在EAX里边,接下来的操作就是针对EAX的操作,在获取到正常的函数之后,将原来的函数地址进行简单的加密操作,之后存储:
再战加密壳-通过加壳工具加壳的程序
再战加密壳-通过加壳工具加壳的程序
也就是说,上边的整个IAT加密过程整理如下:
1:首先获取函数的正确地址
2:将正确的地址进行简单加密操作
3:申请一块空间
4:将加密过的数据放在申请的空间里边
5:将申请的空间的基址放到IAT表里边

所以经过上边的分析,我们另外的两个关键点也找到了,接下来就是开始写脚本 ,手动修复IAT表
再战加密壳-通过加壳工具加壳的程序
修复脚本如上,当然也可以使用,直接修改程序的方法进行修复
再战加密壳-通过加壳工具加壳的程序
这也是一种方法,(不过采用这种方式修复IAT表 之后再脱壳的方式我也没试过,还是脚本比较舒服一点)
以上就是整个脱壳过程