[原创]FC机之超级玛丽简单逆向分析
最近无聊,用模拟器玩了几局超级玛丽。顺便分析一下。
经典的红白机的超级玛丽,相信大家都玩过。
程序是NES文件格式的,网上找了一些资料并且做了一些整理:
开始地址 用途 结束地址
$0000 2K字节RAM,做4次镜象(即$0000-$07FF可用) $1FFF
$2000 寄存器 $2007
$2008 寄存器($2000-$2008的镜像,每8个字节镜像一次) $3FFF
$4000 寄存器 $401F
$4020 扩展ROM $5FFF
$6000 卡带的SRAM(需要有电池支持) $7FFF
$8000 卡带的下层ROM $BFFF
$C000 卡带的上层ROM $FFFF
6502CPU介绍
一 CPU寄存器
累加器 A(8 bit) 类似于EAX
变址寄存器 X ,Y (8 ) 类似于ESI,EDI
堆栈指针寄存器 S ( 8) 100H-1FFH 类似于ESP
程序计数PC(16) 类似于EIP
标志寄存器 P(8) 类似于ELF
二 CPU指令
6502 X86
lda #$04 mov al,04h
lda $04 mov al,[04h]
jmp($4000) mov eax ,[4000]
jmp eax
TAX MOV X,A
TXA MOVA,X
TAY MOV Y,A
TYA MOV A,Y
TSX MOV X,S
TXS MOX S,X
PHP push p
PLA pop a
PLP pop p
lda 内存单元 ;mov a,内存单元
ldx 内存单元 ;mov x,内存单元
ldy 内存单元 ;mov y,内存单元
sta 内存单元 ;mov 内存单元,a
stx 内存单元 ;mov 内存单元, x
sty 内存单元 ;mov 内存单元,y
adc 操作数 ;and a,操作数
sbc 操作数 ;sub a,操作数
inx ;inc x
iny ;inc y
dex ;dec,x
dey ;dec,y
and 操作数 and a,操作数
eor 操作数 xor a,操作数
ora 操作数 or a,操作数
cmp 操作数 cmp a,操作数
cpx 操作数 cmp x,操作数
cmy 操作数 cmp y,操作数
rts retn
brk int
JSR call
nop机器码 0EAH
分析PE程序需要用到OD;,分析NES也要相应的调试器,这里我用到的是VirtuaNES
静态分析,当然还是IDA了;
--------------------------------
开始分析:
游戏,命是最重要的。喜欢超级玛丽的人都知道3-1关的加无数命,原理就是连续踩坏蛋,100;200;400;800;。。。。。。8000;1命;
那么怎么实现这个命的功能呢?
我的思路是达到每踩一次坏带就加一次命的效果。
;D9DA(59EA)----AD10EAEAEAEA

图1
除了生命,什么最重要呢?那就是时间了 这次来个时间无限
通过反复分析 发现B74F为时间递减函数,直接nop掉就可以了。想分析的童鞋可以分析分析

图2

图3
这样 时间就不递减了,可以痛快的玩了。
我就分析这2点吧,想分析的可以继续分析下。
