鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站安全 > 加密解密 > >

Getright 5 手动脱壳和重建IAT--第一部分(图)

来源:互联网 作者:佚名 时间:2012-10-21 09:26
这是一篇Armadillo加壳软件Getright 5.01的脱壳译文,我是参照Ricardo Narvaja的“Getright 5 脱壳和重建IAT”的文章以及Bighead[DFCG][YCG]的译文,一边实践一边再次翻译的。感谢Ricardo Narvaja和Bighead[DFCG][YCG]。 Armadillo for Dummies: Getright 5 手

这是一篇Armadillo加壳软件Getright 5.01的脱壳译文,我是参照Ricardo Narvaja的“Getright 5 脱壳和重建IAT”的文章以及Bighead[DFCG][YCG]的译文,一边实践一边再次翻译的。感谢Ricardo Narvaja和Bighead[DFCG][YCG]。
Armadillo for Dummies: Getright 5 手动脱壳和重建 IAT (第一部分)
因为Armadillo实在是太复杂了,以至于人们已经不得不沿用下面这个手动的方法去脱壳armadillo,这不是我的过错,只是因为armadillo实在是太难脱壳了,然后我将会在这个文档中一步一步地去完成脱壳,同时配上很多图片,只是想让它变得尽量容易理解.我并不想写一个10兆大的参考教程,所以我把这个文档分成两部分.第一部分主要讲如何转储(dump)armadillo保护的程序,然后我会在第二部分中提及一些以前在其它任何教程中都未曾见过的东西,那就是输入表(import table)的redirection和rebuilding.
在我们开始之前,我必须声明这篇参考教程只在Windows XP上测试.请不要在 windows98或者2000中尝试.原因是只有Windows xp才拥有必要的API,能够把子进程(child)从它的父进程father那儿脱钩下来.
这次练习,我们找到的自愿者是Getright 5 final. Crusader曾经写过关于这个软件的某一个版本的参考教程,但是这篇参考教程在很多方面都不同于crusader写的那篇.
crusader写的那篇参考教程(原版)----附(1)
crusader写的那篇参考教程(FTBirthday翻译版本)----附(2)
你可以从以下连接下载GetRight 5.不管怎样我在我的ftp中保存了一个副本,所以你可以从那儿下载,就不用去管它在网上被放在哪儿了.
http://www.getright.com/
抓起你的鼠标,安装好Getright然后准备作战.Armadillo将会变得软弱无力.
如何脱壳(UNPACK)以及转储(DUMP)Getright 5
在OLLYBG中载入GETRIGHT.exe然后整装待发.我将按照以下的步骤,很容易记住的,你可以在其它任何armadillo保护软件中按部就班.
第一步:重新设置检测ISDEBUGGERPRESENT API的字节
我将要解释如何在任何电脑中去寻找这个字节.
首先从这个连接下载命令行插件:
http://dd.x-eye.net/file/cmdbar10802.zip
解压它然后复制dll到OLLYDBG文件夹.只要你运行Ollydbg你将会在调试窗口的左下角看到一个白色的输入框,在那儿你可以键入很多命令.让我们键入:
Bp IsDebuggerPresent
我们将要使用BP而不是BPX,因为BP可以直接在API上下断点,那正是我们所需要的.
我们必须准确地键入Bp IsDebuggerPresent.记住我们必须保证大小写的顺序,因为如果我们键入了任何不同于以上形式的命令,那么一个错误提示(UNKNOWN COMMAND)将在命令行的右边产生.所以正确地键入BP IsDebuggerPresent然后按回车. 如果在按回车后没有错误提示出现,那就说明这个BP已经生效.
现在按F9运行程序,它将会中断在API IsDebuggerPresent
500)this.width=500" title="点击这里用新窗口浏览图片" />
在这张图中我们可以看到OllyDBG中断在API IsDebuggerPresent(红色), 然后按F7步进到第三行(白色)
77E52749 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX 2]
一旦到达那儿,看一下disassembly,在那儿我们可以看到如下图的内容:
500)this.width=500" title="点击这里用新窗口浏览图片" />
这儿我们可以看到在我的机器中偏移是7ffdf002,包含了值01.这个地址在其它机器中可能会不同. 值01意味着调试器被检测到了,所以写下这个地址,在任何时候我们在ollydbg中运行程序,都必须把它修改为00,从而避免被packer检测到.记住在ollydbg中运行或重运行程序的任何时候修改此值为00.
我们将以重启ollydbg (ctrl F2)来结束第一步,到转储窗口(DUMP)单击右键选择"前往 表达" 7ffdf002或者其它任何先前你记下的地址,然后把它的值从01修改为00.
500)this.width=500" title="点击这里用新窗口浏览图片" />
500)this.width=500" title="点击这里用新窗口浏览图片" />
把它改为00.
500)this.width=500" title="点击这里用新窗口浏览图片" />
第二步:BP WAITFORDEBUGEVENT
这一步并非必要,但却是一个好的选择,当它停止时在转储(DUMP)区看到report.让我们看看该怎样做.
首先我们需要在命令行输入BP WaitForDebugEvent,和我们输入IsDebuggerPresent的方法是相同的.
现在运行它,当它停下时我们可以在堆栈窗口(Stack window)看到关于这个API的所有参数信息.
500)this.width=500" title="点击这里用新窗口浏览图片" />
看一下第二行.那儿我们可以看到它将在哪儿显示report,所以到转储窗口(dump window), 右键选择 "前往 表达"= 12EFF8.注意这个值在一些机器上可能会不同,所以前往你的机器显示的值.
500)this.width=500" title="点击这里用新窗口浏览图片" />
我们在上面的图中看到的是我们将要称之为"API report"的东西.主程序(让我们把它称为Father)通过那里得知secondary program(让我们把它称为son)发生了什么.
现在我们可以很容易地通过在命令行输入BC WaitForDebugEvent来删除这个断点.
所有的操作都是为了在转储窗口(dump window)看到report,在这个report中我们可以看到入口点OEP(entry point).
第三步: BP WRITEPROCESSMEMORY
500)this.width=500" title="点击这里用新窗口浏览图片" />
像图中一样设置这个断点然后点击"运行".也许你会在一些例外(exceptions)处停下,但是你可以通过按SHIFT F9很容易地走过.一旦我们停在了WriteProcessMemory API不要做任何事情,看下图:
正如我们在下图中看到的, father将要复制给son的第一个块(block)的所有信息,都可以在堆栈窗口(STACK window)看到.
500)this.width=500" title="点击这里用新窗口浏览图片" />
FTBirthday:由经验,我觉得很难走到这一步,但是我知道是在005F949E处call了WriteProcessMemory如图:
500)this.width=500" title="点击这里用新窗口浏览图片" />
我通过一遍遍试验,得出了最好的方法:等到前两次在别处call了WriteProcessMemory后,左手一直按住shift, 右手连续按F9大约31次,就可以顺利到达.

网友评论
<