[原创] Manually Unpacking a Morphine-Packed DLL with OllyDbg[翻译]

Manually Unpacking a Morphine-Packed DLL with OllyDbg[翻译]

作者:Joe Stewart(2006年1月4日)
原文链接:http://www.joestewart.org/morphine-dll/
译者:Cyg07[cyg0x7 at 0wei.com]
译者注:本人翻译不佳,望路过的兄弟多多指正!感谢machenglin和KuNgBiM两位前辈的耐心指导!

刀枪剑戟: OllyDbg, Stud_PE, UltraEdit(或其它编辑器)
技术等级: 新手级别

在OllyDbg里对EXE类型文件脱壳一般都是很直观的,但有时候,当我们面对一个被加壳的DLL文件,就可能会复杂一些。由于OllyDbg通过loaddll.exe加载DLL文件进行分析,也就是说DLL文件在达到我们对OllyDbg设置的断点前已经执行了自身的初始化代码,这使得DLL文件可以利用这个空隙插入反调试代码来干扰我们的调试。

本教程为大家循序渐进的讲解如何使用OllyDbg手工对被Morphine加壳的DLL文件进行脱壳。在这种情况下,我们的目标是一个被卡巴报为"Trojan-Proxy.Win32.Agent.jz"的恶意程序。RDG packer detector
查壳为 Morphine 2.7。



如果我们现在直接载入的话,OllyDbg会提示我们是否起用LOADDLL.EXE对该DLL文件加载分析。



这并不是我们想要的,所以我们选择NO。在我们把它加载到Olly前,我们对文件做下一些改动,使得Olly认为这个目标文件是个独立、标准的EXE类型的文件。这里我们使用Stud_PE来寻找PE头中的"Characteristics"值。具体位置处于目标文件的物理偏移0x117上的单字节数据。我们要做的是就把里头的数值0x21改为0x01,保存,然后再载入到OllyDbg中。
[译者注:如果对这一过程不了解的话,可以查看下PE头的数据结构]




现在我们把文件载入到Olly中,已经顺利的停在主模块断点,让我们开始脱壳旅程吧。



当一个Morphine加壳的文件运行时,它会解压磁盘源文件中的数据并通过VirtualAlloc函数开辟一定内存空间来存储磁盘文件加载过来的数据。我们需要做的是转储(dump)源文件和设断点来转储(dump)未被加载执行的内存映象。我们可以通过查找VirtualAlloc函数(CTRL+G 查找函数)并设置断点来实现。



不少壳都使用一些反调试技巧来检测输入表中的函数是否被设置了软断点。在这里Morphine壳并没有使用这个反调试机制。我们可以简单的在VirtualAlloc函数的初始代码设置断点,然后再F9运行。



当我们停在断点处的时候, 磁盘文件上的数据已经被解压出来并准备加载到内存中了。这时我们打开OllyDbg的内存地图窗口[memorymap]找到PE头后的第一个区段,右键之选择"数据(Dump)"。随即转到“反汇编”模式,再右键选择"Hex->Hex/ASCII(16 Bytes)",你将看到如下的结果。



往上滚动下直到PE头,在开始处查找熟悉的字符"MZ",随后的是"This program must run under Win32"。如果是这样的,这意味着我们的脱壳工作已经完成了第一步,现在我们可以右键选择
"Backup->Save data to file"。



在这一点上我们需要做的是对内存转储后的文件在PE前删除几个字节,并在合适的位置截取文件。

在这一点上我们需要做的是对内存转储后的文件在PE前删除几个字节,并在合适的位置截取文件。我一般都是在Linux进行底层的文件操作,但我知道大部分人阅读这篇教程是在Windows平台上,我会演示下如何使用UltraEdit-32十六进制编辑器来解决这个问题。

首先使用UltraEdit打开转储后的文件并定位在PE头部的MZ字节处。注意下物理便移0x4969[16进制], 18793[10进制]。



来到文件的开始处,选择第一个字节,右键选择 Edit->Hex Insert/Delete 或者Ctrl+D.在弹出的对话框中选择"Delete"并输入直到PE头前的总大小(18793).



现在我们要做的就是在适当的位置截取文件.(实际上即使你跳过这个步骤也不会有任何影响的;唯一的就是不这么做的话文件只是会稍大一些而已.)在UltraEdit中保存下该文件,然后将保存后的文件载入到Stud_PE.查看"Sections"选项,注意下文件的最后一个区段上的RawSize和RawOffset.把它们相加起来就是未加壳前程序的原始大小,在这里,0x25800 + 0x3800=0x29000.



我们再回到UltraEdit中,并选择偏移为0x29000的字节. Ctrl+D 再次来到删除字节的对话框,然后再输入一个足以删除余下所有所有数据的大小.



现在我们已经有了一个和被Morphine加壳的原始DLL的拷贝了.我们可以再次把它载入到Stud_PE查看该PE文件的对应数据,并查看下DLL文件从系统文件导入的输入表信息,这在没有脱壳前是没法看到的.当然现在你也可以很清晰的获取这个DLL文件输出表信息了.



全文完
[From The InterNet,For The InterNet.]

TOP

发新话题