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

互联网   发布时间:2008-10-08 19:05:33   作者:佚名   我要评论
在本参考教程的第一部分我们学习了如何正确地转储(dump)Getright 5. 现在我们将要去找神奇跳转,这样IAT会被正确地转储下来,而不用手工修复了. 要完成这一点,我们需要打败程序中的一些陷阱, 并使它们即使在检测到被执行脱壳时也无所作为. 让我们开始吧! 第一步:如

下图是我的机器中这个call了API的call的地址. 在API返回处BPX(这个call的下一行).

点击RUN
现在在错误entry 5E9c98上下HARDWARE BPX ON WRITE然后点击RUN.当在那儿写入时将被断下.

你可以看到在前面一行保存着错误值.后面指出这个错值从[ebp-394]处来.所以在转储窗口中选择GOTO EXPRESSION EBP-394. 那儿你将会看到这个值.下BREKPOINT HARDWARE ON ACCESS.

如果我按下运行键,我将看到无论值是好是坏都在这一行被保存.看附近有一个call BPX它.

你可以看到这是关键call.因为当它结束时eax带着稍后将写入的值. 我测试了这个call里的每一个跳转(只有5到6个,通常都是这样):
00DF4B68 /75 03 JNZ SHORT 00DF4B6D
00DF4B79 /75 07 JNZ SHORT 00DF4B82
00DF4B8D /74 0C JE SHORT 00DF4B9B
00DF4B92 /74 1B JE SHORT 00DF4BAF
00DF4B99 ^75 F4 JNZ SHORT 00DF4B8F
胜利者是DF4B8D处的跳转. 正如我先前所说的在所有的armadillos里都是一样的,所以当我们在脱其它armadillo时,通过跟踪这些代码我们可以很容易发现这个好跳转.
00DF4B8D /74 0C JE SHORT 00DF4B9B
它必须永远跳转,所以我们做如图修改:

清除BPX点击run. (记住清除hardware bpx). 当程序走到我们修改为死循环的指令那儿时输入表已经修复了,再也没有坏值了. 然后它在子进程的OEP处停下.在纸上写下magic jump的值(EB 0C),记住.
我们将要重复那些步骤.当我们走到上次我们unhook 子进程那一步时,我们将要在magic jump处设置一个 infinite loop代替在API上设置.

在那儿从父进程处unhook子进程,然后它将在magic jump处死循环.
附加子进程,按 RUN, 然后停止(F12). 它将停在magic jump.

现在还没有任何改变,因为magic jump还没起作用.把它改回先前的值(EB 0C).

如果我们运行程序,它将停在OEP,而且输入表也很完美和完整.现在我们可以利用这个进程用Import Reconstructor去修复在第一部分中转储的程序了.

所有的值都是好的.最后那几个是指向dll的.

那些值指向Exxxxx,如果我们看看VIEW-MEMORY我们可以得知那是dll.

现在我们要用一下Import Reconstructor.
打开Import Reconstructor在"Attach to an Active Process"对话框选择这个进程.

装载这些dll需要很长一段时间.当完成后写下OEP的值,表的起始地址值和表的长度,不要按IAT AutoSearch.

如图在IMPORT RECONSTRUCTOR中那些值是这样计算的:你在纸上写下的值-Image Base. 比如: OEP=534E90, Image Base=400000, 534E90- 400000= 134E90. RVA也一样 (表的起始地址值).
现在按GET IMPORTS. 所有的entries都修复了.


相关文章

最新评论