EMU618社区

 找回密码
 立即注册
搜索
查看: 842|回复: 3

[原创HACK教程] FC自动演示修改教程

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 ' E" _" O+ b  j( x# m5 H
( z" F) p9 F1 f
FC自动演示修改教程
: Q# P2 W5 g- S  l2 I作者:火焰烈旋风
' ^, ~* U& o2 z& b工具:FCEUX中文版(www.9553.cn搜FCEU即可)1 v7 H; h: @, P
1.找按键地址:6 H; x9 a3 b& w1 r
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
! s) [: p1 }7 i3 X8 U9 U  |, W% Z2.找演示时按键的数据来源:
" u5 T) H; ^% ]* G. }/ F1 A    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:  N7 h9 e: G- [1 G$ X, @
07:C38F:94 F1     STY $F1,X @ $00F1 = #$012 |6 O7 z' b! c4 }, [6 b
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
6 ~0 I2 j) v! G( K# h' {) I; K/ H07:C393:CA        DEX
: I! }' ]; B% M9 a) z. b5 l* X07:C394:10 F0     BPL $C386
2 F5 u- {/ Y' ?7 V% E07:C396:60        RTS
& k8 q, l' d' s# h0 j( G: _我们点击"运行"左边的上拉按钮上拉,看到如下指令:
" X! ~  h( \" `6 C0 a07:C378:A5 1D     LDA $001D = #$07) K$ t6 I2 U1 g! @; W7 w
07:C37A:29 04     AND #$043 _9 T( |/ T8 V
07:C37C:D0 06     BNE $C384
6 @+ b0 X& d7 T6 p& S. a2 u5 F07:C37E:A5 04     LDA $0004 = #$00
+ X2 _+ B3 q8 f2 v' T3 L% v6 Q" d$ p1 G. M07:C380:05 05     ORA $0005 = #$00# i9 }. H! X# I7 ]& j$ X
07:C382:85 04     STA $0004 = #$00( H0 L1 R  k' @$ }$ t- z
07:C384:A2 01     LDX #$014 _9 p8 J- N' t3 ]* ^
07:C386:B5 04     LDA $04,X @ $0004 = #$00
& B5 w7 v. @0 g( m1 }07:C388:A8        TAY
, t# Q' t* B3 |07:C389:55 F9     EOR $F9,X @ $00F9 = #$006 X# c4 O/ f! E' \
07:C38B:35 04     AND $04,X @ $0004 = #$00
$ r( G. B* W) N1 B' d* X9 }8 d07:C38D:95 F5     STA $F5,X @ $00F5 = #$00& g( |$ o6 a4 j* W5 ?
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01* ^* D. j! G, T+ q# j' T
07:C391:94 F9     STY $F9,X @ $00F9 = #$002 \' l# h, _3 m
07:C393:CA        DEX) W- k( b" a6 f& a* J
07:C394:10 F0     BPL $C386
8 f+ t! u8 H+ Z, Q9 {# ^9 |4 F07:C396:60        RTS
7 [5 X  R3 I1 ]由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:% Y- e! F. P8 p# |. J/ W
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00( j& `5 J& `6 q) c. g( L( H
05:B3A5:A5 2E     LDA $002E = #$C8/ b. P2 \6 J5 Z0 ]
05:B3A7:C9 50     CMP #$50
8 {: J/ M, c0 H$ [! {% s05:B3A9:90 20     BCC $B3CB9 q1 I  {+ o  p9 m' y
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00+ b" A' H6 m& z  r
05:B3AD:29 0F     AND #$0F6 P5 H; U. y1 {( b1 o- [% f# N. b
05:B3AF:C9 01     CMP #$018 u% W' v  b7 N$ q' Q; G
05:B3B1:F0 04     BEQ $B3B7
( M& v3 n/ `8 X) J" ^3 {2 c05:B3B3:C9 04     CMP #$04
" A% r- T6 U7 I3 _2 f.........
( {( ]6 r: N" ~  K) N7 S) j5 @2 Q我们点击"运行"左边的上拉按钮上拉,看到如下指令:
' i- Q+ |/ q4 f& S7 b/ Q05:B39F:B5 5C     LDA $5C,X @ $005C = #$01% U" b% B8 b9 [0 w
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01) j! S/ C! t6 ^
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00& o# ~; a" n4 W% L0 a$ Z
05:B3A5:A5 2E     LDA $002E = #$C80 x+ B# @/ S- g" |; c
05:B3A7:C9 50     CMP #$50
0 C3 c% B" @# a05:B3A9:90 20     BCC $B3CB+ d* e7 f8 g/ M( _
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
  a" C2 _1 M7 C. I: c; I! a05:B3AD:29 0F     AND #$0F
* u+ w& i* v! W  c; |/ s看到% W( ?& F) Q$ e& {0 G
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
5 i- Y0 e& R/ \0 N- l% I6 [05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01, s& p/ w- l0 Y
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
; w1 Z5 u* ?, R3 l# z  s没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
6 E( U. }. M: J* w& _* Y8 g, p/ L    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:- a# x- S- t3 B: @( v7 k  a# ]$ J
05:B392:95 5C     STA $5C,X @ $005C = #$01
4 P, Q/ b) C7 _* K05:B394:C8        INY8 m/ [! R- L% n/ l2 C1 u
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$096 B2 z& h) e8 f* x3 _6 Z
05:B397:95 5A     STA $5A,X @ $005A = #$00
) b' Z8 N0 A) n/ s1 @- w, R05:B399:C8        INY
& W7 m) w8 |4 @3 L05:B39A:98        TYA8 d& f, ]3 f- I
然后我们再上拉,得到如下指令:
: ^8 d& ~, N' i1 g" B$ L9 A7 ]05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
2 R/ D7 W6 J+ D3 o0 G1 M- }% Q9 W05:B38E:C9 FF     CMP #$FF' Q, h7 h4 j" h2 B% X( w( V. r4 ~
05:B390:F0 3D     BEQ $B3CF; E9 `6 D* i9 T+ t
05:B392:95 5C     STA $5C,X @ $005C = #$01
9 b* {0 y# O7 m! x/ S2 {05:B394:C8        INY
$ U) i$ E7 c! q5 G05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09) f6 F6 P: j# ?5 E+ c3 S
05:B397:95 5A     STA $5A,X @ $005A = #$00
$ Z7 t2 S1 _/ G# T4 M& O05:B399:C8        INY5 K7 y3 x9 C: E# h( M$ f  r
05:B39A:98        TYA+ g0 c; O  t; x" \% O3 ^
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
1 u8 I, b- u1 \9 p3 S没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
& j2 a3 R+ f4 Q0 A* h3.修改演示:
. r# v1 d, q" B! ?    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.0 F8 T5 h/ j! j& i
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
, Y8 ^3 w' x9 N( r9 w! z! B打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
: ^& C2 O' M9 S( u05:B392:95 5C     STA $5C,X @ $005C = #$00
/ S$ x% L9 H4 H) l05:B394:C8        INY
+ G4 @; P3 n1 I5 }! }% z2 X2 ?05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
1 P5 t7 r7 a3 j- W( @9 X& m05:B397:95 5A     STA $5A,X @ $005A = #$00
* s+ A6 G1 y" J% q8 H; n. U7 Z05:B399:C8        INY2 j3 z  A" F7 T
05:B39A:98        TYA# z. Y! }# Y# r5 g
我们上拉看到了:1 ~3 R; h4 k2 G
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$004 [' c! @: e- f0 n+ ]* g. Y) K
05:B38E:C9 FF     CMP #$FF# a) T2 ~# u. j) [! D
05:B390:F0 3D     BEQ $B3CF; z2 o7 Y' j, ~. X7 z6 F+ i0 W
05:B392:95 5C     STA $5C,X @ $005C = #$00
- R/ b6 L0 x" ^, |05:B394:C8        INY* F7 R$ `0 e/ y4 R
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00% S4 Y. `# W! K; I0 h# s
05:B397:95 5A     STA $5A,X @ $005A = #$00
) i, a; H4 q: D/ X7 P05:B399:C8        INY; g; O: i3 R5 F* W' T: V
05:B39A:98        TYA+ u' _) o% H! }4 s$ A
看到* z0 ^. J. l- E. @! x2 b
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00& k, Q2 X8 z' n+ J8 p& ]
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.5 C2 P1 q& a" o7 w
说明:演示按键地址的结构,以开始的00 21 01 03 00 0E 01 3D 04 06 05 33 00 0E 04 0A 05 01为例:第1个00是按键数值(无行动),第2个21是指按键数值21前的按键保持21(时间),第3个01是按键数值(向右走),第4个03是指按键数值03前的按键保持03(时间).......以此类推,判断根据:
0 C/ F# x6 p: E% t( C05:B371:B5 5A     LDA $5A,X @ $005A = #$7F  P3 \- y/ i; F& R# m" f
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)/ c# ^* G0 }7 o6 x) g
05:B375:A5 30     LDA $0030 = #$00+ x3 b) O* e) K3 i3 O% c
05:B377:0A        ASL0 S. Z* f4 E4 z( Y
05:B378:0A        ASL
3 j; l, n/ H$ ?05:B379:85 08     STA $0008 = #$298 k+ C1 c' m. E9 W3 \  k
05:B37B:8A        TXA
4 t% L+ R/ I% F05:B37C:0A        ASL' v; f2 G: ^7 M0 t+ F
05:B37D:65 08     ADC $0008 = #$292 \; U: a" ~/ ~: x8 t
05:B37F:A8        TAY& l  [% s1 O) {  H. q5 k# K( H
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
7 ^- M6 m" F( m$ x' |$ ~* S  K) u5 G05:B383:85 08     STA $0008 = #$29
+ S( y2 F  q* P& G- x/ I05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC' r5 u2 I: A: k7 P) `/ o8 p3 t) T
05:B388:85 09     STA $0009 = #$B2
: w1 ?: s8 J. n0 D7 H5 ]( C! A05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
' j4 h' z3 M. ~/ Q6 w3 A; z05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10" J# Z: W3 V6 F0 g0 l7 o9 c$ R
05:B38E:C9 FF     CMP #$FF
) T8 Z2 Q6 }: s4 m6 Z% z+ ^05:B390:F0 3D     BEQ $B3CF4 Y. M! L+ Y* ]& ~
05:B392:95 5C     STA $5C,X @ $005C = #$00
# M- X9 K. N3 E( _+ t) Z05:B394:C8        INY
: V- N- I, e3 I05:B395:B1 08     LDA ($08),Y @ $B22E = #$10& o; K$ l- Q4 z7 ~  e: S
05:B397:95 5A     STA $5A,X @ $005A = #$7F5 N, ]9 W- K3 h" y7 o& J) [
05:B399:C8        INY
. u; o% o) \9 U1 |" ?. `$ P05:B39A:98        TYA7 d( q5 m8 E" {2 u
05:B39B:95 5E     STA $5E,X @ $005E = #$02
0 A8 @2 Y6 Q7 G; |! o/ t05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)% y! V* f  H9 L( P3 A' p5 I
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00) b' M" t3 u7 M  ?) h5 s! O. s
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
( n2 c3 l" _" b9 m05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
4 o7 J3 m, p+ r3 A' J- f) W8 M
9 @; r+ S) e4 R; p* N( o+ M由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
" c0 P6 {2 x6 R% t0 k1 t- ?2 w5 s# x可以下载玩一玩; `' u4 M" v# A1 U' T
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。5 `5 U' ^" p+ i( `! C; E7 S% ?7 ^
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
7 k  [' _+ I$ p! x" K6 Y% q6 ~后来尝试其它修改,但是偶尔会造成花版或者死机。" n1 {6 k: ~+ h8 c2 L
深入研究,发现要以演示模式通关,需要做的事情还很多。6 a6 m: }9 b0 K$ ?
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: wyw 被钱袋砸中进医院,看病花了 3 个 柠檬. 幸运榜 / 衰神榜

签到天数: 112 天

[LV.6]常住居民II

发表于 2015-10-16 08:50:07 | 显示全部楼层
厉害啊,这个真厉害

签到天数: 9 天

[LV.3]偶尔看看II

发表于 2015-12-21 10:43:36 | 显示全部楼层
啊哦,你来晚了,分享的文件已经被删除了,下次要早点哟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2025-9-18 13:02 , Processed in 1.077148 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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