EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 7 {7 O5 W. ?* j; p# z

( i! W$ x. |6 k- t" g9 p; Y4 s8 jFC自动演示修改教程
2 _) \# _1 L" G$ g作者:火焰烈旋风
. W; G7 m1 d. ?: Y8 B5 v/ K% c工具:FCEUX中文版(www.9553.cn搜FCEU即可)2 e- p( b* S# m4 W
1.找按键地址:8 k, |, l2 g: [; r- C9 I% z( o* A
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.! [3 c0 i% [' M% D( L5 I
2.找演示时按键的数据来源:' Z. @+ T: i% C2 K
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:: t6 h* X8 }3 l
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
8 a( \! u6 N" X( D/ V9 r2 O1 L* A07:C391:94 F9     STY $F9,X @ $00F9 = #$00
# x; N' e1 j' C+ G# K% K  n9 m07:C393:CA        DEX4 _) a: M0 j9 M# O! S7 @6 f# U/ M) L
07:C394:10 F0     BPL $C386/ w/ X4 w" o2 L
07:C396:60        RTS
, C4 F0 C! `6 v5 E# l9 }我们点击"运行"左边的上拉按钮上拉,看到如下指令:& }. N) q8 ^6 G' }
07:C378:A5 1D     LDA $001D = #$075 J! q* ?5 s' l6 _0 O6 R2 Q
07:C37A:29 04     AND #$04% K, \# _( t4 |3 W4 O; Q1 ~. B- Q
07:C37C:D0 06     BNE $C384
; @1 T0 l9 j! {  I1 H07:C37E:A5 04     LDA $0004 = #$00
3 m! B5 A+ F3 h* \07:C380:05 05     ORA $0005 = #$00% j- t& U8 |  H6 S
07:C382:85 04     STA $0004 = #$00
& i2 Q8 i, w( z: q  S! |2 t7 l07:C384:A2 01     LDX #$01
4 H2 H% s- G4 @% F7 d& D$ h07:C386:B5 04     LDA $04,X @ $0004 = #$00& V. Q! V/ {: p( E" ?% _
07:C388:A8        TAY
7 T! A/ [# z( U- w" }# ^/ n8 g" G2 L, n07:C389:55 F9     EOR $F9,X @ $00F9 = #$005 T8 ]$ O) d. H$ O
07:C38B:35 04     AND $04,X @ $0004 = #$00
7 R6 Z5 |( W$ `0 z9 B: ^, i07:C38D:95 F5     STA $F5,X @ $00F5 = #$00- |. J& Q9 X( ]
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
& c( Y4 t' n0 @3 T' y07:C391:94 F9     STY $F9,X @ $00F9 = #$00
- g: t6 y) Q4 f+ t07:C393:CA        DEX' O& a, H+ R" ]& L$ s
07:C394:10 F0     BPL $C386* P4 K& H# I; y  |4 P% Q& F
07:C396:60        RTS
2 R! m. i( p7 R3 Z' z3 u由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
) w) p0 E* ]2 \" d8 E2 h05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
, u7 H3 k/ c$ `; f05:B3A5:A5 2E     LDA $002E = #$C85 R& L, {6 \+ e" V  J4 N* Z
05:B3A7:C9 50     CMP #$50
! |. i2 E( r! d- u& [05:B3A9:90 20     BCC $B3CB; X( |* M) k- `3 L" W; r0 w
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
( ^0 K; \! [' `) X05:B3AD:29 0F     AND #$0F
3 Z: C  y  S. s! M05:B3AF:C9 01     CMP #$01/ u$ C  |6 s! N5 Z8 P
05:B3B1:F0 04     BEQ $B3B7
( {  C! o3 ]! F. m2 `05:B3B3:C9 04     CMP #$04
" @# w- N" ]7 t0 a8 }1 @9 i.........
- C( j5 K) n: M7 i, j% X* c我们点击"运行"左边的上拉按钮上拉,看到如下指令:
7 \6 m1 ^# x! A$ {4 x6 g9 F$ k4 X- ^05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
/ G2 A' f$ g( k/ F05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
+ m8 I! }. f7 u. N0 f05:B3A3:95 F1     STA $F1,X @ $00F1 = #$009 ]: J3 V% Q3 k& h: }
05:B3A5:A5 2E     LDA $002E = #$C8
! q9 V7 F# D, O  F" f- O05:B3A7:C9 50     CMP #$509 U  j, Y" ]1 \; m, K! A: |
05:B3A9:90 20     BCC $B3CB! b7 y( T$ H" V. @9 z) d
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
1 V' ]+ c: ]: I  w3 s9 t& x05:B3AD:29 0F     AND #$0F
6 r, M" h2 h* _' P0 ^, h看到
% L3 _0 i- f+ w0 E! D$ o* V( w05:B39F:B5 5C     LDA $5C,X @ $005C = #$01$ R# I& s$ z2 {
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
- u! \0 c2 U6 ^+ o% h05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
2 O$ T2 y/ a0 l6 G& C- ~5 t# r没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.$ ?0 G5 J/ U3 E/ c
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:% D" E9 L+ ?# u. M
05:B392:95 5C     STA $5C,X @ $005C = #$01- ?2 ^- `7 C7 V# P3 E( J
05:B394:C8        INY. I, z$ c! A: l% g
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
  K: Z, c4 k2 ?- K05:B397:95 5A     STA $5A,X @ $005A = #$00
; Q2 P. E5 O9 S8 o* F' G, a2 {9 M) _" X05:B399:C8        INY
+ s4 b' t: J& B1 i- `, S7 l05:B39A:98        TYA
7 |$ A; w3 V% g1 q) B然后我们再上拉,得到如下指令:8 i& W5 L0 s  \. u0 {. H
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$093 z  d% o- J" V+ O2 `9 p
05:B38E:C9 FF     CMP #$FF
4 v' ^6 S2 ^. d05:B390:F0 3D     BEQ $B3CF0 }. t# U& k4 l! L+ }
05:B392:95 5C     STA $5C,X @ $005C = #$01
2 t4 o. H' F/ b( ?0 r) t05:B394:C8        INY
4 _: f2 Z" g% [  ~5 ?4 Z05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
, G; ~. b4 C1 X/ I2 [" f# h/ T05:B397:95 5A     STA $5A,X @ $005A = #$00
& H# W9 |2 N" I3 v0 k* y+ c( z7 {05:B399:C8        INY/ b7 ~" a3 ?" y; U* J- }2 ^
05:B39A:98        TYA
5 j0 q0 V) J' H- J: Z3 s看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09# f% [, X- v$ I% a% H
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
: _- {6 x: ~* ^- M  ^; `) N- E3.修改演示:
" L! d! P9 M* @# o  [. h6 h    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
1 o# ]- \- K  W1 W" j- J    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:: A1 u& \. q6 v  G; D1 j
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
) ^: y7 [# Y; Z9 u- v05:B392:95 5C     STA $5C,X @ $005C = #$00
  G% R" S9 M" {1 k( @; V8 H05:B394:C8        INY
0 K, E. ~/ C) S05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
0 U$ H7 `% R) ^' E7 L3 q8 ?) ?8 Q05:B397:95 5A     STA $5A,X @ $005A = #$00- @+ W" {, {0 `$ H! B1 U. v6 L
05:B399:C8        INY
2 l1 b2 B$ C6 h* v, W$ z05:B39A:98        TYA/ [" L% t6 {: W" R( r/ `9 E
我们上拉看到了:
1 I( v6 ^# r* t' f4 o1 \05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
+ e' J  Q0 h5 b2 m2 P5 f) x& v05:B38E:C9 FF     CMP #$FF& v8 H  X+ ~. P
05:B390:F0 3D     BEQ $B3CF3 o* ]1 Z" G7 q. f; s' B/ g
05:B392:95 5C     STA $5C,X @ $005C = #$009 F% ~& P) ]- _; Y& p
05:B394:C8        INY- g/ M" O: {( }2 S
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
* `! ^( _; `9 K* }# Y0 \" e0 `05:B397:95 5A     STA $5A,X @ $005A = #$00' U$ [( {% Z, ~; h3 ^0 A
05:B399:C8        INY7 ^" c5 D- l: S( ^3 Q" {1 i
05:B39A:98        TYA" C3 C: B$ a- d( I
看到- Z  W$ O$ w! a2 j2 n3 J! g
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00+ D# P# K% ?+ g+ [
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
4 n% v- r! r* ^- K0 ?说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
1 z, n9 J/ Y" E8 q' C0 V" ?05:B371:B5 5A     LDA $5A,X @ $005A = #$7F: @* Z( A, W! C/ R4 L: M
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
1 I+ f% p' l7 z( R6 p! ~& m) @8 J05:B375:A5 30     LDA $0030 = #$00
: W  `6 _1 a" A- V05:B377:0A        ASL8 F% U4 z9 c. x4 J; Y
05:B378:0A        ASL! q; l  ^( F3 p0 {- {# N
05:B379:85 08     STA $0008 = #$29* I& a8 T, u6 s: P9 v
05:B37B:8A        TXA9 G- v, y: Y4 `9 k3 ^- T; {
05:B37C:0A        ASL- d' g0 m2 H  D7 w" y1 x' O4 ^4 H
05:B37D:65 08     ADC $0008 = #$29
" |  i, }! {& e: b# _05:B37F:A8        TAY
6 Y6 W! M6 l$ e8 J5 u; q05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4; Y# k, D$ V  g( M2 T
05:B383:85 08     STA $0008 = #$29' V+ a% B! w5 p; A5 R6 U
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC1 d. G9 j2 g5 {; j
05:B388:85 09     STA $0009 = #$B2- v' x1 s, V  o3 L
05:B38A:B4 5E     LDY $5E,X @ $005E = #$028 }: D% @  t" D  L( z+ s  G$ W
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10. h: }* [% b  V' O0 K4 Y
05:B38E:C9 FF     CMP #$FF
9 m- b! {, M2 D2 U9 g05:B390:F0 3D     BEQ $B3CF
* ]. O) @6 L) q2 F+ l% R" h05:B392:95 5C     STA $5C,X @ $005C = #$00
/ T3 N, O( R& n9 M1 [% L& Z05:B394:C8        INY7 U6 c2 ]) e+ W* Z: n1 W: j2 i- t
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
8 t: d  v5 f$ j2 d8 I8 \! v+ T05:B397:95 5A     STA $5A,X @ $005A = #$7F0 M1 l- o& L$ w, M$ [9 z
05:B399:C8        INY1 ?% r3 {2 k# U$ P. j
05:B39A:98        TYA
! M0 X7 @3 D* d7 D05:B39B:95 5E     STA $5E,X @ $005E = #$02
- X: t8 S* Q, D; ^& X" W' y05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)) t* P3 W& T8 ~
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
/ x5 p/ ]6 |$ R) }05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
2 V  _- w9 i* N! l8 T/ I05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00' y- H) Z' V$ u# o; {2 U/ `
1 V" g. l5 I; c* N9 P
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
1 e* U7 D$ T0 |1 V可以下载玩一玩" Y3 `' G" s, d3 X. m
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1246 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
( X  p+ G( [' ~0 \首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。: T9 w6 b" V- L  n. i
后来尝试其它修改,但是偶尔会造成花版或者死机。
* G9 J3 `& c- t4 Q. y% u$ K5 y; V深入研究,发现要以演示模式通关,需要做的事情还很多。
1 C8 k, g1 c+ _1 w! h. r因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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, 2024-5-20 09:40 , Processed in 1.093750 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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