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

互联网   发布时间:2008-10-08 19:05:36   作者:佚名   我要评论
这是一篇Armadillo加壳软件Getright 5.01的脱壳译文,我是参照Ricardo Narvaja的“Getright 5 脱壳和重建IAT”的文章以及Bighead[DFCG][YCG]的译文,一边实践一边再次翻译的。感谢Ricardo Narvaja和Bighead[DFCG][YCG]。 Armadillo for Dummies: Getright 5 手动脱壳
这些信息被保存在父进程的一个缓冲区从3B8FB0开始,然后它会复制给子进程一个从538000开始的 1000 bytes (BYTES TO WRITE)的块(block),所以如果我们到了这一步,我们可以很容易理解child的第一个section是完全空的,所以当它试图执行到OEP时,它报告一个error因为那儿没有任何东西,所以 father得到了通知正如我们可以在father的report中看到的,所以它停止了运行,复制必要的数据块,然后继续运行直到下一个error.被复制的数据块的大小是1000 bytes,所以当程序试图执行任何超过这个大小的block外的指令时, 另一个error将会发生,然后这个error会被通知给father, father会复制另外1000 bytes的块block然后继续.
顺便说一下,我们可以假设第一个error发生是因为son (坏小子)call了它的入口点OEP,它的值应该就在 report上.显然OEP的值必定在第一个block,father复制过去来解决son报告的error.
这个块从538000开始知道538fff.OEP值必定在这些值中. 让我们看一下REPORT.看转储窗口(DUMP window) 我们先前已经知道了指向report的指针12EFF8.

太好了!在那儿我们至少看到了三次这个值: 538540.数学课告诉我538540比538000大,比538fff小 (那些是father试图拷贝给son的那个块的起止值)所以我可以确信538540就是child的OEP.
让我们从API WriteProcessMemory来改变断点的性质.知道哪个块被拷贝不是很好吗.可以通过下面的方法做到.首先选择bpx所在的行,按F2移除bpx.
右击选择"断点/条件记录".现在在对话框中准确地填入如图所示的值.这样做的目的是使我们在记录窗口中看到所有被father decrypts并拷贝给son的blocks.

第四步: NOP THE CRIPTER CALL
在先前的参考教程s中我们知道,这儿我们是在decripter call.Father为son decrypts了一个block.但是还有一个cripter call用来encrypts或者destroys已使用的blocks来避免被转储dump.现在的任务是如何找到这个call并把它nop掉.
我现在在WriteProcessMemory API,所以我打开"呼叫堆栈窗口"(Alt K)在那儿我可以看到:

在这个"呼叫堆栈窗口"越靠上面的是越最新被执行的.从CALLED FROM 我们可以看到5F949E是father calls API的地方. 如果我们向下看,我们可以看到另一个call.所以我们获得了decripter call的offset.
DECRIPTER CALL= 5F88D1
通过"前往 表达" 5F88D1跳到那儿 ,或者左键双击它.

这是好的CALL,它用来decrypts.现在去找坏的那个,稍稍向下翻屏或者右击选择"查找参考/呼叫目标" 选择出现的两个参考中的另一个.

它在这儿呢!
重新加密的call--ENCRIPTER CALL = 5F8A24

现在我们把它nop掉.我们选择这个call按空格写入nop.


相关文章

最新评论