zl程序教程

您现在的位置是:首页 >  系统

当前栏目

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

Windows内存地址工具数据 关键 逆向 挖掘
2023-09-27 14:28:10 时间





一、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

在这里插入图片描述