Windows 逆向使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows 逆向使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 )相关的知识,希望对你有一定的参考价值。





一、CE 找出子弹数据内存地址是临时地址



在上一篇博客 【Windows 逆向】使用 CE 分析内存地址 ( 运行游戏 | 使用 CE 工具分析游戏内子弹数量对应的内存地址 | 内存地址初步查找 | 使用二分法定位最终的内存地址 ) 中 , 分析到子弹的数据对应的地址是 019FFB48 地址 ;

上述 019FFB48 地址是一个临时地址 , 这个临时地址每次启动都会改变 ; 再次启动 , 中广核个地址又变成了 21160114 地址 ;





二、挖掘真实的子弹数据内存地址



使用 CE 定位出了子弹数据的地址是 0x21160114 地址 ; 可以找到一个最终的子弹数据地址 , 查找方式如下 :

目的是为了计算 0x21160114 地址值 , 是由哪些值计算出来的 ;


1、找出哪些指令访问了子弹数据地址 0x21160114


右键点击找出的 子弹数据 临时内存地址 , 在弹出的菜单栏中选择 " 找出是什么访问了这个地址 " , 或者使用 F5 快捷键 ;

弹出提示对话框 , 选择 " 是 " ;


弹出如下对话框 , 点击 " 停止按钮 " ,

调试就会暂停 ;

下图中 , 左侧的计数 , 表示该指令被访问的次数 ,

下面的这些指令 , 访问了 0x21160114 地址 ;

这些指令 , 都有一些规律 , 这些指令都是 esi 寄存器的值 加上 000000CC 十六进制数值 ;

esi+000000CC


2、查看 0x21160114 地址是如何计算出来的 ( ESI 寄存器的值 0x21160048 + 000000CC 立即数 相加得到 )


双击第一条指令 16B2C0ED - mov eax,[esi+000000CC] , 得到如下数据 , 其中得到 EAX 和 ESI 两个寄存器值 :

  • EAX=00000061
  • ESI=21160048

其中 ESI 寄存器的值 ( 0x21160048 ) + 000000CC 立即数 , 计算结果如下 :

0 x 21160048 + 0 x 000000 C C = 0 x 21160114 \\rm 0x21160048 + 0x000000CC = 0x21160114 0x21160048+0x000000CC=0x21160114

0x21160114 地址就是子弹数据的真实地址 , 这个地址是 ESI 寄存器的值 加上 0xCC 立即数 , 得到的地址 ;


具体的数据如下 :

EAX=00000061
EBX=0799BB70
ECX=00000000
EDX=00000001
ESI=21160048 ★
EDI=00000001
EBP=00000000
ESP=0019F2F0
EIP=16B2C0F3

指针基址可能是 =21160048

16B2C0E6 - je mp.CBasePlayerItem::DestroyItem+20D
16B2C0E8 - mov ecx,00000001
16B2C0ED - mov eax,[esi+000000CC]16B2C0F3 - mov edx,[esi+000000D0]
16B2C0F9 - cmp eax,edx

查询另外 3 个数据 , 这 4 条指令 , 都是同样的值 ;


3、查询指针基址 21160048


ESI 寄存器 中有个值 0x21160048 , 这个值不知道是怎么来的 , 这里就需要在整个内存中搜索该值 , 查找哪些内存地址中保存了来值 ;

进而查找 , 是哪条指令 , 计算出了该值 , 或者说是 访问了该值 ;


勾选 " 十六进制 " , 拷贝 21160048 值到搜索框中 , 左侧搜索出来的就是存在 0x21160048 值的地址 ;

选择查找结果的第一个 , 复制到下方地址列表 , 按 F5 查看哪些指令访问了 0x21160048 地址 , 这里的访问指的是 读取 , 写出 操作 ;

开枪 , 没有任何反应 ;

