再战加密壳

初识程序:
在这里插入图片描述
用Die查壳,显示没壳,不太正常,我们换一个工具再来尝试一下:
在这里插入图片描述
而且我们通过工具可以看到,编辑工具使用VC6.0,接下来我们开始用OD来调试程序:
在这里插入图片描述
在进去之后,我们先单步一步一步的跟随下去:到第一个CALL指令的时候,我们跟进去看一下,在干什么:
在这里插入图片描述
进去之后,发现程序是在遍历PEB结构,(同时遍历的还有各个模块的导出函数),之前已经写过PEB的遍历过程,这里就不再赘述。
我们跳出去接着看:继续单步往下走:到第二个CALL进去之后,看到它的主要工作是找到VirtualProtect这个函数:
在这里插入图片描述
这个时候需要注意一下我们的地址窗口栏,可以看到在找到这个函数之后,地址窗口兰停在422000这个地址,对应地址里边的内容放的应该是函数的地址,接下来我们继续往下走,来到第三个CALL,跟进去之后,单步运行会发现,这个时候程序好像陷入死循环了,其实不然:如下图:
在这里插入图片描述
可以看到该程序段的内容是,从401000开始比较,一直比较2A000次,在这期间,eax不断递增,而最重要的是,在比较之前,程序段会将改地址出的数据亦或掉,而从上面我们可以知道,VirtualProtec这个函数的地址是422000,这个程序段在执行完之后,会将42A000到401000这段地址的内容都修改掉,结合上一个CALL的结果,大概推测,该程序已经在修改函数的地址。接下来我们继续往下看:
在这里插入图片描述
可以看到下边进行的操作是:Kernel32.VirtualProtect和弹窗的部分,这部分我们可以直接跳过,因为这部分的操作主要是进行初始化或者说是进行弹框询问用户,(其实就是壳代码的一部分),之后我们继续看下边的代码:
在这里插入图片描述
之后再单步运行:
在这里插入图片描述
这时候就来到了一个对于我们说比较重要的函数:现在我们跟进这个CALL看一下,
在这里插入图片描述
CALL过来之后,程序到了这块,接下来继续单步:可以看到程序在不断地获取一些比较重要的API函数
在这里插入图片描述
继续单步,到了这一步的时候:
在这里插入图片描述
我们注意观察,在上一步我们刚获得GetProcAddress这个函数,EAX里边存储的数是:
在这里插入图片描述
HeapFree的地址,接下来我们继续单步,会发生什么?那就会把EAX存储的值修改掉,
在这里插入图片描述
可以看到,这个时候,EAX的值已经被修改,而EAX的值放到了ss:[ebp-0x25]里边,如上图所示,接下来我们继续单步执行:可以看到在下边的时候 ,程序CALL了一个VirtualAlloc 函数,所以我们可以知道这款应该是程序申请了一块内存空间,来存放修改之后的函数的地址,现在我们面临两个问题:第一个就是怎么看到IAT表里边的数据;第二个就是怎么判断IAT表里边的数据被修改了。
我们先来解决第一个问题:我们在OEP里边开始执行程序的时候,碰到的第一个CALL,一般会是系统函数的CALL,因此我们就先来到OEP的地方来找一下,在我们看到这个CALL的时候,会发现会显示一些有意思的数据:
在这里插入图片描述
我们跳过去看一下这个地址的东西,为什么要看呢,是的没有错,因为这个地址就是我们苦苦寻找的IAT表。接下来我们来解决第二个问题,怎么看IAT表是否被修改了,这时候我们就要定位到IAT表,看看再执行我们推测的修改IAT表代码的时候,IAT表的数据会不会发生改变,(或者可以选择直接在IAT表处下一个硬件写入断点):如下图:
在这里插入图片描述
在这里插入图片描述
我们在下断点之后,可以发现,程序在执行到这儿的时候会断下来,而且数据窗口的值会发生改变,接下来我们继续让程序跑起来:
不难看到程序在运行到下边的时候,再一次断了下来:
在这里插入图片描述
这个时候的EAX还是277000,而我们之前422214这块地址的值还是000293C4,现在已经变成了277000,说明,我们的IAT表确实是被修改了,接下来我们继续单步运行麻将这个过程复现一下:
在这里插入图片描述
在这里插入图片描述
放两张图来作对比,对比之后发现,在单步运行之前,422218地址处的数据是293B8,运行之后,IAT表422218处的数据被修改为278000,因此,我们可以判断在4385F0这个地址,程序完成了对IAT表的修改和填充,那么是什么时候开始的呢?这个问题相对比较好回答,因为壳之所以要将IAT表填充掉,是防止程序本身通过正常途径来找到相应的API函数,但是有一个前提条件 那就是不能妨碍它的壳代码对于API函数的寻找,所以,在填充之前,壳代码势必要先将IAT表里边的函数拿出来,之后再填充,那么我们的问题就解决了,答案是什么呢?答案就是,IAT表的填充实际上从壳代码将API函数从IAT表里边拿出来的时候就已经在准备了,所以我们的第二个关键地址也就能找到了:004385B9。整个壳代码的分析到这里就告一段落了,下面把这个壳代码的工作流程大概(壳代码的思路)梳理一下:
大概思路:这个壳程序的大概思路是这样的:先通过遍历PEB结构来找到导出表里边的所有函数,再将IAT表里边的函数进行挨个加密(这时候需要注意,IAT里边存储的是API对应的地址)壳的作用就是讲这些地址取出来之后,再加密,将加密过后的API的地址放到壳代码申请的一段内存空间去,这样的话,如果不运行壳代码的话,程序在调用系统的API的时候就会因为地址不正确导致找不到正确的API,事实上,壳代码的功能不仅仅局限于对IAT表的加密,毕竟在加壳之后程序还是要正常运行的,这时候就要涉及到解密的问题了,刚才说到,壳代码在运行之后会在内存当中申请一段空间,壳代码会将申请的这段空间的 地址放到IAT表当中,当程序运行的时候,就会CALL到这个地址,这时候,就会顺着这个地址找到申请的这段空间,空间当中存放着加密之后的API地址以及解密的代码,在程序电泳到这个地址的时候,会运行这段解密代码将加密过后的地址解密出来,同时返回给程序,这样就是整个加壳的原理,我们脱壳的话,逆着走就好了。
最后,附上壳的解密代码:
在这里插入图片描述
乍一看上去不像解密代码,是因为这一段代码存在花指令,运行过去之后,发现程序如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们知道一个数和同一个数异或两次之后,就会得到原值对不对,那么 成功解密。
以上就是整个壳的加密原理,加密原理已经很清晰了,下一步就是正式的手动解密并且脱壳了,和之前的Mole脱壳相同,此处不再赘叙。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值