Athena 发表于 2015-2-6 20:51:23

Delphi做魔域 之怪物列表遍历

Delphi做魔域 之怪物列表遍历

我见过很多发帖求助魔域怪物列表如何遍历的帖子,当然,结局自然是不了了之,因为我个人是业余爱好者,也早就对官服没了兴趣, 中怪物数组真的没用,也一直没碰这个问题,其实主要还是水平太菜,其实说魔域的怪物列表方法还是很多的,小举两例吧:
1、可以根据怪物坐标,让一个怪物跟着你跑,用CE范围搜索还是很容易找出临时地址的
2、怪物类型,鹿角兽叫鹿角兽,巨杰士叫巨杰士,这是有区别的当你跑到只有鹿角兽的怪物堆里,肯定有个表示它是鹿角兽的值A,当你跑到只有巨杰士的怪物堆里,这个值肯定会变成B,魔域是不会维护列表中已经失效了的值的,但是再怎么第一个还是会维护的,右下角的怪物信息就是告诉你当前有怪物数组里有什么怪物,方便你分析的。

这两个方法我都没用过,我当时想到的是有没有一个变量保存着当前怪物数组里有多少个怪物,于是试着找了下,我用CE扫啊扫、找啊找,马勒戈壁的没有找到,我当时就想,难道一个XP把周围怪全打死了,计算的时候还一个怪物一个怪物的加还是怎么的,虽然怪物数组对我来说毫无用处,但我还是有点郁闷。

最后经过多次试验,更确切的应该是到上一篇中的双风珠分析时恍然大悟,为什么风珠call中的那个ID不是幻兽出征Call中的那个ID,为什么有时候BB收回再出征后风珠Call中的ID会变化,难道它是个怪物,没想到事实上它真的就是个怪物,出征一个BB,怪物数加1,召回或合体一个BB怪物数减1;如果幻兽出征后就算个怪物,那么别的什么例如NPC、卫兵算不算怪物?然后只带一个BB跑到了卡城上面的城墙外一搜索,证实了幻兽出征后就是野兽的传说。

很幸运,怪物数量地址搜出来就是个基址,省了不少事,废话够多了,下面正式开始

我今天搜出来的地址是001249A0,用CE找到怪物减少时的代码如下
EAX=01124974ECX=00000000

Probable base pointer =01124974

00ba9a91 - dec ecx
00ba9a92 - test ecx,ecx
00ba9a94 - mov ,ecx
00ba9a97 - jne 00ba9aa6
00ba9a99 - mov ecx,
用ID找出基址的步骤这里省略,最后将给出结果


根据这里是否可以找到怪物ID列表我不是没有尝试,但最后放弃了,我是从上一篇的风珠Call切入的,既然它领我进门,就继续让它领下去。
00A5B10A|.50                           push eax   
00A5B10B|.E8 70AB1600      call soul.00BC5C80   
00A5B110|.85C0                        test eax,eax   
00A5B112|.8945 D8                  mov dword ptr ss:,eax          ;eax=113E2408
下面分析eax=113E2408 是怎么来的

这里我们依然找个没人没兽的地方,反正我是这么做的,至于有人有怪物的地方好不好混我就不清楚了


从幻兽ID转换开始:
00A5B10A|.50            push eax                                     ;下段,这里的EAX为幻兽ID
00A5B10B|.E8 B06E0300   call soul.00BC5C80   ;F7跟进后按F8单步步过执行,中间结果见下面分析
00A5B110|.85C0          test eax,eax                           ; 最后的EAX

跟到下面
00BC5CA9|> /8B87 54700000   /mov eax,dword ptr ds:
00BC5CAF|. |6A 00                         |push 0x0
00BC5CB1|. |B9 70491201          |mov ecx,soul.01124970                               ;值得注意,与CE找到的01124974竟然如此接近,肯定有问题
00BC5CB6|. |8B04B0                  |mov eax,dword ptr ds:
继续,我们发现下面的代码貌似实现了上面幻兽ID转换代码功能是一样的
00BC5CB9|.50                              |push eax                                                         ;这里的EAX仍然是幻兽ID
00BC5CBA|.E8 C146FEFF         |call soul.00BAA380                                       ;EAX改变
00BC5CBF|.85C0                         |test eax,eax                                                    ;上一个Call出来之后的EAX就是00667670处的EAX

