上一节,我们讲解了关于各种延时机制的hack,这一节,将会介绍全传奇威能的制作
1. 因为传奇威能的收集比较困难,需要获取到大部分拥有传奇技能的装备,而且还要提取传奇威能,因此,我们考虑从程序中Hack出来全部的威能,首先我们从SItemPlayerExtractLegendaryPower函数中知道了威能数组和数量在Player中的偏移地址,如下图,顺便找到2.6.6中此函数的地址0x7B45F0
2. 我们去找到LocalPlayerGet在2.6.6中的函数地址是0xB8040,后面会用到
3. 接下来我们找到选择威能时程序会调用的一个函数UIEquipLegendaryPowers::GetAllPowers,就在这里找一个hack的地方,做hack代码跳转,如图中的v3那里
4. 然后找到2.6.6中对应的地址,修改成hack跳转
5. 在2.6.6中的0xc426fc处开始编写hack代码,注意由于金手指要偏移-0x1000,所以B9040和7B55F0其实是B8040和7B45F0, 233978其实是232978,讲解一下思路,我们先获取player对象,然后找到威能数地址改为0,然后把arExtractableLegendaryPowers的地址给X8, 遍历其中每个威能,并调用SItemPlayerExtractLegendaryPower让人物学会该威能,调用该函数前,切记要保存X0到X21, 因为,player的地址每次循环都要用,因为函数里会改变一些寄存器,如x8,x9,所以最后还要恢复x8,x9的值,最后跳回到调用处,这样就完成了整个流程
6. 由于我们在调用SItemPlayerExtractLegendaryPower的时候并没有传入第三个参数,也就是GameError *eGameError,因此还需要修改一些地方来避免出错,打开该函数,分析代码找到了三个需要修改的地方
7. 找到2.6.6版本对应的地址,一一修改之
8. 因为我们直接修改了跳转,导致威能成就没办法正确获取,因此我们改一下拾取金币的成就,把他变成威能成就判断,当然也可以不改,反正下次进入游戏成就还是会正确完成,所以也可以忽略,在这里说一下怎么改吧,分析可以知道威能成就标志是524
9. 找到sPlayerCurrencyPickup函数里金币成就判断的地方,把金币成就类型10改成威能成就类型524即可,找到2.6.6的对应地址去做hack
10. 把所有代码写成金手指格式
11. 开启金手指进游戏里打开卡奈魔盒,看看传奇威能是不是全都有啦,注意,暂时不要选威能,由于我们改了全威能数组,但是并没有重新导入和排序,所以需要退出游戏场景重新进入就好了,所有威能全部可以选了
好了,本节到此结束,从这一节开始,我们讲解的hack过程越来越复杂,实现的功能越来越强大,但是万变不离其宗,只要程序逻辑分析清楚,全面考虑所有情况,最后一定会成功