上一步阐述了如何使用代码替换功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以我们需要学习如何利用指针,在本关的Tutorial.exe
窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。接下来我们将找到内存中的基址,为什么要找指针,在前面的教程中,如果各位细心观察的话就会发现 在笔者截图中的出现地址和你的地址并不相同。也就是说,这些地址是一直在变化的,我们把它叫做动态地址,我们必须寻找到该动态地址的基址,并以此来保证唯一性。
在本关的 Tutorial.exe
窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。这一步,你不需要懂得汇编,但如果懂的话会很有帮助。
- 首先找到数值的动态内存地址,然后再 [找出是什么改写了这个地址]。
- 再次改变数值,CE便可以列出找到的汇编代码。 双击一行汇编代码(或选择它并点击 "详细信息")会打开 [详细信息] 窗口以显示详细的信息。
- 查找方括号内的汇编指令集,寻找到偏移地址,并继续搜索地址,依次寻找下去知道找到绿色基地址位置。
首先第一步,读者应该使用精确数值扫描功能寻找到特定的一个内存地址空间,如下图所示则是动态内存地址空间;
接着第二步则是通过在内存地址处,鼠标右键选择是什么改写了这个地址,并再次让内存地址发生改变,如下图所示;
至此读者通过双击打开mov [edx],eax
则可看到当前汇编指令的详细输出情况,寄存器EDX后面并没有任何偏移地址,此时读者只需要关注EDX寄存器的值,因为该值保存有指向下一个区域的内存地址,将地址01A252A8
复制到剪辑版中;
将新地址以十六进制格式搜索四字节,并可输出一个绿色的"Tutorial-i386.exe"+2566B0
没错,该地址就是一个基地址,此地址在程序重启后也不会发生任何的变化。
此时读者可以将该地址添加到底部的选择框中,点击选择空中的手动添加地址
并选中添加偏移为0,即可动态得到当前的内存地址,如下图所示;
但需要注意的是,此处的指针为什么需要使用0呢,如果汇编指令中的方栝号里存在计算(例如:[esi+12])
则需要把数值部分填在"Offset (Hex)"的文本框中,如果不存在则让它保持为0。
如果看上去是更复杂的计算指令的话(举例说明):[EAX*2+EDX+00000310] eax=4C 并且 edx=00801234 。
这种情况下EDX
便是数值的指针,而EAX*2+00000310
则是它的偏移量, 所以你要填在"Offset (Hex)"
的将是2*4C+00000310=3A8
。
回到教程,点击"确定"这个地址便会加到 CE 主窗口下方的地址列表中,如果没做错,在地址栏将显示 P->xxxxxxxx,而 xxxxxxxx 和你扫描到的地址数值是一致的,如果不一致,那么可能是哪里出错了。
现在, 改变那条指针地址的数值为 5000
并锁定它,然后点击 Tutorial.exe
窗口上的"改变指针"按钮,如果一切正确,"下一步"按钮将变为可点击状态。