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

互联网   发布时间:2008-10-08 19:05:33   作者:佚名   我要评论
在本参考教程的第一部分我们学习了如何正确地转储(dump)Getright 5. 现在我们将要去找神奇跳转,这样IAT会被正确地转储下来,而不用手工修复了. 要完成这一点,我们需要打败程序中的一些陷阱, 并使它们即使在检测到被执行脱壳时也无所作为. 让我们开始吧! 第一步:如
第一次变化可能会很久才发生, 但是记住不断的在OllyDbg运行、在PUPE中点击BUSCAR,并检查字节窗口中的值,直到字节窗口中的值从零开始变化.

如图所示,那个值变化了. 现在再重复几次,你将会看到:


子进程已经完全解出并赋值IAT. 我们必须在那个值第一次变化之后子进程赋值之前进入子进程. 这是个问题,但我耍了一个把戏解决了.
我们将要重复上述过程.关闭Parcheando--PUPE的窗口,因为当重启后进程的句柄会变.
重复上述过程直到你在PUPE的窗口中观察到那个值的第一次变化.你应该看到类似这样的东西:


很难找到一种好方法, 所以我决定在某个API上制造一个死循环.就选GetProcAddress吧.所以现在我们要去父进程中找到它.选择VIEW-EJECUTABLE MODULE 查找KERNEL32.dll 这是GetProcAddress所属的dll.

右击VIEW-NAMES查找api GetProcAddress


写下这个地址(红箭头).现在在PUPE中选择子进程,让它去找search (BUSCAR)这个地址值. 不同的机器这个值会不同. 我的是77E5B332.在字节窗口你会看到前两个字节是55 8B,所以在纸上写下,并在PUPE中将其改为EB FE然后按下PARCHEAR

在那儿现在子进程将会处于死循环中,我们可以说它已经睡着了. 我们现在必须把它从它的父进程那儿unhook下来.
在父进程窗口任意处点击鼠标右键,选择"新建起源"然后写下下面的代码
PUSH (son’shandle)
Call DebugActiveProcessStop
Nop (在这儿BPX并检查是否EAX=1)

在0042F00A 下中断,然后运行一下停在0042F00A 处。看看寄存器窗口的EAX值,如果这个值=01就表示子进程和父进程分离了。如果=00那么可能是子进程的句柄填错了, 你可以在下面重新写入代码再次运行,直到EAX=01时就可以关闭OllyDbg了(杀掉父进程!)然后就可以进入子进程了。
重新运行Ollydbg(不要加载程序)附加上子进程.
再次在PUPE中恢复原来的代码 55 8B并按 "Parchear" 再看看程序中的代码又还原成了77E5B332.

程序将会中断,就像你在下图中看到的.

让我们看一下那个错误的entry,右击转储dump窗口选择GOTO EXPRESSION 5E9C34.

Bp GetProcAddress 然后按RUN. 你可以看到当中断时错误的entry已经被重写了,但是表并不完整. 重新打开一个ollydbg载入tute.exe.如果在5e9c8c下面还有一个错误的entry就看那儿.

以5E9c98处的错值为例,因为那儿将会被写入DF513C.

回到Getright.exe (第一个ollydbg)看一下堆栈. 那儿的API被Df4cB2处的called调用并将会返回到DF4cB8.
在主窗口中选择GOTO EXPRESSION 0Df4cb8.


相关文章

最新评论