RebPe.exe的手动脱壳

1、查壳
通过在查壳软件PEiD v0.94中选择RebPe.exe文件打开即可查看该软件的所加壳的类型,查看结果如下所示:

此时所进行的普通扫描(Normal Scan),Normal Scan虽然速度快且方便,但只能检测出某些此前已知的加壳和压缩工具,对于新型加壳技术可能不准确或无法识别。
因此,为了确定软件是否加壳,还可以选择进行深度扫描(Deep Scan)和核心扫描(Hardcore Scan),其具体步骤为点击“->”符号,选择“Deep Scan”或“Hardcore Scan”进行进一步的扫描操作,即如下图所示:

此时则会如下图所示出显示其所加壳。

2、查找程序的原始入口(OEP)
查找程序的原始入口OEP主要可以通过跨段指令、内存访问断点、栈平衡原理和编译语言特点进行实现。
2.1根据跨段指令寻找OEP
此时可以双击启动LordPE.EXE工具,然后在其右侧的按键中选择“PE Editor”点击后选择rebp.exe文件打开,此时即可再新窗口中查看到rebp.exe文件的相关信息,随后在其右侧的按键中选择“Sections”开启新窗口“Sections Table”,此时即可在该窗口中查看到rebp.exe文件的各个区块的信息,其具体的操作步骤与查看结果如下图所示:

由上图可知rebp.exe文件的区块信息中存在外壳区块.pediy,该区块相当于一个文件加载器(Loader)。当文件运行时外壳得到控制权后可通过各种方式获取所需的API地址,解密源程序各区块的数据以实现对IAT的填充,随后即可跳转至源程序入口点。运行时,各区块被映射值内存,现阶段程序的入口地址为13000h。
运行OllyDbg,调试选项中“Event”将暂停点设置在主模块的入口点。打开rebp.exe后,程序将暂停在地址00413000h处,即如下所示:

随后点击F7键实现单步步入操作,直至程序执行至地址004130C8h处,

随后点击F8键实现单步步过操作,直至程序运行至地址00413135h处,

由上图中地址00413135处的汇编显示将会进行跳转操作,继续点击F8进行单步步过操作即可跳转至地址00580000h处,即第一条跨段跳转指令。

通过分析可知,从地址00580000h处开始的程序段的主要工作是还原各区块数据,初始化原程序。
继续按F8键直至程序执行至地址00580283h处,可以查看到如下图所示的汇编指令,该指令相当于“jump 401130”,即第二条跨段指令。

此时继续按F8键则会实现二次跳转,跳转后程序将运行至地址00401130h处,即如下所示:

综上所述,外壳的初始化过程中,外壳两次使用到了跨段转移指令,第一次是从.pediy区块跳转到外壳的第2部分,第二次是从外壳的第2部分跳转至程序本身的代码所处区块,即.text区块,此即为判断该处是否为OEP的关键。
2.2根据内存访问断点寻找OEP
在OllyDbg中打开rebp.exe程序,按“Alt+M”键打开内存模块,对代码段设置内存访问断点。该断点为一次性断点,当所在段被读取或执行时就会中断,中断后就会自动删除。

按F9键执行程序,此时程序将会在地址00413145h处中断,即如下图所示:

此处开始时aPlib的解压函数aP_depack_asm,按“Ctrl+F9”键继续运行即可到达外壳地址005800D6h处。

使用F7键是程序运行至地址005800DAh处,在使用F8键运行至地址005800DDh处,即如下所示:

随后使用“Alt+M”键打开内存模块再次在地址00401000h(代码段.text)处设置断点。

再次点击F9键运行该程序,此时程序将停止原始程序入口点的地址00401130h处,即如下所示:

综上所述,根据内存访问断点寻找OEP的关键点在于待代码解压完毕对代码段设置内存访问断点,若之前也设置了断点,程序将不停地在对代码进行写入的指令处中断。也可以直接设置两次内存断点,因为一般的壳会依次对.text、.rdata、.data、.rsrc区块进行解压处理,所以可现在.rdata、.data等区块处设置内存访问断点,带程序中断,代码段已解压,再对代码段设置内存访问断点即可到达OEP。
2.3根据栈平衡原理寻找OEP
编写加壳软件是需保证外壳初始化的现场环境(各寄存器值)与源程序的现场环境相同(主要是ESP、EBP等重要寄存器值)。
加壳程序初始化时保持和寄存器的值,外壳执行完毕后再恢复各寄存器内存,最后跳转至源程序执行,即编写加壳软件时必须遵循堆栈平衡原理。且通常情况下会使用pushad/popad、pushfd/popfd指令来保存与恢复现场环境。
使用OllyDbg加载RebPe程序,此时程序的初始地址00413000处的汇编指令为“pushad”,即如下所示:

