顺便说一下,我们可以假设第一个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.

发表评论