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

article/2025/10/5 4:37:09

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

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

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

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

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

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

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

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

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返回前必须恢复原指令的调用

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

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

9. 我们也可以根据类似的方法,做出单独锁定金钱,血岩的金手指,另外全材料的数量也可以减少锁定数量,比如锁成99,先编写代码,然后写成金手指格式

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


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

相关文章

暗黑破坏神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。对于…

JS:数组Array的使用方法及获取数组的长度length

对象分成三种&#xff1a; 内建对象宿主对象自定义对象 数组Array也是一个对象&#xff0c;它和普通的对象功能类似&#xff0c;也是用来存储一些值的。 不同的是普通对象是使用字符串作为属性名的&#xff0c;而数组是使用数字来作为索引操作元素。 数组中的索引是从0开始的…