使用F7键运行至地址00413001时,寄存器的值如下图所示:

ESP指向19FF58,对这个地址设置硬件访问断点:

按F9键运行程序,外壳代码处理结束后,调用popad指令恢复现场环境时访问这些栈,OllyDbg将会中断在地址00580283h处。

此时连续按两次F8键即可到达原程序的OEP。

2.4根据编译语言特点寻找OEP
各类语言编译的文件入口点都存在其自身的特点,同一种编辑器其入口代码均类似,均存在一段启动代码,编译器编译程序时自动链接值程序中去完成必须得初始化工作后再调用WinMain函数。
在VC6编写的函数中一般存在GetCommandLineA(W)、GerModuleHandleA(W)、GetVersion、GetStartupInfoA(W)等函数被调用。
使用OllyDbg加载RebPe程序,按“Ctrl+G”打开跟随表达式输入“GetVersion”后单击“OK”按钮即可跳转至该函数的入口地址()处。

随后在该函数的入口地址处设置断点。

随后按F9键实现程序的运行,程序将会中断在地址00580283处

再按“Ctrl+F9”后程序将会跳转至地址0040115Ch处,即OEP附近。

3、抓取内存映像文件
一般的Dump软件都是根据MODULEENTRY32结构中的modBaseSize和modBaseAddr字段得到进程的映像大小和基址,再调用ReadProcessMemory来读取进程的数据。
读取成功后,一些Dump工具会检查 IMAGE DOS FIGNATURE和IMAGE_NT_SIGNATURE 是否完整,如果不完整则会将保存在磁盘上的原始文件的头部取出来替换到 Dump下来的数据文件,并将程序入口点修改为 OEP。
运行RedPe.exe和LordPE,在LordPE的选项(“Options”)中勾选“Full dump header from disk(完整转存,从磁盘粘贴文件头)”。

在进程窗口选择RebPe,点击右键执行“dump full(完整转存)命令”即可转去内存数据并保存在文件中。

如下图所示则表明已经转存完成。

为了防止壳采用Anti-Dump技术破坏脱壳过程可以采用跟踪外壳执行过程以跳过指定代码与通过LordPE直接从磁盘文件PE头中的SizeOfImage修正这两种解决方法。
针对第二种方法,在同时运行RebPe.exe和LordPE时,在LordPE的进程(Path)窗口选择RebPe.exe,单击右键执行“correct ImageSzie(修正镜像大小)”命令即可。

此时结果如下图所示:

4、PE文件(输入表)重建
运行RedPe.exe和LordPE,并在LordPE的进程(Path)窗口选中RebPe.exe,单击右键执行“correct ImageSzie(修正镜像大小)”命令后,再点击右键执行“dump full(完整转存)”命令,此时转存文件自动保存为dumped.exe文件。随后点击“Exit(退出)”退出LordPE。
随后运行ImportREC,在其列表框中选择RebPe.exe进程。

由上图可知此时的OEP为0013000。此时则需要将OEP的虚拟地址(RVA)修改为00001130。

随后单击“IAT AutoSearch”按钮,使其自动检测IAT的偏移和大小,此时则会弹出如下对话框。

如上图所示则表明所输入的OEP已经发挥作用了。
随后单击“Get Imports”按钮使其分析IAT结构得到基本信息,然后再单击“Fix Dump”按钮选择刚刚抓取的dumped.exe映像文件。此时则会自动创建一个dumped_.exe文件(脱壳后的文件),该文件可正常运行,运行结果如下所示:

而dumped.exe映像文件则无法正常运行,运行结果如下所示:

最后,双击启动LordPE.EXE工具,然后在其右侧的按键中选择“PE Editor”点击后选择dumped_.exe文件打开,此时即可再新窗口中查看到dumped_.exe文件的相关信息,随后在其右侧的按键中选择“Sections”开启新窗口“Sections Table”,此时即可在该窗口中查看到dumped_.exe文件的各个区块的信息,即如下所示:

由上图可知,脱壳后的区块信息中新增了.mackt区块。

posted @ 2023-06-20 14:08  Auion  阅读(550)  评论(0编辑  收藏  举报