Site icon 时鹏亮的Blog

Switch Breeze 金手指制作教程三:编写ASM模板与处理共用代码

请知悉:本文最近一次更新为 2年 前,文中内容可能已经过时。

以下内容完整转载自:超绝可爱陆陆酱 原创发布:【工具教程3】Breeze高阶技巧:编写ASM模板与处理共用代码

上一篇介绍了,Breeze自动生成Code cave的功能,其实只是使用了Breeze默认的ASM模板,生成了一个非常简单的金手指代码。

本篇就来介绍一下,这个功能更进阶一步的技巧,我们可以自己编辑模板文件,来自动生成复杂的代码。

那么先简单介绍一下

什么是共用代码?

共用代码指的是,游戏中经常会使用同一段程序,来对不同的情况进行计算。比如说最常见的,当我方单位和敌方单位使用同一段程序来计算,那么直接修改成不减的话,那样敌我单位都不会掉血了,游戏就没法玩了。

当游戏的加法和减法,使用同一段程序,你去修改成不减,可能就造成,数值也不会加了。如果你去修改一个倍数,那么加法是倍数的,减法也是倍数的,相当于改了个寂寞。

也有非常离谱的开发者,写程序整个游戏只有一行加法程序,这行程序可以进行加或减的计算,同时用来计算货币、道具、人物属性……可能还存在一些未知的数值,这种游戏不做好区分的话,修改很容易坏档。

共用代码是汇编修改中经常遇到也是最头痛的问题之一,而解决这个问题的技巧就是区分。

什么是区分?

区分就是指,将原本共用的程序,设置一定的条件参数作为判断的依据,将其区分成两个或者更多的程序,让它们各自单独结算。比如说把原本共用的血量程序,区分成敌我单独结算,就可以修改为,我方血量不减,以及敌方秒杀,这样的修改。(有兴趣可以去看E大的教程,有专门讲过这个)。

Switch 金手指制作教程三:如何使用 GDB 找出 敌我判断 的特征

如果将原本加法和减法共用的程序,区分成让它加法、减法单独计算的独立程序。那么就方便针对它修改了,减法部分就可以修改为不减,或者不减反加,加法部分就可以修改为倍数增加。本篇讲解的就是这个技巧。

加下来我会以《破碎宇宙》为例子,非常好玩的塔防游戏,用于本次教学,将一行加减共用的代码,做程序区分,到完成修改的过程。

一般搜索到数值后,我会优先让数值减少来触发断点,增加和减少触发断点找到的程序是有区别的,有的游戏加法和减法用不同的程序段来计算。

如果数值减少触发出来的断点,找到的程序是用sub(减法)指令来计算,说明这游戏分工明确,加就是加,减就是减。如果减法使用add指令来计算,那么这游戏就存在加减共用的问题,需要区分来解决。

那么跳过搜索数值等等之类的,之前讲过的不再讲,直接来到程序分析的部分。

