EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑   M! }0 @9 P9 x% D7 `2 n! M/ l5 C
* y9 S1 |; n0 }6 H7 v8 [
FC自动演示修改教程; }" `6 l4 H- s2 m: P
作者:火焰烈旋风
0 ~& I2 @3 N. h2 `工具:FCEUX中文版(www.9553.cn搜FCEU即可)
& J/ y+ e; @1 K; R0 f7 C8 {& p1.找按键地址:
5 \1 O* u0 w6 R3 g3 B    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.. q3 |" o- \& ~
2.找演示时按键的数据来源:
- r: O0 @; F- c    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:- w# w# z3 `% G4 o4 e
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
1 ~3 W/ G3 n  G( a4 H, P07:C391:94 F9     STY $F9,X @ $00F9 = #$00
" g0 r4 z+ u4 O8 A07:C393:CA        DEX
; f7 X- U  @, s. I07:C394:10 F0     BPL $C386
" ]9 d: z2 Z/ Z7 `9 D8 x8 \4 {& @& \07:C396:60        RTS
8 \4 q' R! ^1 v1 C6 Y" z! ]8 A+ r2 W我们点击"运行"左边的上拉按钮上拉,看到如下指令:* F3 ?2 r' G4 O  K+ c3 e% H' z
07:C378:A5 1D     LDA $001D = #$07
* r( Q9 o' `( ]/ w0 v# T$ ?5 s07:C37A:29 04     AND #$049 {2 p9 R" ~7 w
07:C37C:D0 06     BNE $C384) q6 d# f5 ~! \% M: h: B4 M$ @* n# N/ I
07:C37E:A5 04     LDA $0004 = #$00
& }* S2 `0 k6 y% j0 K! t07:C380:05 05     ORA $0005 = #$000 I  `% g8 p* ?9 G
07:C382:85 04     STA $0004 = #$00  e. f6 I# |  d( ?1 t7 H: a( e
07:C384:A2 01     LDX #$01- A: ^, k* e5 z8 v
07:C386:B5 04     LDA $04,X @ $0004 = #$00' {& ^+ g# v/ s$ P1 x$ F3 O7 Q
07:C388:A8        TAY
/ z+ M4 g$ W* B! T" E3 x( S! g. X07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
" |* x6 y1 A' y07:C38B:35 04     AND $04,X @ $0004 = #$009 |% F6 {- s3 p1 i/ p) m6 @
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
# D% x2 Q0 J/ k2 ?% E07:C38F:94 F1     STY $F1,X @ $00F1 = #$01! h* q# T, d! T2 p$ J2 r
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
. W) L5 m8 h5 Y4 P( k07:C393:CA        DEX
9 r- G0 G) s( C- N07:C394:10 F0     BPL $C3860 F& [2 C- |2 Q  _
07:C396:60        RTS
. p' `/ y4 |, m由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:! J& V' B) T, n, S" c* o
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00$ t, f" J; _5 P, w+ g/ d7 c% a
05:B3A5:A5 2E     LDA $002E = #$C85 T2 b; O( e. P3 N3 Z% F3 p
05:B3A7:C9 50     CMP #$50* z. ^( W# _: {2 R- _/ ]! w: [; B
05:B3A9:90 20     BCC $B3CB. o* h1 C- ?5 Y7 K9 y! N5 \
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$001 b3 l4 {5 W, ?( K# {( Q' a
05:B3AD:29 0F     AND #$0F/ ?$ L6 M" S% c9 b" }# a. [: E
05:B3AF:C9 01     CMP #$01" \9 a, l9 K9 [/ m- x# b- {
05:B3B1:F0 04     BEQ $B3B7, M! w% W) a1 C4 H7 Y/ w' m5 X
05:B3B3:C9 04     CMP #$04
) G5 T: `  v7 a7 W6 C.........; m+ P% T' O; C) Q5 y/ n5 s
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
! X! k5 R) T- g' C05:B39F:B5 5C     LDA $5C,X @ $005C = #$01/ F  c2 H3 B4 L  l- y# M2 @
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$017 S3 V- F. p0 g* c4 C
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
" l  H5 W2 T& k1 h' O. r- ~6 H05:B3A5:A5 2E     LDA $002E = #$C8
1 X( p1 y* h  c- v05:B3A7:C9 50     CMP #$50" j/ ]; s5 x9 i" ]0 {$ _1 I& i
05:B3A9:90 20     BCC $B3CB, c7 }% f; q( [; c
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
( H" t/ T, v% X9 i; A7 j: y" W( M05:B3AD:29 0F     AND #$0F* y  Q1 {1 d7 W3 U( B
看到
2 D7 P8 ^8 s  T  T, P05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
- z2 q! r# Q7 D" [0 `  ]05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01! G% h  p. `0 q' L+ R
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
5 t! K/ ]* y* y. S( |8 k" m2 q6 L1 F没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.( J1 C4 A, _+ Q$ e# f% [6 c5 R
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
1 \4 S7 o* b& l) D05:B392:95 5C     STA $5C,X @ $005C = #$01
, k( F8 B. a2 |6 E% u05:B394:C8        INY
- R8 Z5 b, U* G6 X( ~( {3 X2 }05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
3 v6 S3 M& [& O- C% L- ~5 a: D05:B397:95 5A     STA $5A,X @ $005A = #$00
. h# e. k# Y" X. z05:B399:C8        INY# a" Z# B. H# ]. d) `8 r
05:B39A:98        TYA
) p5 t! }+ w4 _% M" W然后我们再上拉,得到如下指令:
8 u! i1 I) ?+ _0 |05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
; i0 F- q% H+ Z# ?: @! B6 }05:B38E:C9 FF     CMP #$FF
2 `4 W2 I' w. i6 E5 B3 w2 w- ^05:B390:F0 3D     BEQ $B3CF0 r. A1 N$ N# ^) d& O, _& q: _' Y
05:B392:95 5C     STA $5C,X @ $005C = #$01
, }# O! Z! ^% e8 x. H05:B394:C8        INY- {) L( V& d3 E8 W) p2 x, s
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
/ ~& D- I/ c3 s; H: h6 c6 x05:B397:95 5A     STA $5A,X @ $005A = #$00( }6 N% T4 J4 ]! g. S; _) h3 a& }/ P
05:B399:C8        INY
  d1 q' ^' x6 D2 ~2 H05:B39A:98        TYA
8 e1 t9 k( h; E/ S! \' i2 R2 W( b, [看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
7 C+ V; y0 @6 M9 g没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
! D) v; N" @5 T, p0 h, \3.修改演示:0 K+ r3 v9 F6 F. \. l: {
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.9 K$ X2 K: {. o' a, E- g# A& ~# d
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
4 M; X5 `' c  `2 q! A, |8 P/ H打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:( T; F( g. p: M! X: }
05:B392:95 5C     STA $5C,X @ $005C = #$006 h0 V- Q" F! W2 g; \0 n
05:B394:C8        INY5 y9 x4 j5 \/ `5 s' }
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
3 P1 S% I$ \* a: D% X05:B397:95 5A     STA $5A,X @ $005A = #$00
# ^' g* b$ K1 G% w05:B399:C8        INY+ ^+ ~7 B/ e0 T4 Y
05:B39A:98        TYA
/ D& b6 B0 c' ~/ s6 u$ |我们上拉看到了:
, i3 b" ?  D+ k! x( B05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$007 O7 c# U; U' S1 B8 g2 F8 g
05:B38E:C9 FF     CMP #$FF& H/ }& h% C/ @1 z& F6 l# C  t
05:B390:F0 3D     BEQ $B3CF
+ Z: y$ [7 W& S* N6 P) B8 t0 t0 h6 f+ ~  q05:B392:95 5C     STA $5C,X @ $005C = #$00
! r: |# }& s$ R# Y05:B394:C8        INY* h* S( W: M- {) j% L8 G- A! s
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
( f0 T2 h7 J" W  g$ i- Q$ f05:B397:95 5A     STA $5A,X @ $005A = #$00
/ W) j5 i( ]$ g  O05:B399:C8        INY4 e1 B3 D, W9 j+ i" B5 [
05:B39A:98        TYA5 B. Q5 i2 c9 F! x$ o4 T
看到  Q5 M9 g, n7 e; \0 L3 d% d
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
1 e+ c/ a7 q# S9 i2 a0 U+ H没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
! q) |: I; x3 ~  @说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
; f4 |- C0 z+ K05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
: V/ I7 ]" @+ Y- t' B1 q05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
% Y4 X# v2 Q% R+ ^2 @0 a05:B375:A5 30     LDA $0030 = #$00
+ u: j5 n0 z5 K! C05:B377:0A        ASL7 Y* r# c6 H# W+ k
05:B378:0A        ASL
) ]" C/ D, ~  j* z% l- `  i05:B379:85 08     STA $0008 = #$29
6 a2 X. M# l' r- l- ?  I05:B37B:8A        TXA9 n( p9 `# o9 t) p; U7 f. \
05:B37C:0A        ASL
2 ^! ?" M& a2 [. y+ Y" h. ^' t1 i05:B37D:65 08     ADC $0008 = #$29
  t. U3 Z, @  @2 |' j" A$ K5 H4 V05:B37F:A8        TAY6 p' @2 C* s, N) p) \& S
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4# z, }4 t  S. I5 O/ a  b3 f
05:B383:85 08     STA $0008 = #$29
7 b, g/ w" |+ l% n4 d# P05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC: j! h7 V* E2 z+ K: h  J" z
05:B388:85 09     STA $0009 = #$B2- ?& V; J6 Q$ {- _7 v( X( J
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02! }: t8 h' h& {( p% w5 K) Z6 Z
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
, j' w9 q! I- i- m" Q* L; Q05:B38E:C9 FF     CMP #$FF
- Q2 X, w" j" Q/ \* u( Y0 {05:B390:F0 3D     BEQ $B3CF
6 J7 k6 ]$ O) k' M7 b05:B392:95 5C     STA $5C,X @ $005C = #$00
* p+ r' a: @& O6 V* C05:B394:C8        INY
1 g' S2 n9 E' J3 I05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
2 q% q0 q6 C6 M1 K" k05:B397:95 5A     STA $5A,X @ $005A = #$7F7 w5 P2 }% T. |
05:B399:C8        INY
+ Y  n4 Q7 c- y05:B39A:98        TYA2 `0 h! |0 C  B2 M2 c
05:B39B:95 5E     STA $5E,X @ $005E = #$02
- ?( i" t# L1 e05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减); P) U+ P* S! K( L  A: \3 f
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00+ J! g! w* W1 _
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
1 H) L* }2 ]# b8 Q05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
4 k# E) Z4 d5 n  y
, d1 J7 `% M+ x6 }9 i: ]+ J由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了9 S4 z7 i- U* I: |4 b* u
可以下载玩一玩1 y$ d' ]: F( t- b% C- B; H
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
: u) d; Y3 e5 `& }首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
6 u( l# P( @9 V; k- {' j后来尝试其它修改,但是偶尔会造成花版或者死机。
  t4 ~: h: p6 D" N9 W深入研究,发现要以演示模式通关,需要做的事情还很多。% k7 q& y9 @& T8 Q3 s* z. K. v- h+ 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, 2025-8-25 19:11 , Processed in 1.091797 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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