【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] 内存
- Windows核心编程 第十七章 -内存映射文件(下)
- Windowsw核心编程 第13章 Windows内存结构
- 通过使用 NTLite 工具实现精简Windows系统
- windows7 照片查看器无法打开图片, windows提示因为可用内存不足,但我的内存4G?
- 解决windows和ubuntu之间粘贴复制失效
- 每日Ubuntu小技巧 —— 让Windows访问你文件的最简单的方法
- QT中处理不同Windows(窗体中的)消息
- Windows下启动Docker容器遇到Error invoking remote method ‘docker-start-container‘: Error解决办法
- Python全新Flet框架或将打通iOS、Android、Macos和Windows多平台开发(Flet教程含3个完成项目源码)
- windows下查看特定端口被什么程序占用
- Step-By-Step Installation of RAC with RAW Datafiles on Windows 2000
- windows环境下一键搭建大数据开发环境,Java+hadoop+hbase+elasticsearch+apache-tomcat,对上海出租车历史数据进行了分析并做了轨迹数据可视化展现
- Kettle入门介绍 与 Windows 中的 基本 操作(详细图文并茂)
- windows快捷键学习
- [转]Windows内存堆内容整理总结