指针扫描
目录
0x00 Target
- 【基地址】+【偏移】+【偏移】+…=【偏移地址】
- 【Target】是【Winform】窗体;
- 【Winform】标题是【Form1】;
- 【button】功能是刷新【label】;
- 【label】标签用来显示【int类型】测试变量,测试变量的【初始值】为9528。
- 以下源代码:
|
|
0x01 偏移地址
- 查找变量【当前值】:
- 筛选出能改变 【Target】的【偏移地址】:
- 此次得到【偏移地址】为【02BB5960】。
0x02 指针扫描
- 对【02BB5960】进行【指针扫描】:
- 默认扫描【最大偏移值】4095,默认【最大偏移层次】7层:
- 选择【*.PTR】文件保存位置:
- 总共扫描【336422】个指针,下列的是【符合条件的指针列表】:
0x03 多次筛选
- 为了避免偶然性,我们重启【Target】以改变【偏移地址】,然后在【符合条件的指针列表】中再一次进行【指针扫描】。新的【偏移地址】是【030B5960】:
- 打开从【符合条件的指针列表】再次扫描界面:
- 填入新的偏移地址【030B5960】:
- 选择【*.PTR】文件保存位置,覆盖上次文件即可:
- 总共扫描【6648】个指针,下列是【此次符合条件的指针列表】:
- 【再次扫描】这个步骤,一般重复三到五次,多多益善。
0x04 测试
- 多次扫描后,在新打开的【CE】中按住【Ctrl】,依次点击【M】【P】【O】键,然后导入【*.PTR】文件:
- 观察【Points to】列,值为空的表示这不是一个真正的【基地址】:
- 【双击】选择一个【Points to】列的值为测试值的【基地址】,将自动添加到【CE】:
- 通过该【基地址】,将指向的值更改为【6666】:
- 刷新【Target】,检验是否是正确的【基地址】:
刷新前
刷新后
- 经检验,是正确的【基地址】。
0x05 CT
- 将【基地址】以【*.CT】形式保存到本地:
- 导入【*.CT】,使用【基地址】:
- 通过【基地址】成功读取到【测试值】:
0x06 实战
- 练手经典游戏【植物大战僵尸】的【阳光基地址】:
- 为了准确,首先制作两个【阳光偏移地址】的【Generate Pointermap】:
然后关闭游戏再来一次
- 两个【阳光偏移地址】的【Generate Pointermap】制作完成:
- 然后查看是哪个地址改写了第二个【阳光偏移地址】:
- 捡一个阳光,然后获得一条改写记录,双击此记录:
- 因为【上个地址】+【偏移】指向第二个【阳光偏移地址】,所以我们得到第二个【阳光偏移地址】的最上层偏移是【5578】:
- 接下来,对第二个【阳光偏移地址】进行【指针扫描】,设置如下:
- 将扫描结果保存为【PVZ.PTR】,扫描得到【32417】个有真有假的【阳光基地址】:
- 现在将当前阳光【25】变动为【75】,然后再次对【PVZ.PTR】进行扫描:
- 现在剩余【18011】个有真有假的【阳光基地址】:
- 再次将当前阳光【75】变动为【100】,然后对【PVZ.PTR】进行扫描,发现梯度已经不再下降,我们开始对【阳光基层偏移】进行【排序】,以便我们找到最短最有效的【阳光基地址】。
- 按照下图序号依次点击排序,最后我们找到了最少偏移个数的阳光基地址【“THREADSTACK0”-00000568】,实际上阳光基地址有更简单的,这种方法没有搜到,将当前阳光【100】变动为【75】测试一下:
- 【“THREADSTACK0”-00000568】+【0】+【8】+【5578】>【阳光偏移地址】:
- 现在重启电脑后,再重启游戏进行测试:
开始游戏前
开始游戏后
- 【“THREADSTACK0”】是【线程地址】,我们可以通过【threadstack.exe】工具转换【线程地址】成一个【内存地址】,这样便于写工具,当然使用【进程基地址】就没有这个麻烦:
- 也就是说:
|
|
- CheatEngine是我随便下的。