琵琶行论坛

 找回密码
 注册
每日签到论坛FTP使用教学领取红包(开放!)论坛FTP搜索引擎
查看: 667|回复: 24

[教程] MAME Debugger搜索及修改街机作弊码教程 [第一版]

[复制链接]

该用户从未签到

发表于 2019-8-15 16:48:58 | 显示全部楼层 |阅读模式
本帖最后由 GaryTorres 于 2019-8-21 16:13 编辑

先声明,我不是闲的没事才写个教程,是写给让那些有自己想法想自己修改功能,以及想知道作弊功能是如何实现的看的,至少我是这样,而不是那些只会拿别人现成的东西用而不加思考的,顺便吐槽某人在我问调试器的问题时自己不会还说我问题过气,我不会的时候找这方面的教程和资料基本找不到什么,后来在论坛知道了help这个命令后自己一个一个试出来的

教程写的比较杂乱,几乎所有的细节我都写进去了,废话有点多,但认真看完肯定能懂,也没有太高深的地方,搜索及修改方法不局限于三国西游或是pgm,只要Arcade或是MAME能运行和调试的游戏大部分都能修改,主要看思路及想法,不懂的地方可以回帖或私信问我,不加QQ什么的,回帖我只会回复问题,但别的我也会看

此外,如果有点英文基础的话可以在调试器输入框输入 help,所有的调试器相关帮助文档都能在这里看到,不过是纯英文的,也能拿手机拍照翻译,但很麻烦就是了

能看完帖子的没几个吧,要收藏的话我附件了原稿,转载随意,能帮到需要的就好了

最后,鸣谢蓝兔和秃驴整理rom与模拟器,axdx分享MAME debugger常用指令,以及ru1061和燕市还有海叔在调试器科普方面给予的帮助


------------------------------------------------------------------------------------------------------------

目录:

# 准备
# 如何调出调试器
# 修改无限气 (精确搜索)
# 如何将找到的地址保存到作弊菜单
# 共用代码找地址
# 汇编修改
# 修改无限时间 (模糊搜索)
# 断点改寄存器值
# 自定义条件断点
# 补充


------------------------------------------------------------------------------------------------------------

# 准备:
Arcade模拟器及rom,若是没有,这里下载

若想事先了解MAME Debugger命令,这里


------------------------------------------------------------------------------------------------------------

# 如何调出调试器:
图片1.png
图片2.png


之后进游戏,拿33举栗,
图片3.png


进游戏后会弹出调试器,且游戏持续黑屏,这时候点一下调试器,并按下F5即可运行游戏,
注意不要关闭调试器,然后游戏里投币选人选图


------------------------------------------------------------------------------------------------------------

# 修改无限气 (精确搜索)
图片4.png
可以看到当前有5格气,
图片5.png
暂停游戏,然后在调试器的输入框里输入ci
(ci全称cheat initial 作弊初始化,每次搜索新的作弊码都要先输入ci,输入后看不到变化很正常,因为暂停了游戏,
这时在信息区滚轮一下就会看到信息区的变化,也可以解除游戏暂停,信息区同样会刷新)


图片6.png
再在调试器输入框里输入cn eq,#5
(cn全称 cheat next,表示下一个作弊变化,搜索作弊码就是不断筛选的过程,
eq全称equal,等于的意思,
#表示后面跟着的数据类型是10进制的,若是不输入#默认为16进制,当然,若只是0-9的数据区间可不用加#
数字5是因为当前有5格气,所以搜索10进制的5)


