EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
3 d4 ?' M8 ^* F2 k9 f; l4 N( H2 E
6 t% W  e* P# L& \2 iFC自动演示修改教程
" t- j. D, V3 W/ l) @作者:火焰烈旋风
$ X: P4 i( z4 q" c工具:FCEUX中文版(www.9553.cn搜FCEU即可)( ?, u6 ^! t$ Y" Y/ w9 c0 Q2 L
1.找按键地址:/ o9 O8 Q) M; `
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
% D/ b) Y' p0 u' e, ?, ^/ R2.找演示时按键的数据来源:
) X2 j" s) @% K; X& c2 H    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
1 O& S# `6 x+ [& n1 _1 A& }07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
2 x/ f1 F' q" r8 A& W, w07:C391:94 F9     STY $F9,X @ $00F9 = #$00' m! L: I& v  A8 W6 E4 _+ l
07:C393:CA        DEX
9 D2 u1 |, q# s* n# I07:C394:10 F0     BPL $C386& C0 ?, h- ~# m6 L; L1 V
07:C396:60        RTS
) o* E- B" c5 m1 ~$ H* {我们点击"运行"左边的上拉按钮上拉,看到如下指令:* i, }, x$ O8 Y! h" m2 m
07:C378:A5 1D     LDA $001D = #$07
5 p7 d/ b. K; e* s; J5 K* z07:C37A:29 04     AND #$04
" ?4 c  s: d. l* G* B6 R07:C37C:D0 06     BNE $C384
8 \  ]$ s, m) u# j$ _07:C37E:A5 04     LDA $0004 = #$00
* X. ^6 I8 n4 u/ g* u# f- ~  R4 \4 d07:C380:05 05     ORA $0005 = #$00# q. i6 r) u8 M$ J
07:C382:85 04     STA $0004 = #$00
2 _8 s2 Z$ Z1 O" Y07:C384:A2 01     LDX #$01
  F: K: v$ T; H# g3 s07:C386:B5 04     LDA $04,X @ $0004 = #$00
