吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 3330|回复: 116
上一主题 下一主题

[游戏安全] fc游戏的rom修改方法

  [复制链接]
跳转到指定楼层
楼主
liphily 发表于 2020-7-25 11:15 回帖奖励
本帖最后由 liphily 于 2020-7-25 11:37 编辑

很多fc游戏都有现成的金手指代码,缺点是每次玩游戏都要开一次。
而网上很多无敌版无限命版都是在游戏原版语言的基础上修改的。所以整理一个教程,我们就可以在中文版fc游戏上修改rom文件,做中文版无限命版。
网上也很少有fc游戏的修改资料,毕竟fc游戏的时代已经过去了。在此稍做记录,以备存档。
以游戏fc坦克大战为例,本文实现命数不减,和取消指挥部判定(就是老鹰被炸了依旧能继续通关)。


游戏原版(未修改):
链接: https://pan.baidu.com/s/1307_Qm3W5ieurDty6aYjjg 提取码: v9i3
fc模拟器(自带6502调试工具,是个通用模拟器,可以网上搜索到下载)
链接: https://pan.baidu.com/s/1_x8_UXy3-1U2cCCP8j-xYQ 提取码: ycfm


开工:

首先通过百度或者自己查找,找到以下功能地址
0051 生命数
0068 指挥部

1.命数不减
打开fceux,载入游戏,正式开始游戏后故意死命,死一次就搜索一次变小了的数值,最后找到一个数值和游戏实际相匹配的地址。

生命数的地址的0051,添加到调试器中并设置“写”断点,因为我们要找到是哪条指令让它的值变小了。

故意死掉一命,然后游戏自动暂停,断点位置跳出。

注意到带箭头的那行,也就是第2行:
DE0D:D6 51     DEC $51,X @ $0051 = #$03
DEC是自减1,所以把DE0D地址开始的2个字节给nop掉即可。在6502汇编中,空操作的代码是EA
打开十六进制编辑器

转到地址DE0D处:

我们可以查看nes内存,显示的更加详细一些。

最后还是要转到rom中对应的位置(在nes内存中,鼠标点一下要修改的地址,然后点鼠标右键,弹出这个菜单),2个字节改成EA EA(下面图片中的右下角红色字节),然后保存rom文件即可。

此时,我们用模拟器重新载入这个修改后的rom文件(nes扩展名),故意死一次,就可以看到命数不减了。

2.无视指挥部
在游戏中,如果指挥部被炸了,游戏就直接输掉了。所以把指挥部炸掉后的后续处理给改掉。
首先找到对应的地址,是0068。这个地址非常不好找,因为我们一般标志状态就一个0和1,而这个是正常状态128,指挥部被炸的瞬间,它会变成十进制39,然后每一帧数值减1,一直到0为止。所以很难搜索出来。
同样地,对0068下断点,然后攻击指挥部,断点指令被触发。
STA $0068 = #$80,然后点“运行”,会发现DEC指令多次被触发,如下:
1D:E2DC:C6 68     DEC $0068 = #$27
1D:E2DE:A5 68     LDA $0068 = #$27

这两行指令被反复执行,0068处的值从0x27开始,一帧一减去1,最后为0。
因此利用上述方法,找到E2DC开始4个字节转到ROM中的地址,均EA掉,保存即可。
最终修改结果见视频:
https://www.bilibili.com/video/av540502231
修改后的成品:
链接: https://pan.baidu.com/s/15ozkoAu2wS1tFTY0Inlicg 提取码: 4khw


3.lua脚本
fceux模拟器可以在执行游戏的时候同步嵌入lua脚本,实现一些附带功能。比如直接修改内存,或者在游戏界面显示某些不能直接看到的数值提示信息。
比如我们用lua脚本实现无视指挥部的话,可以保证0068处的值一直是128即可。
[Lua] 纯文本查看 复制代码
while true do
sms=memory.readbyte(0x51) --生命数
zhb=memory.readbyte(0x68) --指挥部
gqs=memory.readbyte(0x85) --关卡数
gui.text(200,10,string.format("shengming:%s",sms)) --初始为2,实则3命
gui.text(200,20,string.format("laoying:%s",zhb)) --老鹰的状态值
gui.text(206,30,string.format("guanqia:%s",qgs)) --当前关卡数
memory.readbyte(0x68,0x80) --把指挥部状态值重置为正常值
end
emu.frameadvance() --帧进,每一帧刷新一遍
end


附加:一个fc游戏 西游记 的lua脚本
[Lua] 纯文本查看 复制代码
while true do
daojishi=memory.readbyte(0x106) --场景扣血倒计时
shoutao=memory.readbyte(0x10f) --手套次数
feixie=memory.readbyte(0x112) --飞鞋次数
jinqian=memory.readbyte(0x109)+memory.readbyte(0x10A)*256
gui.text(200,10,string.format("daojishi:%s",daojishi)) --32秒。满值128,最低0
gui.text(200,20,string.format("shoutao:%s",shoutao)) --秒杀bug
gui.text(206,30,string.format("feixie:%s",feixie)) --飞鞋次数
gui.text(200,40,string.format("jinqian:%s",jinqian)) --金钱是2字节
hp1=memory.readbyte(0x36b)
hp2=memory.readbyte(0x37b)
if hp1==0 then
gui.text(226,50,string.format("HP:%s",hp2))
else
gui.text(226,50,string.format("HP:%s",hp1))
end
emu.frameadvance()
end

