- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6502
FC游游戏戏 炸炸弹弹人人续续关关码码逆逆向向
4年前做的,现在有空整理一下发出来混个邀请码….
FC游戏-炸弹人1代, 信很多80后都玩过吧,我小时候挺喜欢玩的,游戏玩的不怎么样,但是对那个续关码很感兴趣,曾经记了20多
页纸试图找出其中的规律,只知道最后一位是校验位 -_-!
要想知道续关码的算法,首先要知道它的处理器,一搜才知道,原来NES用的是6502,这可是一款经典的CPU,Apple一代和二代都
是用的它,还有国产的文曲星…说到文曲星,当年(2003年)表哥送我一台文曲星(具体什么型号忘了),我上网查到可以用数据线升级
BASIC功能,就满泰安城找数据线去了,把跟我去的同学都逛烦了,最后也没有找到,不然也许能早入门个几年……:)
用到的资源:
炸炸弹弹人人ROM 文文件件 B mber Man (J).nes http ://www.r mnati /srv/r ms/284 11/nes/B mberman-J.html
6502 指指令令集集 http ://www.la gu.c m/la gubbs/shared wn.asp?id=270srv= 1
FCEU0.98.12.win (带Debug功能的NES模拟器)http ://mmm. /s ft 10/FCEU0.98.12.win.rar
NESpackage (Ida 载入nes格式的插件) http ://bbs.pediy.c m/sh wthread.php?t= 125458
首先,我们把 NESpackage\nesdbg\bin\nes_stub.plw c py到ida 的 \l aders文件夹里面,这样Ida才能识别NES格式的文件,用Ida载入
B mber Man (J).nes
我们可以看到ida 已经识别出代码段和数据段了,下面要做的就是定位代码,
要定位代码,就要知道数据的存储地址,懒得去自己调试,最快的方法还是站在巨人的肩膀上…从网上搜了个炸弹人的金手指
; 炸弹人1代金手指
#1 0068-01-09 生命无限
#1 0073-02-09C0 最强的雷
#1 0075-01-01 速度加快
#1 0076-04 免疫功能
#1 007D-02-0101 其他功能
#1 007A-01-01 无敌
#1 0058-01-4A 最终关
要注意的是续关码只保存了一部分数据 (例如,不保存剩余生命数),我知道0x75 (加速鞋子)是保存在续关码里面的
用FCEU载入游戏,玩到最后一条命的时候,打开调试窗口
当主角死了但是还没有出现续关码的屏幕前,切换到调试窗口,点击单步,先让游戏暂停下来,在0x75设内存读取断点,然后点击运行
可以看到,程序中断在 e31b
切换到ida ,看看e31b在干什么?
E31b处的指令是 LDA ($34),Y
查询6502指令集
得知,这种寻址方式属于零页间接索引地址,内存34和35处放置着一个16位地址,把这个地址再加上Y寄存器的值作为有效地址,再把
有效地址指向的数据送到A寄存器中
我们看前面那条指令
JSR sub_E327
Jsr是6502 的call指令,我第一眼以为是像jmp一样不回来了呢
让我们到 子函数sub_E327 里面看看吧
原来地址在这里面,双击E334 ,来到这里
不好…ida把这里认作了代码….
只好手动undefine ,一共20个16位地址
BYTE offset [20]={ 0x67 0x77 0xDD 0x61 0x99 0x66 0xDC 0x64 0x79 0x9A
0x74 0x63 0x75 0x62 0x9B 0x65 0x94 0xDE 0x76 0x95
};
经过无数的模拟器调试,我们知道了各个内存对应的属性
typedef struct
{
BYTE score_1; //分数右1位
BYTE Remote_bomber; //遥控
BYTE stage_low; //关卡低4位
BYTE score_7; //分数右7位
文档评论(0)