找怪物

外挂分析笔记之二:
查找怪物的相关信息,并写出测试代码

游戏:天龙八部
版本:0.35.0691
主要工具:OD+CE+GE
开发环境:VS2005
作者:勿在浮沙筑高 转载文章请标明出处http://bbs.bpsend.com

要点:从怪物的名字着手,找到怪物的各种信息,分析出游戏定义的描述怪物信息的关键结构,分析汇编代码还原成C++高级语言。

由于有了一的基础,对一中已经有所讲解的内容,这里不再重复,下面开始:

1. 运行Game.exe,登陆,进入游戏。
2. 来到野外有怪的地方,我这里




我们看到边上有好多的“沙坡狼”,怪物的名字当然就是字符型收索,这里我使用GE来收 “沙坡狼”,结果如下:



有678个结果。我们需要减少这个数值。
在地图上跑动,注意这里不要切换地图,来到一个新的地方(确保边上怪物的名字和刚才的不同),我来到的地方如下:



如你所见,边上的怪物变成了“恶猿”,我们在上面的收索结果里面再次收“恶猿”。得到结果如下:



结果已经只剩下6个,而且我们还注意到,地址之间基本是相差0x40(64)大小(所有怪物的结构是相同的,所以地址相差大小相同,从这里我们也可以判断出,基本这些地址我们找对了,而且还可以初步估计,怪物的结构大小是0x40)。

到这里GE的工作基本就结束了,下面OD出马。

3. 运行OD,附加到Game.exe进程,F9让游戏跑起来。然后使用如下db命令来查看我们前面找到的内存地址(这里我们就看第一个0x02897E18):



如上图,我们看到好几个“恶猿”字样,看来我们已经找到存储怪物数组的内存地址。由于该地址是动态变化的,切换地图就会变化,所以我们需要做的就是找出它的基地址。

4. 对里面比较靠前的怪物的内存地址下内存写如断点,我这里看到最前面的是“散落的宝物”:



5. 这样可能很快OD就会断到,因为游戏在不断刷新怪物数组。如果你没断到,那随便在地图上跑动一下,有新的怪出现,OD肯定断下,断到这里(不管你断在哪句,这附近代码都是可以的):



断下后,我们看到处于系统领空,Alt+K查看调用堆栈:



接着Ctrl+F9回到Game领空:



下面贴出该段的部分我们需要的代码:



我们看到ecx = edi + 0x10,edi = eax,这里怎么找eax呢?
还记得笔记一中讲过吗,这里eax也刚好是call的返回值,F7进call,看到代码比较简单,如下:

  

这段代码虽然短,不过包含的东西可不少,我们来分析分析其中比较重要的几句(我没有分析到的请自己理解):
首先cmp edx, 100。一个比较指令,显然是判断怪物数组不能大于0x100(也就是256)。
然后有句shl eax ,6移位指令,左移6位,相当于乘以2的6次方,也就是2^6=64,现在请你好好回忆回忆,这个64我们是不是好象在哪儿见过???
哈哈~~~就是上面我们用GE找到的6个地址,它们之间的大小不都是0x40吗?0x40刚好就是64啊,呵呵,要是你到现在还没理解,那我没办法,不多说…
再有一句inc edx,不就是怪物数组当前的总数加1吗?
接着mov dword ptr [ecx+407C],edx,没什么好说的了吧,将新的数组的总数大小写回。
这里我们就是要找ecx!!!退回函数调用的地方,继续向上去分析ecx是怎么来的。

6. 分析ecx




所以我们需要去查找ebx。

向上一直找,终于看到mov ebx, ecx,下图:



这里的ecx又是父函数传递进来的,没什么好说的,Ctrl+F9去到父函数查看。

TMD,看来还有点麻烦啊,来到父函数,代码如下:




哈哈哈哈哈,看到那句了没:mov ecx, dword ptr [627864]

基本就是我们要的了~为了确定,我们在该句下断,哈哈,值对。

7。。到这里怪物的基址也就找到了,剩下的就是分析怪物的结构,写出高级语言,和一说的一样,这些都只是时间的问题而已,我不讲。

本讲最终结果
怪物数组地址:[0x627864] + 0x407C + 0x7C + 0x10 – 0x20 + 0x40 * i ( 0<= i< 256)
大小:0x40
Me:以前老看不懂这里,现在根据基它教程,对这了有了一个自己的了解,解说一下:

我认为上面的是错的,根据数据,得到基址和偏移如下:

62883C+7c+10+0x40 * i ( 0<= i< 256)

今天工作基本完成,下一讲分析人物背包物品基地址和对应的数据结构。

作为本讲的结束,依然来张测试代码的截图:

你可能感兴趣的:(找怪物)