本次查找基址单纯用CE找不到,要用OD配合才能找到,而且通过这个例子也能明白为什么有的基址用CE找不到。以前我也写过一个类似的例子,这次再记录一次,就当加深印象吧。本文来自猛牛哥的博客。
要查找的内存如下图:
然后查看什么代码访问了此内存:
搜索:082402BC,扫描到3个地址。
对这三个地址都查看一下什么代码访问了此地址,发现只有第一个地址:0243F400有访问记录,另外2个内存地址没有记录。所以确定是第一个。
再次搜索这里的:0243F3E8,就找不到任何数据了。到这里CE就进行不下去了。
换OD上阵,先关掉CE才能用OD附加游戏进程。附加完毕以后,先按F9把游戏运行起来,防止掉线。然后CTRL+G,定位到刚才的代码位置:1000ED3A,按F2下断点。
观察代码发现,EAX来自ECX,等断下以后,运行到返回,看到如下代码:
这里最后的ECX就是刚才要找的EAX:0243F3E8,刚才用CE搜不到这个值。这里有个add ecx,0x400的代码,这个代码是直接操作寄存器,改变寄存器的值,不会访问内存,所以用CE无法搜到,而且“查看什么代码访问了此内存”功能也无法探测到。根据经验,这个地方就是关键原因。这个地方将ECX的值增加了0x400,那么它原来的值就是:0x0243F3E8-0x400=0x243EFE8,再打开CE,搜索一下:243EFE8试试。(小提示:如果只用CE搜内存,可以不用关OD,只有用CE查看什么代码访问某内存时才需要关掉OD)
搜索结果有2个绿色地址,说明终于找到了。这个内存地址的指针就是:[[0x4864d8]+0x400+0x18]+0x10e,将这个指针填入CE验证,正确。本文来自猛牛哥的博客。
总结:如果用CE找基址时中途突然就找不下去了,很可能就是遇到了游戏内部通过直接操作寄存器等方式改变了其中的某些数值。用OD进行跟踪一般就能找到。当然,CE也有下断点调试的功能,理论上只用CE也可以搞定这个工作,不过用起来不如OD顺手。
原來是透過直接操作寄存器訪問內存,在修改記憶體的時候一直不能理解為什麼沒有任何地址訪問了這個地址,卻還能改變數值,謝謝大大分享。