# 前言
前文提到过,想要修改一个进程内指定内存地址的数据,首先得取得『基址』。
个人感觉,『基址』可以看做一个应用在内存中某个值的『锚点』,取得锚点之后,只要该应用没有进行大的更新,无论如何更换设备、系统,其地址都能直接通过计算『确定』。
反之若没有基址,采用手动方法获取了某个值的地址,可能关闭应用再打开就没效果了。
最找出来的这个锚点,一般是某个 exe 、或者 dll 结尾的模块名,在 CE 中一般表现为绿色。
根据目前了解,通过 CE 找锚点的方式,主要有两种:
- 人工搜索,通过找指向地址值的指针,再找指向指针的指针.... 循环往复知直到绿色的基址
- 通过指针烧扫描自动查找
第一个方式适合基址偏移量不高的地址,例如 CE 自带的示例,若是偏移层数比较高,这就是一项大工程了。
何况现在真正的游戏偏移一般都不可能低,找的过程中还得一边分析逻辑,稍微不注意,可能要重找,总之就是非常繁琐麻烦。
除此之外,最大的问题就是,真实游戏的基址,甚至是无法通过这种引用关系找出的,因为找个一两层、或许就终止在了某个 esp、ebp 函数调用之类,单纯通过 CE 无法查找下去的地方了。
这时候就需要借用 ollydbg 之类的工具继续进行了。
相比手动查找方式,指针扫描我自己用了下,感觉着实方便,只需要扫描 -> 更新地址 -> 再扫描排除,就可以把基址给剩下来了。
# 使用
还是以 CE 的示例为例吧,打开 CE 的教程游戏,第二关,此处以血量为例,首先查找当前血量地址:
然后右键地址 -> 指针扫描:
最大级别,一般 5 级或以下就行了,通常一个地址指针不至于偏 6 级以上,当然最后实在找不到可以尝试高级别的设置,因为级别越高,需要搜素的数据量和产生的结果也越多。
记得保存好搜索结果,以免下次搜索不对,可以随时回退。
第一次搜索,5 级偏移,产生了 68090 个结果。
现在将游戏关闭,再打开,可以看见,之前我们搜索出来的血量地址,现在已经作废了:
删除这些作废的地址列表,按照通常找值的方式再次找到血量。
可以看到,血量新的地址已经变成 0163A2A0 ,复制这个地址。
回到上一步指针扫描界面,选择菜单的 指针扫描器 -> 重新扫描内存:
将新的地址填入,点击扫描 (记得保存为新的数据文件,避免错误时无法回退)。
这时结果变成了 65538 个,继续上述步骤。
- 得到地址 0158C730,结果变成 60922
- 得到地址 015AA8F0,结果还是 60922
若此时与上一次指针结果数值一致,后面就有两个选择:
- 挑几个顺眼的加入地址列表,重启游戏查看地址是否指向正确的数值
- 重启电脑,将内存完全重置,再进行一次查找
保险当然是是重启一次电脑比较好,此时不管列表还剩多少项,既然重启电脑都无法影响其指向正确性,那么也就可以直接当做基址使用了。
挑选也有一些规则,例如优先运行主模块为主。
# 加载扫描结果
上文提到,每次指针扫描后,CE 都会提示我们保存,保存的文件就是扫描结果。
正确保存后,可以随便加载其中某一步的扫描结果。
加载方式为:
随便扫描一个数值 -> 右键地址 -> 反汇编此内存区域 -> 工具 -> 指针扫描器 -> 文件 -> 打开 -> 选择保存文件
路径藏得稍微有一点深,不过不影响。
# 结语
以上便是指针扫描器扫基址的方式,个人感觉比手工的方式简单和准确。
此处作一点记录。