|

提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).
Delphi做魔域 之怪物列表遍历
我见过很多发帖求助魔域怪物列表如何遍历的帖子,当然,结局自然是不了了之,因为我个人是业余爱好者,也早就对官服没了兴趣, 中怪物数组真的没用,也一直没碰这个问题,其实主要还是水平太菜,其实说魔域的怪物列表方法还是很多的,小举两例吧:
1、可以根据怪物坐标,让一个怪物跟着你跑,用CE范围搜索还是很容易找出临时地址的
2、怪物类型,鹿角兽叫鹿角兽,巨杰士叫巨杰士,这是有区别的当你跑到只有鹿角兽的怪物堆里,肯定有个表示它是鹿角兽的值A,当你跑到只有巨杰士的怪物堆里,这个值肯定会变成B,魔域是不会维护列表中已经失效了的值的,但是再怎么第一个还是会维护的,右下角的怪物信息就是告诉你当前有怪物数组里有什么怪物,方便你分析的。
这两个方法我都没用过,我当时想到的是有没有一个变量保存着当前怪物数组里有多少个怪物,于是试着找了下,我用CE扫啊扫、找啊找,马勒戈壁的没有找到,我当时就想,难道一个XP把周围怪全打死了,计算的时候还一个怪物一个怪物的加还是怎么的,虽然怪物数组对我来说毫无用处,但我还是有点郁闷。
最后经过多次试验,更确切的应该是到上一篇中的双风珠分析时恍然大悟,为什么风珠call中的那个ID不是幻兽出征Call中的那个ID,为什么有时候BB收回再出征后风珠Call中的ID会变化,难道它是个怪物,没想到事实上它真的就是个怪物,出征一个BB,怪物数加1,召回或合体一个BB怪物数减1;如果幻兽出征后就算个怪物,那么别的什么例如NPC、卫兵算不算怪物?然后只带一个BB跑到了卡城上面的城墙外一搜索,证实了幻兽出征后就是野兽的传说。
[hide=10,rvrc]
很幸运,怪物数量地址搜出来就是个基址,省了不少事,废话够多了,下面正式开始
我今天搜出来的地址是001249A0,用CE找到怪物减少时的代码如下
EAX=01124974 ECX=00000000
Probable base pointer =01124974
00ba9a91 - dec ecx
00ba9a92 - test ecx,ecx
00ba9a94 - mov [eax+2c],ecx
00ba9a97 - jne 00ba9aa6
00ba9a99 - mov ecx,[esp+60]
用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:[ebp-0x28],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:[edi+0x7054]
00BC5CAF |. |6A 00 |push 0x0
00BC5CB1 |. |B9 70491201 |mov ecx,soul.01124970 ; 值得注意,与CE找到的01124974竟然如此接近,肯定有问题
00BC5CB6 |. |8B04B0 |mov eax,dword ptr ds:[eax+esi*4]
继续,我们发现下面的代码貌似实现了上面幻兽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:[edx]
00BAA3CC |. 8D14B8 |lea edx,dword ptr ds:[eax+edi*4]
//这里edx=01124978 (soul.01124978),EAX=0D60CA88,后面会发现这里的EAX其实就是怪物列表首地址
00BAA3C6 |. 8B42 08 |mov eax,dword ptr ds:[edx+0x8]
00BAA3BB |> /8BD3 /mov edx,ebx
00BAA3B8 |. 8D59 08 lea ebx,dword ptr ds:[ecx+0x8]
00CC1D00 |. B9 70491201 mov ecx,soul.01124970
dd [01124970+8+8]+i*4=dd [01124970+10]+i*4就是风珠Call中MOV ECX,ESI中的ESI,这是怪物信息的入口地址
怪物列表
dd [[01124970+10]+i*4]
+78 怪物X坐标,与角色的X坐标偏移竟然是一样的,不知道天晴是把角色不当人看还是把玩家不当人看(八卦一下),应该是为PK考虑,看来PK起来已经脱离了人的本质
+7C 怪物Y坐标,
+0BC 怪物ID
+0C0 怪物等级或类型标识,相同类型怪物一样,其十进制数值,鹿角兽为1000,巨杰士1010
怪物总数
dd 01124970+4+02C=dd 01124970+30
[/hide]
权限是管理加的,我从不设权限,所有附件也从不收费,因此请不要问我这类问题,我把权限改为10威望,不加密是我本意,每个人都有自己的理由,希望管理体谅,有事可以商量,谢谢
我记得回帖是有威望的,我不想非会员或者说百度之类看到这些,如果你10威望都没有,那我也没办法,我不是要求谁回我的帖,因为回与不回我都没有得失,但论坛要发展,大家体谅下管理员,10威望真的很低
联系我时,请说是在 挂海论坛 上看到的,谢谢! |
上一篇: 工作流程-人工智能之状态机的原理和实现下一篇: Direct3D透视教程_教你做出属于自己的透视
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。
2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。
|