终于到最后一节了,在这一节中我们将讲解如何利用hack制作出丰富多彩的世界,开个玩笑,其实是因为由于暗黑三的AMIIBO功能很有意思,不但可以用普通手办在城外召唤出一组精英怪,而且在城内用专用哥布林手办还能开启宝藏秘境传送门,但是由于冷却时间有十几个小时,基本上只能一天才能使用一次,因此我们想要hack一下,可以随时随地使用AMIIBO功能
1. 我们先搜索amiibo,发现了函数Console::Notifications::ShowAmiiboTutorial,知道了这个函数是弹出amiibo的使用教程的,然后在函数名上右击跳转到外部引用,跳转到函数ClientMessageReceiveGameMessage里,找到了函数SetPlayerScanDesired,意思就是设置player为需要扫描,然后程序就会启动扫描模式
2. 接下来搜索NFP,发现了函数Console::NFP::OnNFPScanSucceeded,知道了这个函数是在NFC手办扫描成功后被调用的,再跳转到外部引用,找到了函数UpdatePlayerStateTagEnabled,然后我们找打此函数在2.6.6中的地址sub_2BD5F0,记下来,后面要用
3. 我们另外还发现了函数UpdatePlayerStateIdle,猜测这个函数会在player空闲时间刷新时调用, 根据我们之前的分析推断如果玩家点击amiibo传送门后,会设置scanDesired,然后这里就会调用DoStartDetectionForTagRead进入扫描状态,我们可以在之后加入hack代码,让扫描直接成功,这样传送门就出来了,而不用靠NFC手办来触发
4. 我们找到2.6.6对应的地址后,开始编写代码
5. 在OnNFPScanSucceeded里可以发现v2是扫描结果,通过分析代码可以知道v2的值为0则是普通amiibo, 1是专用哥布林amiibo,由此可以在此处hack一下来控制扫描结果,找到2.6.6对应的地址做hack
6. 接下来我们分析冷却时间,我们在OnNFPScanSucceeded找到了冷却时间判断,在sSpellEffect_AmiiboPortalDefault_Begin里找到了默认amiibo的冷却时间判断,分别找到2.6.6对应的地方做hack即可,这样就去掉了冷却时间
7. 接着在sSpellEffect_AmiiboPortalTreasureGoblin_Begin函数里找到了哥布林amiibo的冷却时间判断,找到2.6.6对应的地址,hack之
8. 另一方面,我们看到了上面有一个传送门是否已存在的判断代码,如果已存在将会显示错误信息,为了不显示错误,我们可以hack一下,找到2.6.6的地址改为nop即可,当然也可以不改,这里无关紧要,因为即使改了在生成宝藏秘境传送门时同样会判断是否已存在,只是不再显示错误而已
9. 至此,我们已经完成了默认和专用amiibo的不限时间无条件触发的功能,但是我们想要自己控制生成的传送门类型,接下来,就说一下这个怎么改,这个也可能是整个金手指教程中最复杂的部分了,我们在生成哥布林传送门的函数sSpellEffect_AmiiboPortalTreasureGoblin_Begin中发现了创建死亡传送门的函数SpellEffect_DeathPortalCreate,v14可以分析出来是传送门的一个id,用来标识传送门类型,我们要hack的就是 v14 = PowerContactTagGetSNO(v2, 0xB0000u);
10. 我们在SpellEffect_DeathPortalCreate函数上右击跳转到外部引用,可以发现SItemCrafting_TryTransmute调用了它,这个函数不是卡奈魔盒的转换吗?由此我们推断出这是卡奈魔盒转化机械指环和牛刀时生成的宝藏秘境以及魔牛关的传送门,因此只要找到几个传送门的类型,就可以做hack了,我们双击点进去发现了v141也就是传送门类型
11. 接着往上分析,我们找到了v141 = GlobalSNOGet(v75); 分析可知v75的值为1189得到的v141是魔牛关类型,如果是1188,v141则是哥布林宝藏秘境类型,所以我们有了一个办法,将前面v14 = PowerContactTagGetSNO(v2, 0xB0000u);改为v141 = GlobalSNOGet(v75);,v75则是我们要传入的传送门ID,比如1188,那么开启amiibo传送门的时候,就是我们修改后的传送门了
12. 接下来,就是要寻找2.6.6对应的地址了,这一步比较困难,因为代码变动较多,我们先用hexworkshop在2.6.6main里搜索CubeCowPortal,找到了文件地址0x00DE5731,然后在IDA中跳转到文件偏移,然后右击跳转到交叉引用
13. 跳转后再经过一系列分析,最终得到了2.6.6中GlobalSNOGet的地址sub_4C3380,和传送门的4个值,宝藏秘境:0x4A8,魔牛关:0x4A9,奇想谷:0x4AA,远古宝藏秘境:0x4AB
14. 然后我们找到v14 = PowerContactTagGetSNO(v2, 0xB0000u);在2.6.6中的地址然后做hack即可
15. 最后我们把所有的代码写成金手指格式代码
16. 我们进入游戏测试金手指,可以分别测试通用amiibo(城外刷出精英怪),专用amiibo(城内开启4种传送门),通用amiibo和专用amiibo金手指同时只能开启一种,4种传送门金手指也是互斥的,同时只能开启一种,且只有和暗黑专用amiibo一起开启后才有效果,注意NS的NFC功能处于开启状态(在设置里面)
通用AMIIBO:
专用AMIIBO:
好了,完结撒花。
暗黑三金手指教程到此结束,我们用逆向方法实现了无数强大功能,通过对游戏程序的透彻分析,相信读者已经学到了不少知识,不管是逆向分析,汇编知识还是程序架构,设计模式,从现在开始,你已经是逆向大神了,可以踏上新的挑战之路了