断点追踪到[main+0x2239b88] str w8,[x21,#0x98] 这一行程序

按X打开程序,向上翻页,分析完整程序,很简单就四行而已。

[x21,#0x98],这个位置就是刚才搜索的数值,在内存中位置,那么整段程序的意思就是

LDR W8,[x21,#0x98] 从内存中的[x21,#0x98] 这个位置,把数值加载进W8里

adds w8,w8,w20 将W8加上W20的值,赋值给W8

b.mi #0x2239c04 b 跳转指令,mi是负数的条件助记符,条件助记符有很多种,这个也是要记住的,自己百度一下都有,经常需要使用到的,赋予指令特别的用途。

这行意思就是获取上面一行的计算结果,当结果为负数,程序跳转至main+0x2239c04这一行。应该是判断,如果货币不够,跳转至另一个程序段。如果把这一段改成NOP,禁止程序跳转,那么应该可以修改为无视条件购买物品,货币是负数也能买,但我并不想这样改。

str w8,[x21,#0x98] 将w8的值,写回内存中[x21,#0x98]

这个位置。

矛盾来了,我刚才明明让数值变小了,而程序却是用add(加法)来进行计算的,那么就说明,这一段程序,存在加减共用的问题。

就我们理解的减法应该是,W8-W20

而程序实际执行的是,W8+(-W20),这样的方式来做减法。

那么程序就看懂了,开始修改。

一般像这种add、sub用来计算的程序,很好修改,也很好作为一个跳转至Code cave的节点。这里先将add这行添加进金手指。

由于代码会很长,Breeze默认的模板已经不满足修改的要求,我需要对模板进行编辑。

很遗憾switch端并没有好用的文本编辑器,目前最好的vgedit并不满足修改的需求,只能将此步骤搬到PC或者手机上,让更专业的文本编辑器软件来进行修改了,期待后续会有大佬开发出switch端上好用的文本编辑器。

breeze目录下有一个ASM.txt文件,就是既将要修改的模板文件了。

一般这一步我会用DBI打开FTP功能,用手机通过FTP连接至switch,在手机上直接编辑switch/breeze/ASM.txt文件,很方便。也可以连usb到电脑上再进行编辑,怎么改都是你的自由。

我这里用手机打开,删除里面默认的模板,编写自己的程序,编写成这个样子。

修改思路大概是这样,既然W20的值,可能是正数也可能是负数。那么就在进行计算前,去判断W20的值,为正数时,跳转进加法区,为负数时,跳转进减法区。

那具体是什么意思呢,要拆解来看。

判断区

cmp w20,0 cmp是比较指令,让w20,跟0进行比较

bmi .+20 bmi上面也讲过了,是带条件助记符的跳转指令,mi是代表负数的条件助记符。这一行的程序用于判断上面的比较结果,是否为负数。实际执行的是让w20-0,再将结果储存至临时寄存器中,只有负数减0才会等于负数,很好理解。

. 代表是程序执行的当前位置(PC),而+20则代表的是,当满足条件,往下跳转,由于金手指一行是4个字节,所以+20表示的是,往下跳转20÷4,也就是第五行,从本行往下跳转五行,进入减法区。

而不满足条件,则不进行跳转,顺位进入加法区

…………………………………………

加法区

ldr w0,.+28 向下查找七行,将常数加载进W0

mul w20,w20,w0 乘法,将W20乘W0的值赋值给W20

{original} original字面意思就是还原,

从adds w8,w8,w20这个程序跳转进 来的,所以这行的代码就是原来的样子

b code1+4

b 跳转指令 code1代表跳进来的那一行的地址,而+4则是下面一行。本行的作用就是,在完成计算后,跳出Code cave,返回原程序。

…………………………………………

减法区

nop

nop就是空指令,没有任何意思。本行作为预留,之后修改会需要的。

{original}

还原程序,同上

b code1+4

从Code cave中跳转回原程序,同上

…………………………………………

常数

nop

暂时留空,方便加载模板,本行不写指令,之后会写一个常数,加法区会加载这个位置的数值,作为倍数修改的需要。

这样,模板就编写完了。之后返回Breeze的金手指界面,找到先前添加进来的金手指,选择add ASM,导入刚才编写好的模板。

就自动生成了一堆代码,先切回机器码,把刚才常数区预留的那一行,写的是NOP,既D503201F修改为00000001。

这样,区分就完成了。

不过此时并未做任何的修改,只要区分出来,修改就非常简单了。

加法区的修改,之前在加法区写了一行乘法的程序,所以只需要修改常数的数值,就可以修改为增加x倍,至于写多少倍,开心就好,多少都行。

然后是减法区的修改,一种是修改为不减,一种是修改为不减反加。

改成不减的话,把之前留空的那一行,修改为MOV w20,0

就可以了,再执行计算之前,先让W20等于0,那再执行加法没有什么意义,就是不减了。

改成不减反加的话,就只需要把ADD指令换成SUB指令,那么原程序就会从 W8+(-W20),变成W8-(-W20),减去负数就是加法了,很好理解。

那么先把金手指导出来。

[mster code]
04000000 02239B80 2B140108
04000000 02239B80 14759BF4
04000000 03FA0B50 7100029F
04000000 03FA0B54 540000A4
04000000 03FA0B58 180000E0
04000000 03FA0B5C 1B007E94
04000000 03FA0B60 2B140108
04000000 03FA0B64 178A6408
04000000 03FA0B68 D503201F
04000000 03FA0B6C 2B140108
04000000 03FA0B70 178A6405
04000000 03FA0B74 00000001

此次我打算把整个未修改过的程序使用{}括起来,当做默认程序去执行,仅使用个别关键节点修改作为金手指的开关。

稍加修改之后,就是这个样子。

{master code//必须码}
04000000 02239B80 14759BF4
04000000 03FA0B50 7100029F
04000000 03FA0B54 540000A4
04000000 03FA0B58 180000E0
04000000 03FA0B5C 1B007E94
04000000 03FA0B60 2B140108
04000000 03FA0B64 178A6408
04000000 03FA0B68 D503201F
04000000 03FA0B6C 2B140108
04000000 03FA0B70 178A6405
04000000 03FA0B74 00000001

[螺母增加5倍]
04000000 03FA0B74 00000005


[螺母增加10倍]
04000000 03FA0B74 0000000A


[螺母不减]
04000000 03FA0B68 52800014


[螺母不减反加]
04000000 03FA0B68 D503201F
04000000 03FA0B6C 6B140108

Breeze这款工具本身的功能,我会的用法都讲完了,从简单到困难,简单的代码能做,复杂的代码也能做。推荐大家都来试试看这款新的工具


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《Switch Breeze 金手指制作教程三:编写ASM模板与处理共用代码》相关的博文:

Exit mobile version