创建一个新角色,搜索wow.exe模块中的常数6B0B50(明文包,封包组包CALL,即发包函数的上面某一层函数),全部禁用:
把没有操作就直接断下的断点先取消掉,在NPC维里副队长那里不要用鼠标右击点击他,否则会直接接受了任务,这时候已经发过包了,所以可以用鼠标左键点击打开该NPC,再接受任务,测试发的包才是接任务的(其实仍然是直接接了任务)。
上图左边小地图下面的就是已经接受的任务(这个新手任务比较特殊,鼠标右击NPC就会直接接受了该任务,这时候已经发过接任务的包了),所以这里我们要放弃该任务,重新鼠标右键点击该NPC,断下:
如果是接任务的话,它肯定有一个任务ID的,不同的任务可以通过各自的ID给区分开,我们先把包的内容复制出来看一下:
这是我们的包对象(任务:身边的危机),然后再看一下这个包的内容:
这个是之前我们分析过的,打开NPC的组包,但是这个怎么就接了任务的呢?或者说这个任务比较特殊。
我们再点击xdbg的运行,还有几个断点,我们暂时把它们复制出来备用(心跳的断点都取消掉):
然后我们再另外找一个任务来试一下(把转向的断点取消掉,然后去找头上有问号或感叹号的NPC去接一下任务),鼠标右键点击下图该NPC:
鼠标左键点击上图身边的危机:
点击上图完成任务的时候也发包了:
完成任务的时候要经过5304D3这里,上图是我们看到的这个时候的组包内容。
我们让游戏跑起来,又断到了一个地方:
上图我们看到有一个NPC的ID。
我们把游戏取消,让游戏退出来,把自动接任务的插件给禁用一下,把插件的目标AddOns改名为“AddOns_插件”,再建一个空的AddOns目录:
重新登录游戏,重新分析一下接任务(删除之前创建的角色,建一个新角色)。
我们发现鼠标右击带感叹号的会走到上图这里,鼠标右击不带感叹号的NPC走的是另外一个分支,所以这里可能就是接任务的,我们来看一下这个地方的组包(之前的那些分析可能没有太大的作用),然后我们再看一下该包的内容:
从上图我们可以看到,这里是NPC的ID,不是任务ID,按说应该还有一个任务ID,但是这里我们没有看到,这个看起来更像是打开NPC的,我们复制记录一下:
我们再让它跑一下看看有没有更合适的:
这个包的内容看起来只有4个字节:
0x417,这个好像更像是那个接任务,我们都复制记录一下,但是具体是不是,我们还需要写相应的代码做测试。
上图这个包很像接任务的,我们还有另外一种来做测试的办法,我们把上图这第2个包内容中的0x417给它改一下,然后看它能不能够接到任务,如果修改该数值对接任务有影响的话,可能就需要这两个包一起配合,先打开NPC,然后接任务;
这里我们把所有断点删除,然后先把维里副队长的这个新手任务放弃,再在这两个包相关的CALL那里分别下断,然后我们再点鼠标右键,第1个断下来的我们先不管它,我们先继续运行游戏,来看看断到的第2个包的内容那里:
我们把0x417改为0x317,发现依然能够接到任务,但是该NPC头上仍然是一个感叹号,而小地图下面仍然有任务,我们还是接到了这个任务,我们点击放弃。
我们发现第2个包没有发的情况下,该NPC头上的感叹号没有被去掉,说明该地址的包与接任务是有一定关系的,我们再来看第一个包:
我们如果把该包内容中的指令0x184给改了,发现打不开NPC了,这样我们也测试不出来接任务了,可能是接任务的,也可能不是,具体是不是我们下节课写代码来测试一下。
那个0x417也有可能是用来发包取消该NPC头上的感叹号的,但是具体它是一个什么样的功能,我们还是要写代码来做测试。
另外,任务有两种,一种是带感叹号的,另一种是带问号的,我们不知道这两种任务是不是同一个类型,我们再找一个带问号的看一下,我们先把维里副队长这个任务给接了(头上是一个感叹号),然后我们再去治安官那里看一下问号那个组包:
哦,现在我们明白了,那个感叹号的是用来接任务的,这个问号是用来完成任务的,我们启用一下所有调用6B0B50这个CALL的断点:
这个究竟是不是接任务的,还是要下节课我们来看,从上图我们看到这里不是接任务,应该是选择任务:
我们点击一下完成任务:
我们把这个包也取出来,复制记录一下:
这个倒挺像完成任务的,因为完成任务这里没有NPC的ID,这里的0xFE和0x21可能是完成任务的指令和任务的ID。
具体是不是下节课我们写代码把分析的这些数据测试一下。
任务有没有接,它肯定是有标志可以用来判断的,这里我们只讨论接任务还有完成任务这两个知识点。
由于现有项目的两个页面都已经满了,所以我们再添加一个页面:
在游戏功能测试目录下面添加一个新的任务相关的目录:
复制上图这个函数为新的接任务02函数:
测试的时候,如果不是那个新手任务,可以删除该角色,再新创建一个角色,然后跑到维里副队长身边,点击接任务:
接任务测试成功,该NPC头上的感叹号也没有了。
完成任务测试失败,完成任务这个包说明没有准备好(可能完成任务),接任务我们发了两个包,但是我们不知道这两个包各自的作用是什么,我们先来把接任务给弄清楚,我们回到维里副队长那里,放弃该任务,我们把接任务这两个包给分开做一下测试。
我们点击上图接任务01按钮,这个是接任务,接任务成功(右边小地图下方显示有任务目标),第一个组包就是接任务;
点接任务02按钮没有反应,第2个包我们根本就没有发,接任务02是没有用的;
这里的接任务只是接某一个NPC的任务(跑到特定NPC的身边才行),它并没有一个任务ID,这种设计比较少见,这种接任务就只有一个NPC的ID和一个接任务的指令,在哪个NPC那里接任务;
这个游戏不像其他游戏那样有一个任务的ID,有的游戏接任务的时候它会发送一个任务ID的。
点击角色选择界面左下角的插件,可以禁用掉游戏默认带的插件。
上图这里是在界面上显示任务目标的方式,以后如果你需要遍历哪些任务没有接的话,你就可以通过上图这些开关去分析你追踪的这些任务列表,就去判断哪些任务完成了,哪些任务没有完成。
先跑到神庙里面的那个治安官NPC身边,在5304D3那里下个断点,并启动封包的全部断点(点击运行后,鼠标右击神庙里面的那个治安官NPC,在此期间过滤掉其他无关断点):
鼠标右击治安官这个NPC,会跑到右键点NPC那个断点那里:
当点击上图任务的时候会断到下图这里:
我们发现这个包更像是接任务、完成任务的,18A是指令,30F有点像任务ID,而C5013862是NPC的ID1,F1300000是NPC的ID2,但是具体是不是我们下节课再做测试。
然后我们再点完成任务,断下,之前没有断到过这个地方(可能被我们给过滤掉了),我们没有分析到这里:
我们发现这个地方的封包内容和前面那个6D4D95地址处的封包内容很接近,6D4D95可能是选择任务,这里可能才是完成任务,这个概率比较大:
这个比较像完成任务的组包格式,
接任务02这里不是接任务的,不知道是个什么。
我们发现接任务01这里没有任务ID,可能是一个特殊的任务,它就是一个新手的任务,它也可能没有任务ID,打开该NPC之后就自动接了该任务,这可能是一种特殊的情况。
我们之前分析这个接任务的包、完成任务(交任务)的包它存在多种格式,它们并没有一个统一的格式,所以为了方便我们分析封包的格式(封包的内容、封包的长度),我们自己来编写一段代码,可能需要两三课的时长,因为写HOOK的话相关的知识点还是需要一些时间来慢慢分析。
我们按照上节课分析的完成任务重新组包:
我们暂时认为包缓冲区中0x30F这个是用来区分不同任务的,可能是任务ID,0x18E可能是完成任务的指令,当然具体是不是用的统一的指令,我们后面写了分析封包的代码之后呢,把相关的信息保存在文件里面,我们再来做一个相应的分析。
我们需要另外建一个新的小号来测试:
我们看到上图这里虽然弹出了任务面板询问你是否接受,其实无论你接不接受,这里已经有提示信息了,你已经接受了这个任务了,所以我们之前分析的时候,再按下这个接受按钮之后再去分析接受任务的这个包是错误的,实际上我们右键点击维里副队长的时候就已经自动接受了这个任务了,你直接点击右上角的叉关闭这个面板,实际上都已经接受这个任务了;所以分析的时候只能在鼠标右击该NPC的时候去分析接任务的包。
我们跑到神庙的治安官NPC身边那里去完成这个任务:
我们点击完成任务按钮后,从上图可以看到左下角的提示信息,身边的危机完成,说明这个任务的组包是成功的,该任务已经完成了,并且它还完成了与NPC的对话,顺便接了剿灭狗头人的任务。
所以接受任务至少有两种形式,一种是在访问NPC的时候它就自动接了这个任务,这个应该是在服务器那边就判断完成了,另一种就是无论你接受还是不接受,实际上从上图这个提示信息来看的话,这个剿灭狗头人的任务已经接受了,而且上图右上角小地图下方也已经有剿灭狗头人的任务目标了。
之前我们分析的时候,是点了任务面板的接受之后,再去分析这个包,那个思路上就错了,因为这个时候你点接受,它并不会发包,因为在此之前它就已经接受了这个任务了。
如果你放弃这个任务,之后你再去接受该任务的话,那么它就是走的另一个发包了,这个我们在这类就不去分析了,我们留到下节课写分析封包的代码,通过代码来分析的话,这样比我们每次去下断点的话,要省很多很多时间,如果每次用调试器去分析的话,花的时间就比较多了,如果我们用代码把发包的数据全部收集到文件里面,再加上我们用代码来做一下条件判断和过滤,那么这样的话我们就能够更方便的收集到发包的有用信息。
下节课我们就开始写HOOK,HOOK也叫劫持,我们就是拦截一些封包的数据,然后把它转成字符串的形式写到文件里面,这样方便我们分析,而且我们可以按照我们自己设想的格式来格式化它,然后保存到文件里面,这样的话我们就可以很方便的分析了。