这里是一个循环
经过分析,在00BC5CB9处切换断点,若出征了幻兽则会会立马断下;没有出征BB则不会(合体的不算出征);当出征一个BB时,EAX的值每次断下都一样;出征两个BB时,EAX会是两个值交替变化,很容易发现这两个值正好是出征的两个BB的ID,那么我们把别的断点全取消,把所有出征的BB收回,仅在00BC5CB9下断,这样只有BB出征时才会断下,因此根本不需要条件断点什么的,显然这里已经与释不释放风珠技能无关了。下面的整个回溯过程都是一样的,因为有多个循环所以每次最好只出征一个BB。

同上 断下后先F7进入soul.00BAA380 然后F8,一直到
00BAA420|> \8BC6          mov eax,esi                     ;
发现EAX在这之后变为113E2408, 下面就是回溯了,全过程很如下(细节省略,不懂回复或消息):
00BAA3FA|> \8B32                  |mov esi,dword ptr ds:
00BAA3CC|.8D14B8            |lea edx,dword ptr ds:
//这里edx=01124978 (soul.01124978),EAX=0D60CA88,后面会发现这里的EAX其实就是怪物列表首地址
00BAA3C6|.8B42 08               |mov eax,dword ptr ds:
00BAA3BB|> /8BD3                   /mov edx,ebx
00BAA3B8|.8D59 08               lea ebx,dword ptr ds:
00CC1D00|.B9 70491201   mov ecx,soul.01124970

dd +i*4=dd +i*4就是风珠Call中MOV ECX,ESI中的ESI,这是怪物信息的入口地址

怪物列表
dd [+i*4]
+78       怪物X坐标,与角色的X坐标偏移竟然是一样的,不知道天晴是把角色不当人看还是把玩家不当人看(八卦一下),应该是为PK考虑,看来PK起来已经脱离了人的本质
+7C      怪物Y坐标,
+0BC   怪物ID
+0C0   怪物等级或类型标识,相同类型怪物一样,其十进制数值,鹿角兽为1000,巨杰士1010
怪物总数
dd 01124970+4+02C=dd 01124970+30


权限是管理加的,我从不设权限,所有附件也从不收费,因此请不要问我这类问题,我把权限改为10威望,不加密是我本意,每个人都有自己的理由,希望管理体谅,有事可以商量,谢谢
我记得回帖是有威望的,我不想非会员或者说百度之类看到这些,如果你10威望都没有,那我也没办法,我不是要求谁回我的帖,因为回与不回我都没有得失,但论坛要发展,大家体谅下管理员,10威望真的很低

ghost_z 发表于 2015-3-10 00:41:44

楼主呀,,,您太有才了。。。

血月之狼 发表于 2015-6-6 22:01:56

适当放入水淀粉

weiziji 发表于 2015-6-11 22:20:18

先感谢下,楼主辛苦了!来看看一下

fenghuang 发表于 2015-6-29 22:18:20

今日小生得以一见楼主大贴实在是惶恐至急,何否,楼主此贴实在妙哉!

wgh136334543 发表于 2015-11-4 00:47:10

给我很大的灵感

sunhai0975 发表于 2015-11-4 03:42:10

感谢楼主,支持楼主-支持 海。

jj2016ha1五 发表于 2016-6-6 07:57:11

先感谢下,楼主辛苦了!来看看一下{:cry:}

rs520 发表于 2017-6-6 00:52:55

好厉害 膜拜下

hellowcaco 发表于 2017-6-6 20:55:49

小黑鸟啊小黑鸟,快快长大大啊长大大
页: [1] 2
查看完整版本: Delphi做魔域 之怪物列表遍历