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

article/2025/10/5 4:20:21

        终于到最后一节了,在这一节中我们将讲解如何利用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:

好了,完结撒花。

暗黑三金手指教程到此结束,我们用逆向方法实现了无数强大功能,通过对游戏程序的透彻分析,相信读者已经学到了不少知识,不管是逆向分析,汇编知识还是程序架构,设计模式,从现在开始,你已经是逆向大神了,可以踏上新的挑战之路了


http://chatgpt.dhexx.cn/article/IEDPREjo.shtml

相关文章

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

上一节,我们学会了通过修改程序指令的方式制作金手指,这一节,将引出真正的高手级金手指开发方法 除了必掉太古这个极其护肝和有用的金手指外,我们能想到的另一个金手指就是人物背包里的素材,包括金钱,宝石…

暗黑破坏神2 符文自动合成--按键精灵源码

最近玩了一个暗黑破坏神mod服 发现2个符文可以合成一个大号符文.不过手动合成实在太费劲了.于是乎我就写了一个自动合成的脚本. 需要用到图灵插件,不知道的自己百度一下. 还是挺有意思的这类脚本.还需要有一个自己的算法. 源码如下. Function 移动鼠标点左键(x1, y1)MoveT…

Unity脚本(二)

视频教程:https://www.bilibili.com/video/BV12s411g7gU?p122 目录 Transform GameObject Object GetComponentInParent LookAt GetSiblingIndex、SetSiblingIndex Instantiate Transform 对象的位置、旋转和缩放 场景中的每个对象都有一个Transform&…

Unity 剧情类游戏基础脚本

本文主要用于给新人提供实现剧情类游戏的基本思路。 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; 然后是一个很重要的 [System.Serializable] 它的作用是使得在检查器窗口来看到我i们自己创建的类从而实现在检…

Unity脚本(三)

视频教程:https://www.bilibili.com/video/BV12s411g7gU?p128 目录 Time Prefab Animation Time Time.time:自应用程序启动以来,每帧的开始时间(只读) Time.deltaTime:每帧间隔,或说完…

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

最近重温了NS版的暗黑三,因为空闲时间实在有限,面对这样一款刷刷刷的经典作品,为了护肝以及更爽快的游玩,同时为了弥补自己丢失已久的汇编技能,加上NS版暗黑三最初版本里有带完整调试信息的elf文件,于是有了…

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

上一节,我们初步介绍了修改人物力量的方法,也大致说了一下hexworkshop和IDA的简单操作,这一节,我们将进阶到复杂度高一些的人物全属性修改,搜索方法基本跟上一节的力量公式一样,需要一定的耐心和细心&#…

Unity入门3——脚本基础

一、生命周期函数 ​ 所有继承 MonoBehavior 的脚本,最终都会挂载到 GameObject 游戏对象上 ​ 生命周期函数就是该脚本对象依附的 GameObject 对象从出生到消亡整个生命周期中 ​ 会通过反射自动调用的一些特殊函数 ​ Unity 帮助我们记录了一个 GameObject 对象依…

4.实现csdn暗黑模式-油猴脚本实战1

4.实现csdn暗黑模式-油猴脚本实战1 Start 前面的文章,对油猴脚本做了基础的介绍。今天来我们来实战一下,编写一个有实际作用的油猴脚本。 如果我希望我的csdn是暗黑模式,怎么办? 看我表演? 注意!本文仅用…

6. unity之脚本

1. 说明 当整个游戏运行起来之后,我们无法再借助鼠标来控制物体,此时可以使用脚本来更改物体的各种姿态,驱动游戏的整体运动逻辑。 2. 脚本添加 首先在Assets目录中,新创建一个Scripts文件夹,在该文件内右键鼠标选择创建脚本选项,即可创建一个脚本文件,可命名为Sampl…

Unity入门03——Unity脚本

1.脚本基本规则 1.设置编程用工具 2.基本规则 1.创建规则 不在VS中创建脚本了可以放在Assets文件夹下的任何位置(建议同一文件夹管理)类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type)建议不要使用中文名命名没有特殊…

你可能还不知道的暗黑3常用小技巧

以下是上次活动热心坛友发来的游戏小技巧,经过我的搜集和加入一些自己和朋友们分享的经验整合编辑而成。再次感谢大家的热心参与。都非常实用哟!!! 操作篇 1,如果你不希望朋友进入你的游戏时,按ESC&#xf…

jq linux获取数组长度,数组长度用size还是length

数组长度用length属性。length是js的原生方法,可获取元素的个数和对象的长度;而size()函数是jQuery方法,只能作用于对象上,用于返回当前jQuery对象封装的元素个数。获取一个数组的长度或者参数的长度,只能用lenth。 本…

delphi 获取数组长度_数组的介绍及使用

JavaScript 中的数组常用于在单个变量中存储多个值。数组就是一组数据的集合,在内存中表现为一段连续的内存地址(保存在堆内存)。创建数组的目的就是为了保存更多的数据。 数组概念和语法 概念:数组是一个特殊变量,一次可以容纳多个值。 特点…

js 填充数组长度

js 填充的方法有以下三种 const array new Array(100).fill()Array.from(new Array(100).keys())let arr Array.from({length:100}, (_v,k) > k);如果下面有这么一个场景,你在接口中获取了一个数组对象,如下: [{id:1},{id:2},{id:3},{…

c语言中文网 数组的长度,数组的长度如何获取?

获取数组长度的方法: 1、在java与JavaScript中可以使用“数组名.length”方法获取数组长度 javaScriptvar arrnew Array(); arr[0] "a"; arr[1] "b"; var lenarr.length; java 2、c语言中可以使用关键字 sizeof获取数组长度 用 sizeof 可以获…

c语言 json数组长度,js 获取json数组里面数组的长度

作为一个前端页面开发者第一次处理json数据,遇到了‘js 获取json数组里面数组的长度’?竟然不知道 json没有.length属性(真是要嘲讽下自己),少壮不努力老大徒伤悲啊!以前都是去寻求男朋友帮助,但是最近尝试自己去解决遇到的问题。 我遇到的问题是这样的:***.jsp结尾的页面…

vue 获取数组长度_Vue数据响应式

响应式是一种设计模式。 页面响应式布局就是根据页面缩放大小调整布局,数据响应式就是代码根据数据变化作出反应。 深入响应式原理 — Vue.js​cn.vuejs.org 简单来说,当我们把一个 JavaScript 对象传入 Vue 实例作为data选项时,Vue将遍历此对象所有的 property,使用Object…

Javascript 获取数组长度, 对象成员个数, 字符串数

1.应用场景 主要用于获取数组长度, 对象成员个数, 字符串数. 2.学习/操作 Q1.Javascript怎么得到数组长度(也就是数组的元素个数)? Q2.Javascript怎么获取对象的成员个数? Q1 你肯定想到了array.length!? 那么我们来测试一下下面这个例子. <script type"text/jav…

html获取数组最小值,javascript如何获取数组长度?

JavaScript中可以通过length方法来获取字符串的长度。数组的 length 属性总是比数组中定义的最后一个元素的下标大 1。 定义和用法 length 属性可设置或返回数组中元素的数目。 语法arrayObject.length 说明 数组的 length 属性总是比数组中定义的最后一个元素的下标大 1。对于…