' F( F2 T& p3 W$ P07:C388:A8        TAY9 J4 f' r7 Z; R5 @/ V( h% Z
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00! q  C. G9 v0 u& w' v: H8 v
07:C38B:35 04     AND $04,X @ $0004 = #$00
* L- Z: m5 Q% A8 M0 r5 |07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
4 k, @- _2 `( P- M07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
3 `2 Z# N/ Y) q3 I2 ], F07:C391:94 F9     STY $F9,X @ $00F9 = #$00
& t; D  }! B# ^. i; r07:C393:CA        DEX
7 x. G0 M/ Z' T" n% T0 I6 d07:C394:10 F0     BPL $C386) T7 s8 |$ W: q9 u
07:C396:60        RTS# B+ x2 E& B7 S( E( f
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:  s& d4 K- H" u& r3 x' l
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00) ?, t9 k) s. T, F5 M7 @
05:B3A5:A5 2E     LDA $002E = #$C8
6 ]# h9 z, a5 P/ v! I3 X( {/ t" f05:B3A7:C9 50     CMP #$50
4 D6 t9 d/ ^% v4 `7 Q0 H05:B3A9:90 20     BCC $B3CB+ Z5 o/ G  B( c0 j+ G
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
$ e# R  o% a( l8 G+ g# O6 S5 H- d05:B3AD:29 0F     AND #$0F6 o2 a" N3 H1 m7 _& I
05:B3AF:C9 01     CMP #$01
* @# |7 I7 O& Z05:B3B1:F0 04     BEQ $B3B7
8 Y5 |8 A0 h+ \# r. w5 B! H05:B3B3:C9 04     CMP #$040 U5 r+ V* C' t) a+ K
.........
6 L6 `" h+ B: U: o1 _4 Y- ]/ s我们点击"运行"左边的上拉按钮上拉,看到如下指令:
5 s# ^/ t2 P4 G- |05:B39F:B5 5C     LDA $5C,X @ $005C = #$01) J2 L9 L6 W0 w$ R( y1 M7 L; M
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01" ~' |* W* U4 I  _8 Z. J
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$005 C2 Y6 k" B& j7 b" h0 W
05:B3A5:A5 2E     LDA $002E = #$C8
6 t1 g# ?8 E' t2 u05:B3A7:C9 50     CMP #$50, x& H6 l0 M! H, z* ]( V; b
05:B3A9:90 20     BCC $B3CB
$ A+ v, z6 j+ ?7 r/ y05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
0 K2 {# A$ ]5 T5 b& q9 {05:B3AD:29 0F     AND #$0F
. J& B9 [* }6 Z6 ?. K: t看到* E+ B! x+ o; h; i& ?% D
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
: R& n1 F7 D& Y05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
$ X1 V% n/ J7 u  M4 K05:B3A3:95 F1     STA $F1,X @ $00F1 = #$003 Q9 q; O5 q9 e
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.. ~5 j4 p' ?  |" @+ N# I
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
) ~$ b1 @$ w! c; @7 m0 m- ^* M- }05:B392:95 5C     STA $5C,X @ $005C = #$01
/ [: Q; s1 V! K& o& m, B05:B394:C8        INY
0 l. E# E8 \7 G5 \# Q! k0 f1 [05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
  g( h8 E# R9 |! N- p8 m05:B397:95 5A     STA $5A,X @ $005A = #$00! h! m: @5 y6 v/ s2 _9 g
05:B399:C8        INY
& v/ Z6 G. l4 b) r: S8 [4 q05:B39A:98        TYA' S+ Q5 z* ]  [) s* a; f% I% s) I
然后我们再上拉,得到如下指令:
/ b! N! B& d. c+ Y05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09. \' E- V1 O* Q3 S# K' ?
05:B38E:C9 FF     CMP #$FF
8 n6 o/ V# p" T! ~( k2 ?2 t, _1 E05:B390:F0 3D     BEQ $B3CF0 S2 _+ I% N5 z/ Y& W! b, E: t
05:B392:95 5C     STA $5C,X @ $005C = #$01
5 f" W1 n8 }/ x/ k: B5 _- J) N05:B394:C8        INY% h% |' V" z& X
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09' E! G- h# }- p& _/ y  r
05:B397:95 5A     STA $5A,X @ $005A = #$00
+ y  E0 R# b( u4 _' i05:B399:C8        INY
! ~% H4 i$ i9 l$ D7 s9 e: n05:B39A:98        TYA
- V$ O0 I3 ?7 o8 F1 B, Z+ ]看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
+ z/ }  ]/ `1 P* S没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
0 L; S& Y" ], n4 ^, ~1 ]3.修改演示:
% [- x. Y. E! T  ~/ M- b) A    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了." \5 |- @. m- x" C" p; `
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
( l) R0 E5 Z- R4 ]6 ], |7 C; j打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
  j) b9 r! R' @3 w05:B392:95 5C     STA $5C,X @ $005C = #$00  ~# A& S6 u' m; N2 u  i9 N1 W