在这个游戏中,初始武器不升级再配合手套道具可以秒杀所有敌人,包括boss,但是攻击次数用完后就不能秒了。所以速通的唯一难点是不知道剩余可用的攻击次数。使用这个lua脚本就可以在游戏界面中显示出来关键信息。
视频地址见:
https://www.bilibili.com/video/av925624622

总结:只要方法有了,修改任何游戏就比较随意了。
比如魂斗罗开场3命,我们可以先查到0032处是游戏初始的读取位置,默认为02。注意均为16进制值,那么我们只要改成1D,那么开场就是30命了。
同样,开场自带的武器也可以修改。还有对武器写断点,找到死命后武器被重置的指令EA掉,就可以实现死命不掉武器的修改了。
魂斗罗的武器地址是00AA,拿到新武器后,写“写入”断点,然后故意死掉,死的瞬间游戏暂停,可以看到DA09处的STA指令(存入值)

我们只要转入到对应的rom位置,把对应的指令(此处指令是2字节)给EA掉即可。(截图是我改过以后才截的图)
魂斗罗中文版武器死后不掉的成品:
链接: https://pan.baidu.com/s/1WwSzX-EUq-kfMJwchKYdAA 提取码: w9q4

免费评分

参与人数 23威望 +1 吾爱币 +38 热心值 +21 收起 理由
星垂月涌 + 1 + 1 我很赞同!
忧花殇倾城泪 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kernel2 + 1 + 1 用心讨论,共获提升!
qq05301 + 1 + 1 谢谢@Thanks!
5045915 + 1 + 1 谢谢@Thanks!
Unexpectedly + 1 + 1 谢谢@Thanks!
晓风☆残月 + 1 热心回复!
蓬勃向上 + 1 谢谢@Thanks!
novary + 1 鼓励转贴优秀软件安全工具和文档!
b15131865151 + 1 + 1 感谢楼主分享,妈妈再也不用担心我打游戏不通全关了
一叶秋风 + 1 谢谢@Thanks!
gaoyuan1234 + 1 + 1 我很赞同!
17877087703 + 1 热心回复!
威风的黑龙 + 2 + 1 谢谢@Thanks!
白安 + 1 谢谢@Thanks!
hack88888888 + 1 + 1 我很赞同!
bei8ke + 1 我很赞同!
张小凡。 + 1 + 1 我很赞同!
Cointration + 1 + 1 我很赞同!
ucia + 1 + 1 热心回复!
Martil1o + 1 + 1 我很赞同!
幻象 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| liphily 发表于 2020-7-25 19:06 |楼主
威风的黑龙 发表于 2020-7-25 18:15
fc的忍者龙剑传是童年回忆。也不知道能不能修改,命多一些就行

改成命数不减不就美滋滋了吗?地址百度一下,然后方法都一样。
故意死一命,把减命数的指令给取消掉。
00C4-01-09 人数

百度得知命数地址是00C4,
CB9A:C6 C4     DEC $00C4 = #$02

显然把CB9A转到rom对应的位置,可以看到是0x01cbaa
连续2个字节改成EA,最后保存即可。

fc忍者龙剑传3代(命数不减):
链接: https://pan.baidu.com/s/1j3QlYvtMC5FKHb0WPeI3wA 提取码: 785e

其它代数和版本修改方法同理。

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
威风的黑龙 + 2 + 1 谢谢@Thanks!

查看全部评分

推荐
urufu 发表于 2020-8-8 17:50
liphily 发表于 2020-8-6 22:24
Pc作为现在主流的设备,大多数游戏都有现成的修改器。

恩,PC游戏一般都能找到内存修改,但是无法匹配到静态修改的文件。
这点有什么工具可以使用吗?
4#
chenshuojian 发表于 2020-7-25 11:17
5#
lfm333 发表于 2020-7-25 11:21
虽然不玩游戏但还是支持楼主的辛苦分享
6#
qidalinokia 发表于 2020-7-25 11:25
学习了很厉害的知识
7#
浅颜JX 发表于 2020-7-25 11:29
感谢分享
8#
babyvs08ms 发表于 2020-7-25 11:36
学习了,虽然不怎么玩游戏了,但是技术的脚步不能停,感谢
9#
hunterking 发表于 2020-7-25 11:40
喜欢楼主的图像,表白!
10#
shqvc 发表于 2020-7-25 11:50
确实厉害  因为我什么都看不出来
11#
jitz11 发表于 2020-7-25 11:56
厉害厉害
12#
老婆是加藤惠 发表于 2020-7-25 11:57
学习一波
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2020-8-15 13:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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