所需工具:
CE文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
OllyDbg文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
聪明的大脑文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
勤劳的双手文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
注意:本站只提供教程,不提供任何成品+工具,仅限用于学习和研究。文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
教程如下:文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
开始分析人物数组文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
说到人物数组,我们必须要了解一下游戏中人物对象的存放形式,一般均为数组, 优点:文章源自灵鲨社区-https://www.0s52.com/jc/jsjc/2549.html
1、按照索引查询元素速度快
2、能存储大量数据
3、按照索引遍历数组方便
而且这也是我们C/C++语言中常用的写法
那么我们来分析一下该游戏,由于该游戏没有子弹数量,所以我们可以通过血量来分析该游戏的数据:
由于血量精度也比较高,所以存放形式也多为浮点数或者双浮点数,由于精度过高,所以我们不能够搜索精确数值,改为搜索两者之间的数值:
通过撞击建筑物或者其他车辆,使自身血量变动,然后过滤到血量地址:
这个时候,我们需要用到另外一款调试器:OllyDbg
我们附加进程,使用dd指令,查看血量地址,然后下硬件断点,寻找数组和基地址
程序断在了0x011299D9位置处,观察寄存器,我们得知eax为人物的临时对象地址,0x0C0为我们的血量地址偏移:0x39EE8FF0 + 0x0c0 = 0x39EE90B0 (eax)
所以我们继续去追eax,通过单步call,我们发现eax实际上来源于上方的Call的返回值:
我们进入Call去追踪Eax来源,通过追踪我们发现了数组:
并且我们发现了数组的基地址:
关于最终数组的地址的寻址过程,在这里不再赘述,我只放出大概的OD逆向的注释,大家对照一下就可以了:
最终通过我们的分析得到数组的表达式:
dd [[1C6E1F0]+(([[23E20D4]*7c0+2BE8+23CFD80]&0FFF)+2aad)*c]+0c0
其中,通过我们的分析,得知:0x23E20D4这个地址存放的使我们自身的数组的下标,所以,表达式可转换为
dd [[1C6E1F0]+(( n*7c0 + 2BE8 + 23CFD80 ]&0FFF)+2aad)*c]+0c0 n为下标
分析完数组之后,我们接下来就来分析人物的结构了!
评论