05:B394:C8        INY
% M& A7 k0 V9 `6 X05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
! }1 s9 g( o, H0 h2 k& S+ r- j05:B397:95 5A     STA $5A,X @ $005A = #$00
2 m( _6 L' e, J+ J  s! v  l05:B399:C8        INY
) I) G' B) Z8 y8 o& l05:B39A:98        TYA, U3 K( d' ^; T$ S# G
我们上拉看到了:- N) {; L$ j1 O0 h1 m5 L
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
) P( L. S: i7 D; w1 q* e6 j05:B38E:C9 FF     CMP #$FF
" H) ^4 `1 f  s05:B390:F0 3D     BEQ $B3CF  ]6 x3 u  R9 D# R: k# y
05:B392:95 5C     STA $5C,X @ $005C = #$00
8 S5 b1 u# U% x5 l# m05:B394:C8        INY0 L: z8 ]4 V2 r8 k9 |4 m; m# ^
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00( }3 i( v7 G$ U: A; S6 \
05:B397:95 5A     STA $5A,X @ $005A = #$00% k8 X" R% z( A6 Z: A
05:B399:C8        INY, R! l5 k+ }2 X% c4 b0 Z
05:B39A:98        TYA
6 H8 ?+ C& P$ I8 K2 |看到4 s) D6 R6 L; P+ H; R9 q
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
8 a" p5 w+ |0 j# j* g0 b, N. h没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
/ H0 E( x$ m5 }: B9 q5 G5 H说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
5 }1 B/ ]5 b( L' }( R+ K7 b05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
) X4 }3 h; o2 y" U05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
6 R5 k' I4 {" i* E05:B375:A5 30     LDA $0030 = #$009 n* Q1 ^) z5 U  V: D
05:B377:0A        ASL+ b5 r7 R6 X0 C: t
05:B378:0A        ASL2 p6 ?! \$ s; {& H( ?& o9 z
05:B379:85 08     STA $0008 = #$29
6 u, z$ g0 x* u7 F% T8 u" W% j05:B37B:8A        TXA; d' U% o9 C1 A: G3 O6 |% m+ c! K, l
05:B37C:0A        ASL
0 |6 ?- a' `8 f$ G  @. }05:B37D:65 08     ADC $0008 = #$29, L9 Y& G/ G) G' E
05:B37F:A8        TAY
+ G4 [. x$ ?5 [- U# N" ?4 P05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
& B7 Q( x6 t0 m! Z1 y" `* W/ F, @& o; e05:B383:85 08     STA $0008 = #$293 k; o7 c# n3 g: ^% ~
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC! ~( h* k# f8 [+ X
05:B388:85 09     STA $0009 = #$B2' }4 G1 ~, ?- C2 M1 E* m
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
; N4 Q& ^$ T5 y0 ]1 P  e3 G# l' X05:B38C:B1 08     LDA ($08),Y @ $B22E = #$104 p. [) ]& v% @
05:B38E:C9 FF     CMP #$FF$ U% l) R" X$ k9 w1 ?
05:B390:F0 3D     BEQ $B3CF1 u1 a4 k, Z5 e* A  r/ H/ S" M
05:B392:95 5C     STA $5C,X @ $005C = #$00( k9 N' r) E- n! d$ c# i. [( S( q
05:B394:C8        INY
) |! U$ I# y; B( k2 O. D( i4 d! M4 q% C05:B395:B1 08     LDA ($08),Y @ $B22E = #$104 i% |4 Z9 O; h9 r' v' T
05:B397:95 5A     STA $5A,X @ $005A = #$7F
# g  }  i$ p9 X) w9 k05:B399:C8        INY, i7 b4 B- h& C$ O3 Q; j6 Z
05:B39A:98        TYA$ a- b5 y: m4 o6 D0 W( G* X
05:B39B:95 5E     STA $5E,X @ $005E = #$02) A% i1 t1 f8 C) W9 G' |
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
! ]: g0 x0 |. j05:B39F:B5 5C     LDA $5C,X @ $005C = #$00. B" C( F% b4 |2 c
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00' a3 g: J1 z, ]; ^2 A
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00- D" ^; B2 a8 f; D

' [& A& X% I/ u+ ~% H. K5 S由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
: w+ b9 c4 X  e8 d1 o可以下载玩一玩0 ~+ Z( q  x3 w) K, J' r' X
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。; ^3 d8 w3 d5 t9 N% H# Z9 p
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
$ g3 s8 O1 v7 W+ z0 }" ~9 X2 [后来尝试其它修改,但是偶尔会造成花版或者死机。
- {, I/ y  B6 X- T深入研究,发现要以演示模式通关,需要做的事情还很多。
$ C/ L7 W6 L8 b3 h因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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 12:35 , Processed in 1.110351 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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