EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
( F4 g- P4 p1 [" B+ f  q9 r1 n/ k8 l1 v1 }" Y& l, Q
FC自动演示修改教程. V! Q6 j' T0 m) a- p+ V( Z
作者:火焰烈旋风
3 e$ l8 C3 g7 z3 k3 N7 u工具:FCEUX中文版(www.9553.cn搜FCEU即可)
+ q' O9 @* I) i5 e% s' q1.找按键地址:, Z# M8 F, ^5 p  M
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
4 a5 O, i( K7 j8 @2.找演示时按键的数据来源:
+ |8 u+ r2 f  m: G" E    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
0 ^/ V4 ]) D- x+ {! [) ]+ V! ?07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
7 |3 \- g7 |4 \3 a' x07:C391:94 F9     STY $F9,X @ $00F9 = #$005 ^0 g: i  ]6 u/ w9 ^  U! i
07:C393:CA        DEX- l7 q  a1 e& |
07:C394:10 F0     BPL $C386
% L4 U; _% w' ?& v! K( W% p1 _07:C396:60        RTS4 I  j8 d/ v: k& a2 e+ ^
我们点击"运行"左边的上拉按钮上拉,看到如下指令:  r& |' {) H: m- }% N3 r9 e; J$ f
07:C378:A5 1D     LDA $001D = #$07' {( w) I8 D0 m& e9 ^4 c
07:C37A:29 04     AND #$042 U4 p4 b, k) o9 }% T( k  u+ s
07:C37C:D0 06     BNE $C384
8 c2 z" d1 a1 ~" p07:C37E:A5 04     LDA $0004 = #$00
* w9 y) v: n' D; B% j07:C380:05 05     ORA $0005 = #$00
/ q$ F2 \8 G; |  W& H. o% \07:C382:85 04     STA $0004 = #$00
8 \+ _. A: J4 y1 Z07:C384:A2 01     LDX #$01
6 h9 u9 r3 n  E1 U8 N8 e: L3 G07:C386:B5 04     LDA $04,X @ $0004 = #$00. W2 |2 V, g; L
07:C388:A8        TAY
0 }8 k7 r4 s" @6 F- n% w07:C389:55 F9     EOR $F9,X @ $00F9 = #$00/ @* n2 q8 |; B' y* P- V: g
07:C38B:35 04     AND $04,X @ $0004 = #$007 D% Q* k' d' M. Z5 ?. X
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
4 @! ]+ }8 c5 {* R9 _( t07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
0 l* i0 D: L- |* T% L5 T. a07:C391:94 F9     STY $F9,X @ $00F9 = #$00
0 Z; ]8 p; H0 f07:C393:CA        DEX1 i: P- a* E( A  g: _+ z( _
07:C394:10 F0     BPL $C3866 [7 R2 ~6 k$ r: l4 Z4 f
07:C396:60        RTS
( g0 |6 O9 T0 Z: U3 q5 I$ ~由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
3 p- k( v2 j1 o- {; v05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
, A9 h! V1 Q/ d, _# Y; @6 m05:B3A5:A5 2E     LDA $002E = #$C8/ g, Q: s- A% i8 U
05:B3A7:C9 50     CMP #$50) H) `+ h& `+ G9 C( H1 v
05:B3A9:90 20     BCC $B3CB
) }0 `0 U+ e  I! g' j* F05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
4 j: p6 g7 k4 n3 c" ?6 w05:B3AD:29 0F     AND #$0F! i4 u6 u* N% B) L
05:B3AF:C9 01     CMP #$01
2 B8 s' q- G1 M, r, |5 H7 D05:B3B1:F0 04     BEQ $B3B7; H% X6 M* P6 c6 D; x
05:B3B3:C9 04     CMP #$04
1 t1 P% s, j- Q1 ^2 t' f.........
: ]$ D8 |$ f4 {% h我们点击"运行"左边的上拉按钮上拉,看到如下指令:* v) B  `/ U% P: I% V' `
05:B39F:B5 5C     LDA $5C,X @ $005C = #$016 _5 I# N* S1 q# F
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
, O. {7 ~) U: |% G05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
! {1 D4 R3 {- d  W05:B3A5:A5 2E     LDA $002E = #$C8( u  f0 m& O" H+ O" |/ P& K
05:B3A7:C9 50     CMP #$50. u1 k, g4 U1 ^7 T) e! Z. C. V8 s
05:B3A9:90 20     BCC $B3CB
3 j, l8 v& S1 `/ H05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
9 o6 D7 K* h  f0 q' L( T/ U6 F0 I05:B3AD:29 0F     AND #$0F
: \0 b$ {1 q; E2 p3 ^% R5 R看到4 i  N  {/ j, r- i1 K
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01: L9 ?* `) }! l) a# }9 X& _
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$015 L, d, ]( ?! |/ t
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
1 z5 J. a9 N& a7 N* Y没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.  d; K) r1 n0 i$ t* K0 L( H( C
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
$ e) _' W# p* l+ b( c05:B392:95 5C     STA $5C,X @ $005C = #$01( ^( k9 `( ^$ @" i% g
05:B394:C8        INY: d: a1 f( Y. n9 R* V$ p* V4 E
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
# [- S- c) g5 K05:B397:95 5A     STA $5A,X @ $005A = #$00/ S+ q6 i3 G7 n
05:B399:C8        INY
5 l: K. R5 E1 d! ~% \05:B39A:98        TYA* A1 r$ `% H/ Z8 T# Q4 D
然后我们再上拉,得到如下指令:# U- K2 ~# Q1 f3 K7 R0 E: A/ N3 x3 k* z
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09$ \$ r& L1 z- Y8 `: L
05:B38E:C9 FF     CMP #$FF- c% }/ ?5 X; A0 Z8 A2 F. T7 I! Z+ I/ R
05:B390:F0 3D     BEQ $B3CF
0 y7 s4 r$ d- r) p! \' o2 _) o05:B392:95 5C     STA $5C,X @ $005C = #$017 A4 d# [5 b$ M/ q2 k: i' Y3 ]
05:B394:C8        INY
/ |6 u% ]2 p  {05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$092 V' d: @  x8 A8 X
05:B397:95 5A     STA $5A,X @ $005A = #$00
3 Z) r3 [: u# \8 ]" \05:B399:C8        INY$ K, l# m; j1 U" y9 g. B2 w
05:B39A:98        TYA
  F4 W2 T8 W+ k( n. f5 A看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
! X8 w7 e3 _5 R* o+ U; E没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.  _  s8 V0 r* c2 }1 m
3.修改演示:9 }9 K! k* w, B- t% y8 l2 U
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
' X; {! b. i5 t) Q2 u+ [8 w- d    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
3 h! Y! _) \$ ~- h, _1 e打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
; Q6 C& }9 E$ `' F6 C" }: U% {05:B392:95 5C     STA $5C,X @ $005C = #$00& E( Q) S9 P: n! u5 z3 Z+ I4 j" J1 Q
05:B394:C8        INY, [; @1 U  R+ ~3 f: R/ ~4 }# }
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
* R% ?2 i& U/ ?$ x. b* P05:B397:95 5A     STA $5A,X @ $005A = #$00
1 Y, e0 u7 A5 `- \7 T05:B399:C8        INY' b( y' @- ?, S  t7 \
05:B39A:98        TYA9 Z" K& E$ T5 J" x7 c
我们上拉看到了:5 B9 i4 o. q8 ^" a( v
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
! M$ H/ l" x5 q' x05:B38E:C9 FF     CMP #$FF
* V7 R$ C& z7 y  I* x+ R05:B390:F0 3D     BEQ $B3CF2 J/ J" Y( R9 a$ G3 N! u9 ?  v3 y1 p
05:B392:95 5C     STA $5C,X @ $005C = #$00
. T- Y/ L3 U9 m% P05:B394:C8        INY  j1 [3 D) V: W  p
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00- d6 N2 C7 e% E% S" d1 W$ C* r
05:B397:95 5A     STA $5A,X @ $005A = #$00
, U$ A1 E" W2 w( E4 f' [05:B399:C8        INY6 I  i/ I. h" Q% p) w! _8 V: j
05:B39A:98        TYA& c0 ]' `; {* h
看到
1 d: c! w4 P6 z8 l- ~7 G4 G05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
# M% I: k* n( k$ e, W0 y& n没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
! u+ Y6 j, A3 f$ D* ]  k说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
& D# D7 E- O2 E05:B371:B5 5A     LDA $5A,X @ $005A = #$7F' }) s/ l# O* W9 n! H# Q
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)7 l: N+ b4 ]7 n9 R4 p8 U
05:B375:A5 30     LDA $0030 = #$00
8 @6 O( j- }5 Z9 K05:B377:0A        ASL4 @3 K/ S) c+ h( E- o5 i+ ?
05:B378:0A        ASL* n- u3 v/ m: b6 c) C$ q* N
05:B379:85 08     STA $0008 = #$29
7 C# C3 U: h+ q. N5 S/ s: i+ J05:B37B:8A        TXA
* ]" I! W& M/ I' k5 F05:B37C:0A        ASL
' W' g5 w, W' ^( H8 S$ Q05:B37D:65 08     ADC $0008 = #$29
% a4 W; S4 r( L! t, Q05:B37F:A8        TAY
& G2 L: J# F/ \' N4 ^* `05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4; B6 b8 U7 h* @8 D3 D' ]1 \' G
05:B383:85 08     STA $0008 = #$29
, m/ L1 N1 E. _8 H' J: `05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC& d. n# Q6 {* M# r3 U4 M+ G8 n# I
05:B388:85 09     STA $0009 = #$B2) n, s( u# j+ L; g  I& `$ |" j. X- W
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02: b  y5 `/ ]! l# @7 _) q. ]1 O0 b7 W+ h
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
) ~  q- l0 W/ a1 i& V9 v$ `05:B38E:C9 FF     CMP #$FF0 k+ J+ @6 h2 Z  w" `3 ~" O
05:B390:F0 3D     BEQ $B3CF2 R8 X+ J  m; `
05:B392:95 5C     STA $5C,X @ $005C = #$00$ n/ }3 k/ U1 f" d
05:B394:C8        INY) z/ @2 W& F, N
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10) b1 B5 ^- z: i/ W8 n
05:B397:95 5A     STA $5A,X @ $005A = #$7F
5 D( r2 |0 k4 v2 l6 a/ u05:B399:C8        INY
. M# r: A  `% l05:B39A:98        TYA
, L$ ]% n# Z4 i& e* P4 N/ `1 Z05:B39B:95 5E     STA $5E,X @ $005E = #$02
7 o7 m" W' Z& |' H05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)' \7 B# }; q5 t' U. ?: ~8 G' R
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00- A; e" ^, v0 {0 p3 f" D
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00* Z8 y* W- |& [% Z, U3 X. P
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$001 r5 x3 U% W0 w' `2 y

- r% \! B) X6 h$ W" Q, c( G$ i( m) _由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
' g5 w" U# _0 \3 k/ t可以下载玩一玩( R0 e& z, L5 F: T, A  Q
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
4 H! g0 E9 X. x' i1 g首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
6 b6 n: x0 x" c' G' b6 ~! q后来尝试其它修改,但是偶尔会造成花版或者死机。$ j' E/ x/ `2 c
深入研究,发现要以演示模式通关,需要做的事情还很多。. Q% H1 A; J4 _0 J3 t
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-10-29 21:39 , Processed in 1.077149 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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