直到选择查找结果的第二个 , 复制到下方地址列表 , 按 F5 查看哪些指令访问了 0x21160048 地址 , 这里的访问指的是 读取 , 写出 操作 ;

开枪 , 才有反应 ;

指针基址可能是 =0799C144 ★

EAX=00000000
EBX=00000005
ECX=21160048
EDX=00000000
ESI=0799BB70
EDI=0799C144
EBP=00000000
ESP=0019F304
EIP=16B100F0

指针基址可能是 =0799C144 ★

16B100E3 - lea edi,[esi+000005D0]
16B100E9 - mov ebx,00000006
16B100EE - mov ecx,[edi]
16B100F0 - cmp ecx,ebp
16B100F2 - je mp.CBasePlayer::PlayerDeathThink+617D

选择查找结果的第三个 , 复制到下方地址列表 , 按 F5 查看哪些指令访问了 0x21160048 地址 , 这里的访问指的是 读取 , 写出 操作 ;

开枪 , 才有反应 ;

指针基址可能是 =0799BB70 ★

拷贝的数据如下 :

EAX=00000001
EBX=00000001
ECX=21160048
EDX=16B463F8
ESI=0799BB70
EDI=16D40640
EBP=0000000E
ESP=0019F320
EIP=16AFB378

指针基址可能是 =0799BB70 ★

16AFB36A - jne mp.info_map_parameters+4E42
16AFB36C - mov [esi+00000384],bl
16AFB372 - mov ecx,[esi+000005E8]
16AFB378 - test ecx,ecx
16AFB37A - je mp.info_map_parameters+4E76

调试第 4 个内存地址 , 得到的指针基址是 : 指针基址可能是 =0799BB70 ★

EAX=21160048
EBX=0799BB70
ECX=00000000
EDX=00000001
ESI=21160048
EDI=00000001
EBP=00000000
ESP=0019F2F0
EIP=16B2C0E6

指针基址可能是 =0799BB70 ★

16B2C0D8 - cmp esi,[ebx+000005EC]
16B2C0DE - jne mp.CBasePlayerItem::DestroyItem+20D
16B2C0E0 - cmp eax,[ebx+000005EC]
16B2C0E6 - je mp.CBasePlayerItem::DestroyItem+20D
16B2C0E8 - mov ecx,00000001

调试第 5 个内存地址 , 得到的指针基址是 : 指针基址可能是 =103508BC ★

EAX=103508BC
EBX=15A3C194
ECX=21160048
EDX=00000002
ESI=00000000
EDI=16ACE3C0
EBP=00000014
ESP=0019FAD0
EIP=16ACE3CB

指针基址可能是 =103508BC ★

16ACE3C4 - test eax,eax
16ACE3C6 - je mp.GetNewDLLFunctions+8A4
16ACE3C8 - mov ecx,[eax+7C]
16ACE3CB - test ecx,ecx
16ACE3CD - je mp.GetNewDLLFunctions+8A4









以上是关于Windows 逆向使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 )的主要内容,如果未能解决你的问题,请参考以下文章

Windows 逆向使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 | 挖掘真实的子弹数据内存地址 )

Windows 逆向使用 Cheat Engine 工具进行指针扫描挖掘关键数据内存真实地址 ( 指针扫描 )

Windows 逆向使用 CE 工具挖掘关键数据内存真实地址 ( 逐层分析分析 静态地址 到 动态地址 的寻址 + 偏移 过程 ) ★

Windows 逆向使用 CE 工具挖掘关键数据内存真实地址 ( 查找子弹数据的动态地址 | 查找子弹数据的静态地址 | 静态地址分析 | 完整流程 ) ★

Windows 逆向OD 调试器工具 ( CE 工具通过查找访问的方式找到子弹数据基地址 | 使用 OD 工具附加游戏进程 | 在 OD 工具中查看 05869544 地址数据 | 仅做参考 )(代码

Windows 逆向内存地址分析 ( 动态地址 | 静态地址 | 偏移量 )