NS版暗黑破坏神3金手指开发教程(5)

时间:2024-04-09 12:08:03

上一节,我们学会了通过修改程序指令的方式制作金手指,这一节,将引出真正的高手级金手指开发方法

除了必掉太古这个极其护肝和有用的金手指外,我们能想到的另一个金手指就是人物背包里的素材,包括金钱,宝石,材料等各种日常必需品,具体的固定素材有以下这些:

金钱
大秘境钥匙
血岩碎片
万用材料
奥术之尘
萦雾水晶
死亡之息
遗忘之魂
堪杜拉斯符文
卡尔蒂姆龙葵蝶
亚瑞特战争挂毯
腐化的天使肉块
威斯特玛圣水
惊悚之心
腐臭试剂
恐惧神像
李奥瑞克的悔恨
怨毒之眼
蠕动的脊骨

1. 运行神器IDA,然后打开原始版本的DiabloIIINX64ra.elf, 我们首先想要修改的是金币,简单,函数快速筛选里输入gold后,过滤后依然有很多结果,我们找一个简单的函数GoldGainForKill,字面意思就是击杀获取金币,到这个函数伪代码里分析一下发现了ModifyCurrencyAmount,双击点进去

NS版暗黑破坏神3金手指开发教程(5)

2. 在新的函数伪代码我们又找到了ItemPlayerGetCurrencyCount,意思是获取玩家的货币数量,我们简单理解为获取金币数,继续点进去

NS版暗黑破坏神3金手指开发教程(5)

3. 终于到了最后获取玩家金币数的地方了,我们看到获取的是player相关的内存地址里的一个值,并且偏移量跟v2,也就是CurrencyType有关,恍然大悟,原来这个函数是可以获取所有种类货币的数量的,言外之意,我们可以通过hack这个函数,达到修改所有材料的目的,包括血岩,锻造材料等等,现在可以从这里的伪代码转到汇编代码去分析怎么改了

NS版暗黑破坏神3金手指开发教程(5)

4. 伪代码对应的汇编代码如下图,找到了原始版本的地址,当然我们就可以用上节的搜索方法找到2.6.6版本对应的地址了,然后下一步就在2.6.6 main里修改程序,我们可以看到原始版本和2.6.6版本这段汇编指令是非常类似的,说明版本更新对这一段程序没有什么改动

NS版暗黑破坏神3金手指开发教程(5)

NS版暗黑破坏神3金手指开发教程(5)

5. 由于接下来要添加一些代码,因此不能直接在源程序上改,我们要找一段空白地址去写自己的代码,用IDA找了一下,发现C4118C到C42000这段区域是不存在的,也就是说我们在内存中修改这段内存是不会影响到游戏程序的,那就在C41300地址开始编写我们自己的代码吧,因为IDA C41300地址不能编辑,我们可以在C42300的地址处开始编写,等制作金手指代码的时候再把地址替换回C41300

NS版暗黑破坏神3金手指开发教程(5)

6. 编写的汇编代码如下所示,在这里大概讲一下为什么这么写,w19是货币类型,也就是材料类型,如果是0代表金币,我们留了一个空指令nop,假如读者想要只改金币,可以将nop改为bne, 这样只会在类型是金币时修改数量,999999999的16进制表示是3B9AC9FF,因此我们用mov和movk把要修改的数量给到X0寄存器,STR X0,[X8,X9] 的作用则是吧X0的值发到X8+X9的内存地址,也就是此类材料的内存,LDR X0,[X8,X9]则是程序的原指令,因为我们将原来此指令的地方改成此段代码的函数调用指令BL  0xC41300 ,因此RET返回前必须恢复原指令的调用

NS版暗黑破坏神3金手指开发教程(5)

NS版暗黑破坏神3金手指开发教程(5)

7. 至此,我们已经完成了将固定素材数量全部修改为999999999的代码编写,接下来开始金手指的制作,跟上节类似,简单地把每行指令的字节码写成金手指格式放到txt里加上说明就OK了,关闭的金手指只用把调用的指令改为原指令就可以,因此只有一行

NS版暗黑破坏神3金手指开发教程(5)

8. 跟以前一样把金手指文件放到机器上,启动游戏,开启金手指,进游戏场景查看人物金币和各个材料,是不是都变成999999999啦。

NS版暗黑破坏神3金手指开发教程(5)NS版暗黑破坏神3金手指开发教程(5)

好了,本节到此结束。 下一节我们将开始介绍人物相关属性的动态修改