EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 # e2 h+ ]7 B' x
  i' r" O% P, W* n3 L2 U: G* B
FC自动演示修改教程( c" p9 q2 E9 c
作者:火焰烈旋风7 C' P% o* l2 D' e4 N; r
工具:FCEUX中文版(www.9553.cn搜FCEU即可)6 _: ?  ^; U! U% T( [( U
1.找按键地址:" }3 v$ ?( G4 h  ?: _$ r
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
2 c0 B7 c$ S6 Q+ @2.找演示时按键的数据来源:
) i# f) d% q- ~8 F6 W: P    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:; z0 m  @, a$ B8 n
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
: k7 l2 f+ G5 ~- S07:C391:94 F9     STY $F9,X @ $00F9 = #$006 W1 @( Q1 U+ W" M* T! p
07:C393:CA        DEX
( Y" a5 J9 E  y+ Q' Z. x4 E07:C394:10 F0     BPL $C386
- v& m1 d$ V- R1 h, J07:C396:60        RTS
$ x. Q& U8 g8 j我们点击"运行"左边的上拉按钮上拉,看到如下指令:1 S  P+ ^7 Z3 ^
07:C378:A5 1D     LDA $001D = #$07' Q3 H, h2 Q0 C( W4 N- @& L0 F
07:C37A:29 04     AND #$04+ l5 s& Q% J' Y3 w& q: N
07:C37C:D0 06     BNE $C384
5 r1 y" ~3 l* _. o07:C37E:A5 04     LDA $0004 = #$00
2 k0 u/ C% `- k( x! c07:C380:05 05     ORA $0005 = #$00" h# e1 M( r0 m4 Q! O# D
07:C382:85 04     STA $0004 = #$00
. A# k, ^9 V5 |9 _* s/ }. }07:C384:A2 01     LDX #$01
- Y$ y/ C: ~2 c- @/ X+ L- ]2 u7 w. O07:C386:B5 04     LDA $04,X @ $0004 = #$00
, p1 y! I6 R/ ~( u) A07:C388:A8        TAY$ x: q+ m+ ^  [, W
07:C389:55 F9     EOR $F9,X @ $00F9 = #$005 E. j  I" ?3 `+ Q6 ^5 P" ~& s
07:C38B:35 04     AND $04,X @ $0004 = #$00% H4 i' B$ ?+ i, O
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00+ B& l9 _& ~2 a7 h5 u2 K9 ]
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
1 I% H2 m' l. d( B07:C391:94 F9     STY $F9,X @ $00F9 = #$00$ \% K$ j9 D/ M3 n: M8 u
07:C393:CA        DEX
# V1 p+ Z9 x, j4 C07:C394:10 F0     BPL $C386
2 Z6 u0 i7 b' n5 i# k* R) t07:C396:60        RTS+ k4 m7 t$ U7 H& L
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
) @8 _' b: `( I% R+ F: D05:B3A3:95 F1     STA $F1,X @ $00F1 = #$002 Y2 z0 k" E1 d
05:B3A5:A5 2E     LDA $002E = #$C82 n2 @( m6 e9 j% i* i
05:B3A7:C9 50     CMP #$50
; |$ b* ?2 O: g" l) ]& ~05:B3A9:90 20     BCC $B3CB
7 {- I+ @5 O+ }7 \! i7 G; L05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00  R7 l; R! a# D: D$ p% h
05:B3AD:29 0F     AND #$0F0 c- `$ C- V% a/ {
05:B3AF:C9 01     CMP #$012 J7 ~- m$ v  ^( b
05:B3B1:F0 04     BEQ $B3B7
: c* P+ a& d( h# Z05:B3B3:C9 04     CMP #$04
# z# j) B7 D, v.........# }, W$ b$ ~( |# p- A$ ?( H
我们点击"运行"左边的上拉按钮上拉,看到如下指令:" \% E/ [2 G8 H
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01- v: D8 _- H" Q( s( _2 P
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
5 t/ ^% B- M. b" Q05:B3A3:95 F1     STA $F1,X @ $00F1 = #$006 u( ?" x( ~: G
05:B3A5:A5 2E     LDA $002E = #$C8' b% v, c# Y7 ^) @
05:B3A7:C9 50     CMP #$50
$ Q# m" X0 g9 J1 Q/ I05:B3A9:90 20     BCC $B3CB$ F! K3 p. e0 w+ W# k3 s- m
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$009 A, A. ?( r, F  j. A
05:B3AD:29 0F     AND #$0F
! u9 r6 k# T3 C看到& R: H4 a$ A) V3 \, y  U
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
# g0 ^) P/ ^* a0 f05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
, c- h8 X7 P; D3 H& P0 v05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00! Y6 A% D) i' _  g. s, q. N
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
1 x' \4 }* B& C    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
4 w0 ]0 \- F) w* R+ T: v; t8 ?05:B392:95 5C     STA $5C,X @ $005C = #$017 I/ e2 A2 A+ ^* q/ a# Z
05:B394:C8        INY
, ^1 m4 p; d7 Y7 b) y3 P6 S! ~05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09+ \& j- t  d9 N5 T# z( n2 h
05:B397:95 5A     STA $5A,X @ $005A = #$00
$ t" ]* g  J: t- k8 L, K5 A05:B399:C8        INY
, u8 N9 C3 F/ K# B- e05:B39A:98        TYA6 r) a0 W+ Q) O
然后我们再上拉,得到如下指令:7 c1 [& W9 q; B5 q
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$094 ?8 k* l) x6 e0 ]
05:B38E:C9 FF     CMP #$FF
2 w  ]* l9 b( Y; O1 U: {05:B390:F0 3D     BEQ $B3CF
/ i/ O/ N) s) P- T8 O% z  u9 r05:B392:95 5C     STA $5C,X @ $005C = #$01
: D3 K& s- Y( }9 C% x4 I05:B394:C8        INY
% e9 J9 x1 P$ ^5 O/ K1 \05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
# k/ S. P+ o0 P( k% c  m05:B397:95 5A     STA $5A,X @ $005A = #$00
6 }) |2 ?" E2 S7 p" y+ k05:B399:C8        INY% X) P- ^4 W, [: p
05:B39A:98        TYA! c4 I" j  U6 L- n: m, F) l3 y$ c
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$092 A  b4 \7 c5 K/ ~
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.  _. F& X, ]( R* Q" X; d4 o% s* @# s
3.修改演示:; v+ Y( r1 ?- K. ^% d  b2 d
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
+ T0 r; o% A) \4 x* g0 N    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:/ K$ s2 b5 k8 ~$ u
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
: ^# E; a# s1 q( a: `* z2 |05:B392:95 5C     STA $5C,X @ $005C = #$00' m' Y8 q9 E* J. L+ [
05:B394:C8        INY* i5 r$ a7 w1 u( U- W
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
  x7 e7 I6 J% P3 I3 O05:B397:95 5A     STA $5A,X @ $005A = #$00
- v+ \; y# m, P3 `; o% T05:B399:C8        INY
% l  f% E+ i! V. b# V& d05:B39A:98        TYA& M2 e8 g* z3 \8 ^. |1 T/ U
我们上拉看到了:  X2 s# L+ {: d/ f; o1 t
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00: m6 U# i/ q! A8 x9 u/ x, v
05:B38E:C9 FF     CMP #$FF) M  v3 d7 C2 }6 u
05:B390:F0 3D     BEQ $B3CF* Y4 I* g: N3 f% Z( b, H4 u5 L
05:B392:95 5C     STA $5C,X @ $005C = #$00
/ @$ K/ E, t* |7 {" K0 y05:B394:C8        INY4 ~9 ]" o2 K2 o1 o: i. W1 e0 Z
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
* B. E1 b7 `; G% j1 O05:B397:95 5A     STA $5A,X @ $005A = #$00
# z/ h4 W- I# X/ N05:B399:C8        INY' z' @4 j4 H) q
05:B39A:98        TYA
8 i% i- z! H$ x看到
. j* K. g0 P  z0 p6 W5 Z" p4 Q( E: m05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
# J: H. D& L) J% O没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
5 T' @+ r7 B- J$ ?# t说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
9 t' a6 X, m" R% }" U( E05:B371:B5 5A     LDA $5A,X @ $005A = #$7F; |: h2 h3 {7 [& f  n
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
9 p: J% X0 Q+ J& ^2 `05:B375:A5 30     LDA $0030 = #$00
7 v! p6 D' T& W! o/ ~05:B377:0A        ASL+ V/ V0 q' B; B" Z# n! s
05:B378:0A        ASL
2 j/ ]* W$ }  e6 P05:B379:85 08     STA $0008 = #$29
, y7 U* u- N: n$ }8 w6 E05:B37B:8A        TXA
' p. v9 `7 Z" _4 b05:B37C:0A        ASL
/ i& C6 x+ U' C* }2 K% Q  u05:B37D:65 08     ADC $0008 = #$290 x2 w& {" y- X. s5 ]
05:B37F:A8        TAY
  F8 y. K6 @6 h) `05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
% D& V5 k7 @( Y* M" C; m8 q% [05:B383:85 08     STA $0008 = #$29
% t: w1 p2 i8 k3 e- ?6 G0 y6 U05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
2 t) a1 a0 N( r" ~4 k5 N3 F05:B388:85 09     STA $0009 = #$B2& K# H, T8 n) E2 I2 {- v( F
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
% R) Y) M, z/ V* R2 u1 `0 h05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10  k! F6 g3 s+ ^$ X) |4 Q
05:B38E:C9 FF     CMP #$FF5 K% C* a: J* |. s3 F) _9 s
05:B390:F0 3D     BEQ $B3CF
, C; t. `- N6 O) Y05:B392:95 5C     STA $5C,X @ $005C = #$00
4 F& Z( K2 X4 q0 \/ @05:B394:C8        INY
! C$ Z( {. S8 }. N% _8 {05:B395:B1 08     LDA ($08),Y @ $B22E = #$107 n. z1 v0 O! X- h5 k
05:B397:95 5A     STA $5A,X @ $005A = #$7F' w1 l5 ^# x0 _! Q8 V. y
05:B399:C8        INY
& C( p1 m( ?2 n- N% _! ~$ w05:B39A:98        TYA# e$ w6 N+ f5 _. z
05:B39B:95 5E     STA $5E,X @ $005E = #$02' ], O" a3 r$ Z) b9 ]& S
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
3 [1 q6 c8 y/ N/ J4 w1 Z, @05:B39F:B5 5C     LDA $5C,X @ $005C = #$00- x4 D5 A$ n; d9 g+ k) d
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
* N7 B; B) A6 f  _% z3 x05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
. O) g, e& ]: A; g: F
$ N, D3 C) [9 k$ Y( l  I由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
& _" U  I8 G* X' S. Q可以下载玩一玩. v' w: h3 |( n3 I& y$ W
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1311 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
. M0 v* _7 u' ~1 r首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。. H  X& B5 D4 w/ h, Y# Y
后来尝试其它修改,但是偶尔会造成花版或者死机。
, l7 ~- X/ Z! E/ V深入研究,发现要以演示模式通关,需要做的事情还很多。5 ~, _* Y' @+ W& y) b- D! ?
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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, 2026-1-13 18:17 , Processed in 1.107422 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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