
在上一篇博客 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 ) 中 , 没有找到真实地址 , 本篇博客重新开始一个完整流程 ;
使用 【Windows 逆向】使用 CE 分析内存地址 ( 运行游戏 | 使用 CE 工具分析游戏内子弹数量对应的内存地址 | 内存地址初步查找 | 使用二分法定位最终的内存地址 ) 博客中的方法 , 找出子弹数据的临时地址 ;
子弹个数 50 , 先进行首次扫描 ;
找出 3000 多地址 ;
开一枪 , 子弹个数变量 49 , 再次扫描 49 , 这次就剩下 197 个地址 ;
( 此处要点击 " 再次扫描 " 按钮 , 不要点成首次扫描 )
再开一枪 , 子弹变成 48 , 此时再次扫描 , 变成 196 个地址 ; 之后无论如何改变子弹个数 , 都是 196 个地址 ;
开始使用二分法筛选子弹个数 , 锁定一部分 , 开一枪 ,
锁定上半部分 , 开一枪 , 发现子弹个数没有减少 , 说明子弹数据在锁定的数据中 , 删除底部没有锁定的所有数据 ; 选中后按 delete 键即可删除 ;

将剩余数据的后半部分解除锁定 , 选中后 , 点击空格 , 切换 锁定 / 未锁定 状态 , 开一枪后 , 发现子弹个数仍然不变 , 删除 未锁定部分数据 ;

再次解除后半部分数据锁定 , 开一枪 , 数据仍然不变 , 说明子弹数据在锁定的这部分中 , 删除没有锁定的数据 ;

按照上述方法 , 最终只剩下一个数据 ; 给该地址设置 " 子弹数据地址 " 描述 , 将内存地址值改为 888 , 此时游戏内显示的子弹个数也变成了888 ;

寻址注意事项 : 寻址时 , 尽量找
MOV 寄存器1 , [寄存器2 + 立即数]样式的指令 ;
子弹数据地址为 0x019FFB48 , 这是个临时地址 , 每次启动该地址值都不同 ;
选中子弹数据地址 , 按 F5 , 使用 Cheat Engine 调试器载入目前进程 ;

如下指令 , 访问了 0x019FFB48 地址 ,

核心数据 :
指针基址可能是 =019FFAA8
019386B2 - mov edi,[edi+000000A0]完整数据 :
EAX=00000090
EBX=00000014
ECX=00000078
EDX=019FFAA8
ESI=000001BB
EDI=00000378
EBP=01A0032C
ESP=0019FA88
EIP=019386B8
指针基址可能是 =019FFAA8
019386A6 - mov eax,[edx+000000D8]
019386AC - mov ecx,[edx+000000D4]
019386B2 - mov edi,[edi+000000A0]
019386B8 - sub eax,ecx
019386BA - test edi,edi查找 019FFAA8 值 , 找到 2 个绿色的地址值 , 绿色的地址值就是我们需要找的值 ;

把第一个绿色地址拉下来 , 双击查看该地址值 , 为
cstrike.exe+5FFD58
点击手动添加地址 , 勾选 " 指针 " 选项 ,
在下面的地址栏中 , 输入 cstrike.exe+5FFD58 ,
在上面的立即数栏中输入 A0 , 这是根据 019386B2 - mov edi,[edi+000000] 指令来的 ,
此时可以看到 , 该指针指向 0x019FFB48 地址 ;

最终得到子弹的真实数据地址 , cstrike.exe+5FFD58 + A0 ; 每次启动 , 子弹数据都是在这个指针指向的内存中 ;