回到游戏AB用掉一格气,
图片7.png
这时候在调试器输入框输入 cn eq,#4
数据会剩下两三个,
再次游戏内AB用掉一格气,输入 cn eq,#3
还是剩下两条,不用继续筛选了,我试过了怎么样都会有两条
图片30.png
(address表示地址,start表示起始值,比如一开始eq,#5这里就是5current表示当前值)


那这时候怎么办呢,需要找到这两条里那一条才是存储气值的地址,
点一下调试器,
按下Ctrl+M的快捷键,
图片8.png
或是用Debug菜单的New Memory Window打开内存浏览区域,在这里可以输入地址查看对应地址存储的值


图片9.png
在内存区域输入第一条的地址,可以看到00000005
我站了下街气已经恢复到5了,所以这里的5可能就是存储气的值,
先回游戏把5个气都用掉,会发现原来的5变成了0,将原来5位置的0改为5
再回游戏AB释放技能,释放不能,那这个就不是存储气的地址了,


图片10.png
现在输入第二条的地址,站街满气显示5
照测试第一条的方式回游戏把气用完,再将原来50的数字改成5
若是气条不满1格但仍可继续放技能,那这个就是对的地址了


MAME Debugger的好处就是地址搜出来都是静态的,每次重上游戏地址还是一样可用,不用像CE那样特意去找静态地址


------------------------------------------------------------------------------------------------------------

# 如何将找到的地址保存到作弊菜单:
地址找到了,要怎么将其添加到能在游戏里直接切换的作弊菜单呢?
① 可以用记事本或者任何方式记录对的地址,
也可以在调试器的输入框里输入cl 名字 (cl 全称 cheat list,输入cl等效于cheatlist
即把当前搜索到的作弊码条目以MAME作弊表的形式保存到文件,名字可以任意,也可以自己添加后缀,这里拿1.txt举栗)

拿后者举栗,输入cl 1.txt,这里搜索到的两条就会被以名字为1.txt的文件保存到Arcade模拟器根目录,


图片11.png
打开后是这样,科普下,
1 cheat desc=””,双引号里的内容为说明文字,可任意更改
2 script state=””,双引号里的内容为切换或运行方式,有runchangeonoff
图片12.png
run在作弊菜单里往右切换就能开启并锁定,
change不好解释,
on的话在作弊菜单里是显示set,回车就能生效但不锁定,
图片13.png
off一般用于还原,
图片14.png
比如这样,在33里将敌方不攻击作弊开启后敌方的确不会攻击了,但若是关闭了值还是0,不会自动恢复到1,在很多地方就很坑,
但这样添加off后在作弊菜单里往左关闭就会执行off的指令,也就将值改为了1

3 <action></action>标签里的内容为执行的操作,
maincpu代表cpu地址,不用管就这样写就行了,
pb为数据类型,
pram也就是内存地址 (也可以是rrrom地址,改汇编地址要把p改为r,看后文就知道)
b为数据类型 (bwdpb为字节也就是xxw为二字节也就是xxxxd为四字节也就是xxxxxxxxp的话八字节?没用过)
@地址即为引用地址,按照这个格式写就行,
=后的为值,视@前的数据类型字母而定,如为b的话这里就是两位,为w的话这里就是四位,以此类推

一般来说直接从别的作弊表里复制要的这一大段,然后自己改说明文字改地址改值就行了,也可以用cl保存作弊表的方式复制粘贴到这里

其次,对应的游戏有对应的以及对应版本的作弊表文件,存储在模拟器根目录的cheat文件夹里,
33举栗,33 104中国版的作弊表文件名为kov3.xml,之前提到过的cl保存作弊表只是保存在模拟器根目录,
若是不把内容复制粘贴到对应游戏版本的作弊表里是不会在作弊菜单里看到的


图片15.png
版本名的话一般就是rom名,进游戏后模拟器标题栏也看得到


回到之前的步骤,打开cl保存的1.txt是这样的
图片16.png
已知正确的作弊码地址是第二条也就是20031AE1,划黑线的地方可以任意更改,划绿线的地方可以去掉冒号和两个p中的一个,
把这一整段复制,然后打开cheat目录的kov3.xml文件,粘贴到开头,比如这样

图片17.png


可以自己写注释,xml文件的注释格式是 <!--  -->,在中间空白的部分可以写任意文字而不会影响作弊菜单


然后重上游戏或是在游戏里按Tab键调出菜单列表切换到作弊菜单,手动或是按End键跳到最下面,
图片18.png
选择全部重新载入,再回到最上面就能看到刚添加到作弊菜单,
图片19.png
1P 无限气切换到开启状态回到游戏即可无限释放技能
但这样只有1P无限气,那2P怎么办?


------------------------------------------------------------------------------------------------------------

# 共用代码找地址:
上个问题,
① 可以换2P手动重复搜索及添加过程,
① 也可以用更高级的方法,下断点,据我所知街机游戏大部分的代码都是有共用代码处理指令的,拿找2P无限气作弊码为栗,
复制刚才找到的1P无限气作弊码地址,游戏里依然用1P,因为要用1P触发改写断点获取共用代码处理指令地址,
在调试器输入框里输入 wp 20031AE1,1,w
(wp 全称 watch point 监视断点,后接地址,英文状态的逗号,1不用管,照抄,wwrite 写入数据,
也可以是rread 读取数据,这里用w监视写入数据,当20031AE1存储的值被改写游戏就会中断)


回到游戏AB释放技能,会发现游戏立刻卡住,回到调试器滚轮会刷新出如下代码,
图片20.png
翻译一下:
断点1已设置
在断点1中断并往地址20031AE1写入4 (PC=XXXX  ,这里的PC就是共用代码指令的地址,也叫汇编指令的地址)


图片21.png
观察上方的地址,之前指令地址显示的是100269F0但为什么停在100269F2呢?
因为269F0已经执行完了,这个不用深究,
然后看269F0的指令说明,STRB就是赋值的意思,R1R0R4都是寄存器,在左边那一排可以看到寄存器的值,
[]里的基本就是寄存器加上寄存器或者一个值=地址,而68K汇编指令也就是这里的街机汇编指令,赋值是从左往右的,
也就是说这里的R1, [R0, R4]是把R1 的值2赋给 (105+200319DC) ,用计算器十六进制把105+200319DC会发现刚好等于20031AE1
也就是1P的无限气地址,有想法的应该应该知道接下来要做什么了,记下100269F0的地址,然后
① 按下Ctrl+B的快捷键,
② 或菜单指令打开断点列表
图片22.png
图片23.png
默认打开是显示断点列表,菜单或快捷键切换到监视断点列表,
点一下刚才wp的地址的En那一列也就是X,就暂时关闭了断点,
也可以在调试器输入框输入 wpc (watch point clear 监视断点清除),这会清除所有监视断点,
或是输入wpc IDID在监视断点列表里看得到,这样就只会清除对应的断点,
确认这个断点不会影响游戏了之后,点一下调试器任意窗口,按下F5即可恢复游戏运行,
回到游戏,切换到2P,在调试器输入框输入 bp 100269F0
(bp 全称 breakpoint 断点,wp是用来监视内存地址的,而bp是用来监视指令地址的,100269F0是之前找到的共用代码处理指令地址,
也就是说当程序执行到100269F0时游戏就会断下来)


2P AB释放技能,游戏立即断下,
图片24.png
不用废话什么,R0+R4就是2P的无限气地址,自己计算器加起来把地址添加到作弊表就行


不局限于此,像是找地址什么的都可以这样照葫芦画瓢


------------------------------------------------------------------------------------------------------------

# 汇编修改:
其实还有另一种方式实现通用无限气,直接把这句共用代码处理指令无效化,也就是不会改变本应处理的地址的值,
依然拿无限气举栗,
无限气的处理指令是 100269F0,观察上图会发现在 100269F0指令的第三排有个5501
这里的5501是操作码,也就是汇编指令的机器码或是字节码,将其改成4E71 (4E7168K汇编的nop) 就能让这句指令无效,怎么操作呢,
在调试器输入框里输入 maincpu.rw@100269F0=4E71
(框架不用管什么照抄,r意为rom地址,w为二字节,因为操作码有4位也就是2个字节,b的话只有2位也就是1字节,
所以这里用w@指令地址=4E71,这样就行了)


现在回游戏AB放技能是不是能无限放了呢?而且1P也能无限放技能了
其它用途如道具不减,时间不减,血量不减什么的


但若是你重上游戏或是用F7读个档会发现又失效了,
重上游戏不解释,读档是因为F7是即时读档,会重置指令,
也就是把改成4E715501还原成5501,这样也很好解决,将地址添加到作弊菜单就行了
图片25.png
如这样,不需要过多解释,第二个scriptoff是当这条作弊代码往左切换的时候还原操作码


------------------------------------------------------------------------------------------------------------

# 修改无限时间 (模糊搜索)
33时间初始999秒,但直接ci再搜索的话是搜索不到的,因为ci默认是搜索的字节型,
数据类型我之前提到过,这里提一下有符号(signed)和无符号(unsigned)数据类型,
不用了解太多,百度就有,无符号数据类型一般用不到,
有符号字节型byte数据范围是0-255,所以搜不到999,除非时间减少到255以下,
而有符号二字节型word数据范围是0-65535,这里完全够用,
所以初始化的时候用 ci sw,即初始化有符号二字节,这样搜索出来的数据都是二字节的,
比如现在时间是973秒,输入 cn eq,#973,一般只有一个,若有几个就变化时间再次搜索变化后的,
我这里找到的时间地址为20000182Ctrl+M打开内存浏览区域,
输入地址会看到,
图片26.png
看不懂?正常,因为是16进制的,
前面的03E7是时间上限,转化为10进制为999
后面的03CC是当前时间,转化为10进制为972
图片27.png     图片28.png
将其显示方式改为1字节会发现显示是倒过来的,具体自己科普,
不影响修改和使用作弊码,
把显示方式改回四字节然后把03CC改成03E7时间就变成了999秒,
添加作弊码的话并不需要反着写值,直接把999转化为十六进制用0补全四位,
这样写就行了,maincpu.pw@20000182=03E7  (w和补0很重要)


然后就是模糊搜索,有些东西没有实际显示值,如血量,这里依然拿时间举栗,血量也这么搜索就行了,
依然ci sw初始化,回游戏让时间减少,再输入cn -
(意为值减少,还有cn +为值增加,cn eq为值未变化,cn ne为值已变化)
多重复几次时间减少和cn -就能得出唯一的值


若是血量或是什么怎么搜索都有几个值怎么办?
如血量就依次在内存浏览区域里改0然后给敌方打一下,
如果直接死了那就是对的值,弄成作弊码要赋什么值自己看着办


------------------------------------------------------------------------------------------------------------

# 断点改寄存器值:
断点前面了解过了,但作弊码或是作弊菜单是无法直接修改寄存器的值的,
除非是找到改写寄存器的地址或值加以操作,这里提供一种以断点方式修改寄存器值的方法,


wp 20000182,1,w找改写时间的指令地址,
图片29.png
看得到是把R0的值3D0赋给R1也就是时间地址,关闭wp断点,然后bp 10099758,r0=3E7,g
(在修改时间值的指令10099758处下断点,r0=3E7是把值3E7赋值给r0寄存器,g代表继续运行,
也就是说只要这个断点还在,每次运行到这句指令的时候都会把3E7赋值给时间地址,并且不会中断)


这个栗子显得这个方法很鸡肋,只是没用到地方,我现在也没什么能拿来举栗


------------------------------------------------------------------------------------------------------------

# 自定义条件断点:
有时候下断点会遇到很多次连续中断,按F5按得手麻那种,这时候就可以自定义条件,
让其在达成定义的条件时才会中断,依然拿改写时间断点举栗,
在改写时间指令下了断点后会发现只要时间减少就会断点一次,
但如果想让其在时间刚好到500的时候中断要怎么做?
依然bp 10099758,r0==1F4
(1F4500转化为16进制,这里意为当r0也就是时间剩余500秒的时候中断,
==为条件运算符,意为等于,不同于赋值的=
这里可用的条件运算符还有 !=不等于,<=小于等于,>=大于等于 等)


改写寄存器和g也能用在wp断点上


------------------------------------------------------------------------------------------------------------

# 补充:
1 当光标在在调试器输入框里时按↑↓方向键可以浏览之前的输入历史
2 PGM系列游戏很多东西都有flag,也就是标志位开关,比如西2孙悟空开火附魔的时候搜索1,效果结束搜索0,重复然后筛选就能找到武器附魔属性,按这样的方法可以改出各种花里胡哨的效果
3 无敌可以参照第二条,一般是搜索复活无敌,若是留意过,复活或新P角色出场后的几秒内是不会受到任何攻击的,所以在角色刚复活或出场的时候暂停游戏搜索1,闪烁没了搜索0,死一次再次无敌暂停搜索1,重复,直到剩下几个地址,依次测试,其余P无敌地址可用共用代码指令获取,若是搜索不到flag地址,可以搜索无敌持续时间,然后锁定
4 值得一提的是,不是所有的共用代码处理指令都能随便改,需要确认有没有bug,有些指令会同时处理很多很多不同的甚至不相关的东西,比如我尝试过改物品不消失,把共用代码nop掉之后不论是方向箭头还是放道具后提示的文字等乱七八糟的都不消失了5 在调试器里修改的汇编指令地址,比如nop掉一个汇编地址,只要使用即时读档就能自动还原,不用非得手动还原操作码
5 纠正下,经过海叔的讲解和我自己在PGM2和PGM1的测试,PGM2游戏的汇编指令大部分是arm汇编,而不是纯68k,pgm1的话大部分都是纯68k汇编指令,简单说就是指令集不同,比如STRH赋值指令是arm汇编里的,在68k汇编里是找不到的,其次最直观的就是寄存器的数量,arm汇编的寄存器比68k汇编多了好几个,还有就是arm指令集里操作码一般就只有2个字节也就是4位,但在68k汇编里大部分都是4个字节以上,也就是要nop一条指令的话要写至少两个4E71,其次arm里的4E71并不是实质上的nop,而是将其替换成了无效的代码,具体自己科普





MAME Debugger修改教程.zip (368.54 KB, 下载次数: 28)

评分

10

查看全部评分

签到天数: 214 天

[LV.7]常住居民III

发表于 2019-8-15 18:16:39 | 显示全部楼层
教程不错,支持一下~
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-8-15 18:50:16 | 显示全部楼层
speedwolf 发表于 2019-8-15 18:16
教程不错,支持一下~

谢谢  
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2019-8-15 19:28:58 | 显示全部楼层
好详细。。。看看。。楼主很有耐心
回复 支持 反对

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2019-8-15 20:13:18 | 显示全部楼层
感谢发布教程,收藏了
回复 支持 反对

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

发表于 2019-8-15 20:48:28 | 显示全部楼层
严重感谢楼主的无私分享,谢谢您。。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-8-15 21:38:39 | 显示全部楼层
xuleilei1111 发表于 2019-8-15 20:48
严重感谢楼主的无私分享,谢谢您。。

吾之所幸
回复 支持 反对

使用道具 举报

签到天数: 4 天

[LV.2]偶尔看看I

发表于 2019-8-15 23:32:00 | 显示全部楼层
搜藏  绝对的好教程   不懂也要看到懂
回复 支持 反对

使用道具 举报

签到天数: 1035 天

[LV.10]以坛为家III

发表于 2019-8-15 23:40:34 | 显示全部楼层
教程很好,支持
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-8-16 00:09:25 | 显示全部楼层
lzfsdl520 发表于 2019-8-15 23:32
搜藏  绝对的好教程   不懂也要看到懂

不懂的地方可以问我
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2019-8-16 03:19:35 | 显示全部楼层
好教程,收藏了
回复 支持 反对

使用道具 举报

签到天数: 24 天

[LV.4]偶尔看看III

发表于 2019-8-16 08:44:27 | 显示全部楼层
收藏了,留待学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|琵琶行论坛 ( 赣ICP备12000882号 )

GMT+8, 2019-8-24 02:10 , Processed in 0.029353 second(s), 9 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表