发布于:2018-6-15 09:56 | 132055次阅读 作者: 外部投稿 | 原作者: 通化程序员
一般来说分析怪物对象遍历都是要从怪物的血量入手的,但是有些游戏会加入很多的陷阱,让我们无法轻易的断到正常的遍历,以《QQ西游》为例 首先我们用CE搜索怪物血量,这里和角色血量一样,还是要搜索浮点数,很快得到一个地址(如图)
接下来通过OD下访问断点, 很快游戏断下(如图) 这里断到的偏移和角色血量断到的一样,我们经过几次执行到返回后得到0A81C偏移(如图) 继续向上分析并执行到返回几次可以得到角色基地址(如图) 我们在这个过程中并没有得到可以用来遍历的数据结构,而怪物对象仅仅是挂在角色偏移0A818下面,也就是说这个A81C可能是临时写入的,代表的是当前选中怪物,我们将选中怪物取消,发现这个偏移中的值变为0(如图) 于是我们在这个地址上下写入断点,再次访问怪物游戏断下(如图) 继续向上分析ecx的来源,通过堆栈进行搜索,得出ecx最早出现的代码(如图) 向上分析call 0052E400的第一个参数edi,来源于0062C551 处的 call 004B8050,到call内部可以得到数组加链表的结构(如图) 返回后可以在0062C54A 处call 004B74B0内部得到基地址[8DAC28](如图) 这样我们可以得到周围对象遍历的公式如下 [8DAC28]+2142C数组起始地址 [8DAC28]+21430数组结束地址 [8DAC28]+21438周围对象数量包括数组成员和链表中的成员总和 [[8DAC28]+2142C]+n*4 数组成员 [[[8DAC28]+2142C]+n*4]+0 ID [[[8DAC28]+2142C]+n*4]+4 对象 [[[8DAC28]+2142C]+n*4]+8 链表 链表+0 ID 链表+4 对象 链表+8 链表 判断到链表为0结束 对象+550+BF*4 对象血量
来源:通化程序员-公众号投稿 GSLAB网站投稿文章仅代表作者本人的观点,与本网站立场无关。 *转载请注明来自游戏安全实验室(GSLAB.QQ.COM) |
最新评论
发表评论