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

上一节,我们讲了基于公式明文的金手指制作方法,这一节,我们将进阶到更高级的基于程序修改的金手指制作方法,从现在开始,对读者的技术水平有了一个更高的要求,读者最好有汇编和C/C++高级语言的一些基础,至少了解过汇编,这样不会太吃力

1. 运行神器IDA,然后打开原始版本的DiabloIIINX64ra.elf ,等待反汇编完成(因为带调试符号,时间可能比较长,请耐心等待,或者去做一些其他事情,大概在10分钟左右,与电脑配置有关,输出窗口显示内容不再更新代表已经完成),如果每次打开IDA窗口布局不对,或者少了一些窗口,建议点击窗口->重设窗口来复位一下布局。

2. 我们要修改的是远古传奇掉落机制,所以要先搜索远古的英文ancient,首先点击左边函数窗口里任意一个函数,然后在编辑里点击快速筛选,然后左下方输入ancient,不出所料,筛选后的函数只剩下6个,分析一下名称,可以知道最有可能的是LootRollForAncientLegendary这个函数,因为字面意思就是对战利品随机出远古传奇,然后我们双击这个函数,可以在右边的IDA View里看到这个函数的汇编代码

3. 因为汇编代码直接看不是很好看,我们可以在视图->子视图->生成伪代码或者直接按F5生成伪代码,怎么样,很惊喜吧,汇编代码直接被翻译成C++风格的伪代码了,这样很利于我们分析程序逻辑

4. 沿着函数伪代码往下拉,在接近函数底部的时候我们发现了一些非常可疑的代码,if ( (float)((float)RandGetDWord(v28) * 2.3283e-10) <= v27 ) v2->eAncientRank = 2; 这一句非常重要,根据函数名,可以猜测这是获取一个随机数然后乘以一个小数后判断是否大于一个值,如果小于的话就把eAncientRank的值改为2,我们发现整个函数eAncientRank的值会被赋值成1或2,因此猜测eAncientRank的值如果是2的话就代表太古,1代表远古,于是可以从这个随机数判断上入手,可以让这个条件始终成立,那么eAncientRank就始终为2了,那么我们掉落的传奇是不是就一定是太古级别了呢?

5. 在<=上点击一下,可以看到这个地址是928BA8,然后再点击IDA View, 点击跳转->跳转到指定地址里输入928BA8,就到了这里的汇编代码,我们要修改的就是928BA4上的FCMP            S0, S9,原因就是当鼠标在v27这个变量上停留时,显示的就是s9,为了让下一句B.HI            loc_928BB4  不跳转,我们可以在FCMP  S0, S9上鼠标右键快速修补神器->修补,把原指令改为FCMP S0, S0, 这样结果始终相等,<=的条件就始终成立了,如果想在IDA View里显示指令字节码和注释,可以在选项->常规里按照下图配置一下就可以了

6. 修补之后,我们突然想到一个问题,现在是基于原始版本修改的,但是游戏已经是2.6.6版本了,怎么办?不用担心,我们可以采用另一种方法去找到2.6.6版本对应的地址,再次启动另外一个IDA实例,打开2.6.6的main.elf,搜索原始版本FCMP附近的指令字节码,可以是前面的,也可以是后面的,如果搜索不到,那就扩大范围,记住,尽量搜索一些不容易被改变的指令,比如常量等等, 我们就在2.6.6里面搜字节序列00 00 23 1E 00 08 28 1E 然后发现第二个搜索结果和原始版本附近的指令最相似,那么基本可以判断,第二个搜索结果就是2.6.6对应的地址啦,2.6.6对应的FCMP地址就是00000000008610B4,用同样的方法改成FCMP S0, S0

7. 目前为止,我们已经完成了太古级别判断的修改,那么还有一个问题,可以从伪代码分析中得知,要判断太古的话,首先这个掉落的传奇装备要先进行远古级别判断,成功后还要进行当前玩家Solo单人大秘境层数是否大于等于70的判断,大于70层才会进行远古级别的判断,因此,前两个条件同样需要修改成始终成立,转到汇编代码我们确实可以看到nMinimumAchievedRiftLevelToRollPrimalAncients和nHighestSoloRiftLevel的比较,也就是单人solo大秘境层数与生成太古装备所需最低层数的比较

8. 知道了原始版本的远古太古以及层数判断,那么接下来我们可以去2.6.6版本的伪代码当中找到对应的地方,当然由于2.6.6的main不带调试信息,因此不太容易看,不过通过代码结构还是很容易分析出对应关系,但是我们暂时没找到远古的判断位置,只找到了后两个判断

9. 不过这阻挡不了我们逆向的决心,伪代码往上面分析,我们看到了一个v8的变量乘了一个很小的数,因此分析出v8一定是远古判断的随机数

10. 往下找v8出现的位置,可以发现v8有两个地方进行了比较判断,其中第一个位置才是进行远古的判断位置

11. 现在我们已经找到了2.6.6main里面的3处判断位置,程序逻辑流程就是先生成随机数进行远古判断,是远古了然后判断玩家大秘境层数大于等于最小层,成功后再生成随机数进行太古判断,成功了就是远古装备,因此,只需要修改这三个判断始终为真,那么最后怪物掉落的一定是太古装备,我们分别找到这三处判断对应的汇编指令,然后进行修改如下:

12. 我们总算完成了三个判断的修改,那么接下来就是制作金手指代码的时刻了,将三处地址修改后指令字节码写成3行金手指格式码即可,当然我们也可以不修改远古概率的判断,这样传奇掉落一旦判定为远古,那么就必为太古,因为传奇是远古的概率是10%,所以太古的概率也就是10%了,另外,把三处指令写回程序原始的判断指令,那么就相当于恢复了太古正常概率,所以我们可以得到三个金手指功能了:

11. 保存成txt放到相应目录下,运行游戏,切到金手指界面开启太古100%概率,为了增加传奇掉落,可以同时开启魔法装备掉率999999900%(这个是需要游戏启动后一秒去开启,不然无效),回到游戏,去小秘境杀几组精英怪,或者打一层大秘境,你会发现,GOD,满地红光太古,闪瞎双眼。。

12. 爽了一翻,你可能会发现,咦,为什么还有一些黄光普通传奇呢,不是100%太古么?这是因为掉落机制非常复杂,大部分情况会掉落职业相关的装备,此时就是100%太古了,当小概率掉落其他职业装备时,暴雪为了游戏平衡,设置了不进行太古判断的开关,这里可以提示一下,至于怎么改,还是比较简单的,就交给读者自己去实践了

好了,本节到此结束,这一节内容比较重要,通过此节,读者应该掌握了对程序进行逆向分析和修改的技巧,如果有不明白的地方,可以补充一下arm64的汇编知识,下一节我们将进阶到更高阶的金手指制作:程序Hack,可以在游戏中实时去修改人物的各项属性,动态开启和关闭,甚至添加自己的程序代码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章