有关壳与脱壳方法

壳的概念

壳最早出现是一种专用加密软件技术,用于保护程序不被静态分析。
某些病毒木马程序也利用加壳技术来躲避杀毒软件的查杀。

壳是一段专门保护软件不被非法修改或反汇编的程序。它们一般都是先于程序运行,拿到控制权。

加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。

常见的壳主要分两类

  • 压缩壳:压缩壳的特点是减少软件体积大小,加密保护不是重点。
    常见的压缩壳有:UPX、ASPack、PECompact

  • 加密壳:最主要的目的是保护程序,一些加密壳除了提供加密功能外,还提供注册机保护功能。
    常见的加密壳有:ASProtect、Armadillo(穿山甲)、EXECryptor、Themida

脱壳

脱壳就是找到程序的入口点OEP,然后dump内存中数据到文件,并修复成一个可运行文件。也就是将加壳后的程序恢复原来状态。脱壳成功的标志是文件能正常运行。

  • 手动脱壳主要分四步
    1、查壳:PEiD等查壳工具
    2、寻找OEP:通过OD动态调试跟踪到入口处
    3、Dump文件:OD、LoadPE等工具读取内存数据并写入文件
    4、修复:利用ImportREC等工具修复输入表或手动修复

脱壳方法

一、ESP定律法

ESP定律的原理是堆栈平衡,ESP定律适用于几乎全部的压缩壳,部分加密壳。但是在何时下断点避开校验,何时下断OD才能断下来,这还需要多多总结和多多积累。

  • 使用ESP定律追踪OEP的常见步骤:
    1、基于ESP原理,我们可以通过F8步进,注意右面寄存器FPU的显示,当有且只有ESP和EIP为红色时,我们可以用ESP定律了。
    2、右键ESP后面那个地址,然后选择在数据窗口中跟随。
    3、在数据窗口设置硬件段断点→硬件访问→Dword型。
    3、按键盘上的“F9”键让程序运行起来。
    4、一般情况下,跳转之后,在Hexdump列显示55,即为程序的OEP。

二、单步追踪法

单步追踪法就是在确定程序编写的语言的情况下,根据相应的OEP特征,通过不断的F7步入、F8步过直到达到相应的OEP,用时可能会很长,这也就注定了只能够适用于小型的程序,但是比较的稳定。
单步跟踪注意call和向上的跳转,遇到跑飞的call就重载F7进入,F8不断的向下运行,遇到向上的跳转时,在向上跳转的下面一行代码出右键 选择断点运行到选定位置(F4),注意红线(跳转实现)的要在底下设置,灰色的不用管。一直F8继续向下走。
当遇到大的跳转时,可能我们很快就到OEP了。

三、出口标志法

popad指令用于将壳运行之前保存的环境恢复,使原程序能正常运行。所以在单步跟踪到popad指令后面不远处的jmp指令的时候,就可以大胆的判断这个jmp指令的目的地址就是OEP。有些壳的popad指令很少,我们就可以查看程序的所有popad指令,找到后面存在jmp指令的popad指令,然后来到其后的jmp指令的目的地址,这很可能就是OEP,然后就可以进行脱壳了。

  • 使用出口标志法脱壳的常见步骤:
    1、将待脱壳程序载入OD中,在OD的反汇编客人口中单击鼠标右键,在弹出的右键菜单中单击“查找”→“所有命令”,在弹出的输入框中输入“popad”并按“查找”按钮;
    2、逐一尝试跟踪查找到的所有“popad”指令,最终达到程序的OEP

内存镜像法:

  • 步骤:
    1:用OD打开软件!点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!
    2:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP!

最后一次异常法:

  • 步骤:
    1:用OD打开软件。点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序
    2:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m!
    3:CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)
    4:在OD的右下角我们看见有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!
    5:按F2下断点!然后按SHIFT+F9来到断点处!去掉断点,按F8慢慢向下走!到达程序的OEP!

实例、ESP定律法

1、OD的反汇编窗口停留在一条pushad指令上面,我们按下F8单步跟踪到下一条指令,然后在右侧的寄存器窗口中选中ESP寄存器(可以看到ESP寄存器的值为0012FFA4),并单击鼠标右键,在弹出的右键菜单中选择“数据窗口中跟随”在这里插入图片描述
2、 在反汇编指令窗口下面的数据窗口中,选择0012FFA4开始的四个字节,并单击鼠标右键,在弹出的右键菜单中依次选择“断点”——“硬件访问”——“Dword”菜单项,如图所示:

在这里插入图片描述
3、 接下来按下F9运行程序,程序运行一段时间后OD将自动断下,这时候我们先删除之前设置的硬件断点,依次选择菜单项中的“调试”——“硬件断点”,删除我们设置的硬件断点。
在这里插入图片描述
4、现在按F7进行单步跟踪,直到运行到0043FD24这一条指令,当然这里有一个循环比较麻烦,我们可以直接在0043FD24按下F4即可(F4代表运行到光标所在行),然后再次F7单步跟踪,来到004094F8。

      0043FD17    8D4424 80      lea     eax, dword ptr [esp-80]
      0043FD1B    6A 00          push    0
      0043FD1D    39C4           cmp     esp, eax
      0043FD1F  ^ 75 FA          jnz     short 0043FD1B
      0043FD21    83EC 80        sub     esp, -80
      0043FD24  - E9 CF97FCFF    jmp     004094F8

5、 现在在反汇编指令窗口中单击鼠标右键,选择“Dump debugged process”菜单项,在弹出的OllyDump窗口选择“Dump”按钮保存文件,注意记住这里的94F8,这是程序的入口点信息。我们将程序保存为dumped.exe,如图所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43916678/article/details/95937956