设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 6 }! k4 i) N4 H1 g! m* B, z

+ [, m3 t/ u  xFC自动演示修改教程
/ \1 @4 m3 `( N6 }+ {- w作者:火焰烈旋风
6 D  w# S$ l8 ^- T; a工具:FCEUX中文版(www.9553.cn搜FCEU即可)
7 z1 ?6 x) x: |  K1.找按键地址:5 y0 a7 g1 b$ `# T( {
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
* l6 u8 P% @3 P, U6 E  ]2.找演示时按键的数据来源:0 G3 R0 ~5 I0 K+ _
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
; P- G1 b/ E2 T8 K- {07:C38F:94 F1     STY $F1,X @ $00F1 = #$01* q* X" g+ S/ b0 Q$ _7 K+ _
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
6 y# H9 {9 b, e) c, u/ z) F07:C393:CA        DEX
8 [* Z- f6 q( G; v07:C394:10 F0     BPL $C386- J" r% c: R& {8 D. k
07:C396:60        RTS
8 i! M9 D! m& K+ y我们点击"运行"左边的上拉按钮上拉,看到如下指令:5 g9 ?' a0 D  z' ~! ]6 q
07:C378:A5 1D     LDA $001D = #$07
# G; M, b) E# H( b: t07:C37A:29 04     AND #$04
! ?# n) n+ f( K: w) R07:C37C:D0 06     BNE $C384; k/ m4 O& ~  Y3 \7 M
07:C37E:A5 04     LDA $0004 = #$00% O4 `7 C1 G' N8 E
07:C380:05 05     ORA $0005 = #$00: N+ t, }# `* C: h1 F8 t3 n: {; m
07:C382:85 04     STA $0004 = #$006 t; ^: b! R: E$ ], j
07:C384:A2 01     LDX #$01
8 A! u# M) f! j* \5 L/ q& z07:C386:B5 04     LDA $04,X @ $0004 = #$00
* y, w  e" v. ^07:C388:A8        TAY4 {8 Q. J% @# \( V) h: I3 ~
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
7 O1 m& k* d! p& I5 o07:C38B:35 04     AND $04,X @ $0004 = #$00* R% _7 [) S8 v0 a
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
# [! l4 D$ e9 ~07:C38F:94 F1     STY $F1,X @ $00F1 = #$01: Q  x0 _1 K3 A) m' N  D
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
( }0 i. o) F" Y! ]3 d0 q07:C393:CA        DEX
/ |7 Y2 M5 g' }0 U07:C394:10 F0     BPL $C386
2 T: o! g, |) T% p9 L4 _% b7 b07:C396:60        RTS
+ t' _' `0 _9 Y$ h, K由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:9 _7 ^7 z  j5 t6 S8 ?5 ?: M
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
4 q  \: z8 y% X$ D0 Q! Q: U05:B3A5:A5 2E     LDA $002E = #$C8! [" W7 \4 x7 h9 a1 \1 ]
05:B3A7:C9 50     CMP #$508 L3 \8 @6 |9 P. w& S2 [: R
05:B3A9:90 20     BCC $B3CB2 e" V9 C0 [0 f' J( t# k, B) s
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00' {4 i% N8 s* o
05:B3AD:29 0F     AND #$0F
) s' _* [6 v7 t4 q) O05:B3AF:C9 01     CMP #$010 G8 R, R% @+ ]/ o; n9 N- ^. S
05:B3B1:F0 04     BEQ $B3B7
+ E" O) G9 o8 j05:B3B3:C9 04     CMP #$04$ R' H, p' m5 X9 Y/ h
.........' \: e$ w% J* ?5 c9 t
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
; o+ J4 W& w2 f, X3 c05:B39F:B5 5C     LDA $5C,X @ $005C = #$01  V% p" x- L1 Y( n
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
7 k* i5 l# X4 ~4 a/ a/ p5 N! l05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
- y; c8 b6 a! a3 ?, {1 [05:B3A5:A5 2E     LDA $002E = #$C8: ]8 n* J; E9 P( K8 N
05:B3A7:C9 50     CMP #$50
4 C( Z( U: J4 Q# B05:B3A9:90 20     BCC $B3CB4 {3 E/ O& p4 H
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00' q; U5 Q/ M. D( I# {
05:B3AD:29 0F     AND #$0F4 Z* S# R7 E( q* _7 j
看到
% M1 q) ]: ]  |) {& m05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
; C7 `/ i' `: w4 d1 y, j7 P* a05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
5 U$ s, x6 I3 R8 P. E. N05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
0 }" p! z+ Q3 |" y" M+ ^没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
; ]6 E5 Q4 ~9 [. L    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:  @: H3 D  K9 U9 x
05:B392:95 5C     STA $5C,X @ $005C = #$01+ a0 @. B; Z0 k7 N, F8 k, b$ ]
05:B394:C8        INY1 R) I$ j0 B% _6 b+ Y5 q5 u
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$097 e; u1 _, f* \! n! E8 \
05:B397:95 5A     STA $5A,X @ $005A = #$00
9 e; |9 O- g7 Y) s1 G05:B399:C8        INY, j8 U# e9 }6 A# i" \8 t+ I
05:B39A:98        TYA6 k# O. L; G$ N" R6 g9 s4 i; B
然后我们再上拉,得到如下指令:: O: j9 |' D  L4 Z
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09' z7 y7 k6 s0 l$ l
05:B38E:C9 FF     CMP #$FF
% ?- S1 {! m; ?" N0 v! c2 h5 t05:B390:F0 3D     BEQ $B3CF
5 U% O1 F) y( j% n% n6 w+ ~8 ~05:B392:95 5C     STA $5C,X @ $005C = #$01
- T' q/ j  s+ S9 u# K05:B394:C8        INY
1 A9 `: C% N& D05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
% o, n- A% ^. F4 ~05:B397:95 5A     STA $5A,X @ $005A = #$002 O' `1 _  F0 U! b4 u8 o
05:B399:C8        INY' l" `/ t8 k' o% r* E2 E: `
05:B39A:98        TYA" I9 N# i9 O1 C5 r* d" b
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
3 n6 n( N5 N7 c3 o没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
, s& q* ^: e. W9 x3.修改演示:! K. L$ E/ V+ j% i& h, O0 t
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
( e) N% P+ j1 k    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
( n+ R: y6 ^1 u3 ~打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:* @* k# D0 s, V; ^8 l( ]# t
05:B392:95 5C     STA $5C,X @ $005C = #$000 j8 ], O. k* l. {0 B
05:B394:C8        INY) V7 ^; B( j' [+ {: g& O7 [3 A
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$008 u4 t% U3 a5 i: ~; Z
05:B397:95 5A     STA $5A,X @ $005A = #$00
1 ~( o/ Z1 Q% D05:B399:C8        INY
5 N5 S3 J+ @0 g$ R/ [3 |9 N05:B39A:98        TYA
) R# o+ w, ~$ w. x; `3 e7 C  A% v我们上拉看到了:
6 U8 o7 R; c1 A/ C05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00; a+ _# R' J7 p7 f9 d3 ~* f3 J0 U9 [
05:B38E:C9 FF     CMP #$FF
7 C/ B/ v+ E# h" u+ f$ R9 O05:B390:F0 3D     BEQ $B3CF$ l. I" i8 O* h* y
05:B392:95 5C     STA $5C,X @ $005C = #$00
1 b& J7 x1 }6 C4 E: n9 R$ U! V3 H05:B394:C8        INY9 B* B' A7 V: E* z
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00* c5 @; Q# Q  z8 O) Q( l: }  A
05:B397:95 5A     STA $5A,X @ $005A = #$00+ ^, b, T* J. y0 W
05:B399:C8        INY0 A; p9 k5 U" p: t; ^
05:B39A:98        TYA
7 ^3 Q$ U5 ], w1 J4 \/ D  a' m看到
: g+ o- \1 B! h) g5 S7 l+ y( e( \05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00# S3 {7 [% j! F  w0 R1 e
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.7 m( F: _. l: G8 f4 W' N
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
) I9 S0 U' s  S+ p' N3 q* C. O, b05:B371:B5 5A     LDA $5A,X @ $005A = #$7F: t6 L' Y, H! A4 P" {" `
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)8 j; h+ c" x% R
05:B375:A5 30     LDA $0030 = #$00( i2 R6 l6 |5 _! P9 {* Z9 m
05:B377:0A        ASL
4 A- f% Q/ l/ t1 `05:B378:0A        ASL2 Z' W/ {( v. n5 E, D$ H
05:B379:85 08     STA $0008 = #$29
8 S# |( x4 y: x2 p+ s05:B37B:8A        TXA) @7 t0 |/ ~5 f( E) J9 N
05:B37C:0A        ASL( N3 j* K- U; j
05:B37D:65 08     ADC $0008 = #$297 Z! G; t" F, n/ ?, |
05:B37F:A8        TAY' E, J; R4 e, p. W& V
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
3 t: g* S7 P: U+ A- D) {( x, `05:B383:85 08     STA $0008 = #$29$ Q; F6 Y0 J- m) O6 Y
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
; f; k' Z: C3 v8 ?05:B388:85 09     STA $0009 = #$B2
+ n  B: ~/ G- M! J" H. v05:B38A:B4 5E     LDY $5E,X @ $005E = #$025 b2 F  a! p0 i8 U4 Y
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
& L2 Q4 m: m( a+ P# q% x$ }05:B38E:C9 FF     CMP #$FF
8 k0 p, ?0 F1 n* Y1 O05:B390:F0 3D     BEQ $B3CF# l9 Z% a! J. j9 h6 R; j) O
05:B392:95 5C     STA $5C,X @ $005C = #$00# S: l* a' p; q
05:B394:C8        INY* M+ q/ Y- T+ d% B
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
3 i, ^+ i) ?# B# w, w( J- f$ }& ]05:B397:95 5A     STA $5A,X @ $005A = #$7F! _+ ~+ m, @$ A8 y$ L4 U7 U
05:B399:C8        INY) K; `) X  F5 d1 p
05:B39A:98        TYA
  e( n( }" B% A8 B- t8 Q05:B39B:95 5E     STA $5E,X @ $005E = #$026 V& Z' t  E! B; v. G
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
0 A* f& v7 q- J8 [: [. |# `05:B39F:B5 5C     LDA $5C,X @ $005C = #$00' A! d& l3 q4 [- K0 a" q: d: N
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00& S" q( I; {3 j, ?
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00& |$ P6 e  H1 H; K8 F' G8 l
6 C5 J- k* L  a/ q& Q$ J1 x
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
! ]/ y5 L- s/ V! C0 s& d; T* A可以下载玩一玩: o( C0 x1 Y9 W2 B
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1291 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。3 D) L! v/ e4 {0 R
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。. t5 [% V, w# q0 |
后来尝试其它修改,但是偶尔会造成花版或者死机。
0 y0 ?5 D* Y6 k! @! [8 m5 U深入研究,发现要以演示模式通关,需要做的事情还很多。) h5 W$ R; k% Z) S6 c! @
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-8-5 21:35

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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