好友
阅读权限10
听众
最后登录1970-1-1
|
照片依旧
发表于 2025-7-16 10:19
本帖最后由 照片依旧 于 2025-7-16 09:43 编辑
ESP定律简述
所谓ESP定律,其通过判断ESP中地址的变化,来判断壳解密函数是否执行到位,也就是栈平衡。
程序被加密后,必定会有解密的过程中。解密过程中,壳程序需要进行大量的运算,会“污染”寄存器状态,由于程序的代码执行是线性的,不存在巨变跳跃,所以需要一个地址来保存在解密之前代码的执行状态,也就是寄存器的状态,以便可以正确执行程序。
按照上述所论,寄存器中的值,也就是代码的执行情况需要先保存,再取出恢复。
这些寄存器的值是保存在哪里呢,它保存在堆栈中。但是只保存,不能保证程序可以有效地取出来,所以需要一张“地图”来导航,而ESP就是这张“地图”,里面存放的指向所保存数据的堆栈的栈顶地址。
在执行保存寄存器状态时,会使用pushad和pushfd命令,将寄存器中的值压入栈中,给程序执行拍了一张快照,这张快报需要一个地方来保存,这个保存的地方就是ESP寄存器了。保存完毕之后,就可以继续执行解密函数,寄存器可以供程序随意使用。执行完解密函数后,需要回到之前的状态。系统会拿出来地图,将之前保存在栈中的寄存器的值都取出来,ESP寄存器中的地址也就是我们的地图完成了使命,会被之前的值覆盖。所以通过ESP可以很快了解到程序是否被解密完毕。
解密出原始程序后,壳程序最终是需要执行到原始程序中去(如果壳程序带“锁”,需要“钥匙”解密后再跳转到原始程序入口的另说),这样再使用单步跟踪,便找到真正的OEP,程序的入口处。
要记住,壳的作用是用来避免别人可以轻易找到源代码,轻易破解程序,但是壳不能影响原始代码。
程序简单概述
加壳程序在未运行状态情况下,其源代码被壳程序加密,一般是无法使用IDA等静态工具直接修改来使用,ida也可能无法正常识别其中的头文件和函数。
加壳程序要正常运行,壳程序不能影响原始程序,也就是原始程序要能够在系统中正常运行,且原始程序功能不发生改变,功能不发生改变。在功能不改变的情况下,原始程序代码也应该也是没有改变的。
既然程序是可以正常运行,且功能没有改变,这就表示运行状态的加壳程序,在运行过程中会将原始程式从加密状态中解密出来,原始程序会在内存中出现。具体为什么在内存中,此处就不详细概述。
现在情况,我们知道了原始程序的代码会在内存中被解密出来正常运行,所以我们就是要从内存中入手,将原始程序从内存中复制出来。
脱壳方法概述
脱壳方法按照我的理解,可以统分为两类。第一类是从原始程序运行前切入,也就是我们在论坛中常看到的ESP定律、内存镜像定律、单步跟踪等方法;第二种是从原始程序运行后切入,就是从堆栈入手,直接找到第一次的出现 程序名加地址,反汇编向上翻找OEP入口。也可能还有其他的方法。
所有的脱壳方法,都是通过各种手段尽快到达程序OEP入口处之前的路径,但是,到达OEP之前,还是需要使用单步跟踪方法进行程序分析。
最重要的一个内容是要能够准确识别程序OEP。各种方法都是减少在脱壳中的分析时间,不能识别程序的OEP,脱壳也只能是猴子捞月了。
程序脱壳流程分析——从ESP入手
上图为加壳程序运行的一个简单流程图,可能存在理解错误,欢迎大佬指正。
上文简单分析了ESP定律。
此处附一个流程图,明晰一下ESP定律。
|
-
流程图
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|