首先要说明的一点:这里所说的游戏,不是网络游戏,而是单机游戏,一般网络游戏会有作弊防护而且还会有其他的问题。
使用的工具是 CE7.5英文版和 C#反编译工具dnSpy。
修改的游戏是“20 Minutes Till Dawn”(epic上白P的免费游戏),基于unity开发的,游戏内容就是砍砍**,坚持20分钟不死,最后*了boss就通关了。游戏开始可以选择不同的角色,有不同的起始血量,游戏当中还可以获取buff,获得灵魂之心,在原来的血量上叠加,这次修改的目的就是锁定这两个值,在游戏当中收到打击不会掉血。
修改游戏大体上有两种方式:一种是找到要修改的数值的地址,将其锁定,另外一种是找到程序中改写数值的指令,修改指令,使其不改变数值,这次用的是第二种方法。
先打开dnSpy,到游戏目录,在它的_Data/Managed目录下,找到Assembly-CSharp.dll,拖拽到dnSpy,反编译。血量一般用HP或health作为变量名,HP太短,搜索结果太多,搜health,看到文件名 flannel.PlayerHealth,这个应该就是我们要找的文件,双击,打开,往上翻,看到TakeDamage函数,这个应该就是我们要找的了。果然,传递一个参数damage给函数,根据damage的数值,减去血量,shp应该是灵魂之心的数量,hp是血量,如果有灵魂之心,先减去灵魂之心,没有,那么再减血。
通过dnSpy查找可能的变量
找到掉血的函数
接下去,打开游戏,切换到窗口模式,然后打开CE,在CE中打开游戏进程。然后在CE的菜单Mono中,激活Mono特性,接着还在Mono菜单的下一项,选择 Dissect Mono,会打开一个新的窗口。
启用Mono特性
这个窗口,只有一行,一个地址带着一个向右的箭头,点击将它展开,然后点击第一项Assembly-CSharp,继续展开,内容比较多,需要等待几秒钟,等待其展开后,往下拉,找到playerHealth项展开,找到methods再展开,找到takeDamage,右键选择jit,会打开反汇编窗口,稍微往下,可以看到两条dec指令,就是 -1指令,和反编译的 num - 1指令相对应。
可以简单测试找到的指令是不是我们想要的,在指令上面,右键replace with code that does nothing
屏蔽 -1 指令
回到游戏,故意让敌人打到,看会不会少血,确认不会之后,我们编写注入指令。通过tools菜单最后一项,auto assemble,或者快捷键 Ctrl-A,打开自动汇编(auto assemble)窗口,template菜单分别执行cheat table framework code和 code injection。确保弹出的对话框中的地址/指令是我们刚才找到的 dec指令。
插入框架和需要修改的指令
用将原来的 dec指令注释掉,用nop 2指令替代,其实直接注释掉,不用nop指令也没有关系。完了之后,通过file菜单,选择 assign to current cheat table,就可以在CE主窗口的下面看到这条注入了。另外一条指令同样处理。
编写注入指令
重命名两条脚本,比如,我把它们分别命名为 hp lock 和shp lock,点击前面的方框,有红色×号表示注入启用,没有表示未启用。进游戏测试,当启用时角色在游戏中不会掉血,取消启用则和正常游戏一致。
下次打开游戏,如果不打开CE,正常游戏。如果想使用修改的脚本,打开CE,连接游戏后,需要启用Mono特性,注入脚本才能使用。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved