EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
9 d6 q0 f/ w4 T( S7 ~! @: |/ w, J& H  m. d- i9 W# ]. {
FC自动演示修改教程
0 C# m$ z4 M4 j作者:火焰烈旋风
5 u5 V( e) v" Y; e* ~+ ^! P工具:FCEUX中文版(www.9553.cn搜FCEU即可)# n6 ^! t2 ^7 n; ?, l; y& W, ]+ p% _
1.找按键地址:
1 }0 _3 i" J0 g+ j3 f# D( M    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
% @; @' r# u& _+ z# d, c8 L2.找演示时按键的数据来源:
+ n1 F/ N3 _5 a6 y  Y: H    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
- _# s/ H3 q/ Y' z) _07:C38F:94 F1     STY $F1,X @ $00F1 = #$013 {* W* T7 ]! ?/ ^( _
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
2 p0 Y: k" U+ X7 V  \07:C393:CA        DEX7 t+ L+ Q) s+ d+ o2 a/ a0 X
07:C394:10 F0     BPL $C386" v, H2 K! W( @6 [$ e
07:C396:60        RTS! @6 e7 b$ N/ h
我们点击"运行"左边的上拉按钮上拉,看到如下指令:+ v; T' |: G9 x" S/ L7 C7 Y
07:C378:A5 1D     LDA $001D = #$073 a3 f8 N( ?' D  e# l& G$ \; u0 ?' f8 y9 i
07:C37A:29 04     AND #$04
) |  w& k' D( i: @' f07:C37C:D0 06     BNE $C384
4 W0 `: `/ s. O+ q& l07:C37E:A5 04     LDA $0004 = #$00, c; F' b/ g) P+ k
07:C380:05 05     ORA $0005 = #$00
# E! [0 s# `2 l8 T07:C382:85 04     STA $0004 = #$00
- g2 m' U. e& [* H# p( V6 q- M* y07:C384:A2 01     LDX #$01
$ q7 a* s7 ^2 S0 J4 z4 y07:C386:B5 04     LDA $04,X @ $0004 = #$00
' V9 d" T4 r  F- c  O* B07:C388:A8        TAY
5 k1 N2 d' _2 s: d0 V3 O* o: t% C07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
9 ^2 O" q! b" T, k! ~" o07:C38B:35 04     AND $04,X @ $0004 = #$00
' O% E7 Q  }' ?07:C38D:95 F5     STA $F5,X @ $00F5 = #$001 [, [0 ^) _& O2 s- t% J; ]2 n5 d
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
5 i. c& ~# [5 l4 Q% x4 y& U07:C391:94 F9     STY $F9,X @ $00F9 = #$009 h! Q$ o( v$ R
07:C393:CA        DEX
& a. o& L' N" e# M0 N9 S07:C394:10 F0     BPL $C386
: a0 X/ N2 @! J- I" C: p( K07:C396:60        RTS: D. {" G( A1 U/ v# `* l0 ~
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:/ Q' P9 V5 O# Q" _2 @2 g
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00' O7 e/ P8 p/ a  m/ A
05:B3A5:A5 2E     LDA $002E = #$C8
0 J- T9 u" s) x# O( q) e6 E. T: H: k05:B3A7:C9 50     CMP #$50
* v+ J; ]( @& x+ A9 I05:B3A9:90 20     BCC $B3CB
2 Q; x! i; ?% t# e/ |% e8 m05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00. x; X; I. O6 a* l- R
05:B3AD:29 0F     AND #$0F
1 D2 Y# J/ S  }& {, j05:B3AF:C9 01     CMP #$01
8 E0 U9 T3 n7 ]0 `0 n9 a05:B3B1:F0 04     BEQ $B3B7+ x# b$ V( ^: l' \2 A3 G
05:B3B3:C9 04     CMP #$04* o- ]  F, e* K: k  Y) u, i
........./ q8 q! ?( B/ y, {2 @2 f
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
3 b& s0 }9 ~% q* r6 K' X5 J1 X- z05:B39F:B5 5C     LDA $5C,X @ $005C = #$01( c' Z/ v/ R8 Q7 k4 y# r3 d# ]
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
* h+ K$ Q: G/ `0 ]3 ]" a05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00# t; e$ g  X& E. n  R
05:B3A5:A5 2E     LDA $002E = #$C8
7 c% {/ B& j9 Y. }05:B3A7:C9 50     CMP #$50+ ~3 }+ T9 z  r9 C% \3 m  I- R" i( i
05:B3A9:90 20     BCC $B3CB; c( M1 n% o  b
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
( c( _( U) H6 M$ J05:B3AD:29 0F     AND #$0F6 U0 v  |' t7 C
看到5 z; h) }% ?" ?2 }
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
, U; k# ~1 P, C  Q# p( Z05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01+ c, ?5 h  X8 |" _0 g$ F' S8 O
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$001 y" I) T2 }2 {8 G* Z. \$ K: C
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.  k3 g% m) c- e- U1 S5 q2 o: X
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
4 ^  {8 r$ w) v9 R: d6 ~5 ]# d$ y05:B392:95 5C     STA $5C,X @ $005C = #$01- Y+ H: l0 S! p7 v2 |
05:B394:C8        INY7 p0 n* E/ l+ h" G' N; @6 t4 b
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
/ W- X, F+ C* k# C7 v3 i0 p" f  l05:B397:95 5A     STA $5A,X @ $005A = #$00/ ^$ I% M7 h) V9 _9 e; v; G
05:B399:C8        INY
9 a& E/ n3 A  K* D$ I5 A0 t05:B39A:98        TYA
! v! o  |* b% @; }7 B0 x2 |然后我们再上拉,得到如下指令:& F# v# F3 A2 n* c7 F- d
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09: q" H0 `4 A$ t( u0 S
05:B38E:C9 FF     CMP #$FF
( V5 H: W! e2 v1 T4 z# L05:B390:F0 3D     BEQ $B3CF
! x  S4 j' s( [$ E- f! b6 i) [4 I05:B392:95 5C     STA $5C,X @ $005C = #$01
* F; ?2 t& u6 r% \  q) k2 Z05:B394:C8        INY
2 W* ^) P6 S* E05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$090 o7 c* f+ s* v. d9 J* L5 g
05:B397:95 5A     STA $5A,X @ $005A = #$00
& Y2 q* H4 s1 a4 z6 N% W05:B399:C8        INY
* A9 h: l$ r6 U1 w, o# l$ m05:B39A:98        TYA5 |3 {4 d  `  O' s6 [. s9 }
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$091 E' a) C7 w4 O# ?/ Z  k
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
' p+ G$ ^9 y" v# @6 l: N0 i. Q  [: V3.修改演示:$ q& H' ?- {2 G9 N# s
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
  f) X. x* b9 [# N8 i( ]    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:+ {8 Z3 s5 h- w  A+ H, K
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
  w" {" |; |# H7 @0 d& G2 j' ^05:B392:95 5C     STA $5C,X @ $005C = #$007 q/ f8 \; I3 \; ]
05:B394:C8        INY0 k$ I( y/ h' }) e4 P
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00/ r5 N& M% z7 h9 _
05:B397:95 5A     STA $5A,X @ $005A = #$00, I! b6 }, g0 J' h) T  b( G# W
05:B399:C8        INY5 q- b5 q( K) i" ?, r) M  `
05:B39A:98        TYA
& c4 ~% I# J  a* U$ ?- S: w! J我们上拉看到了:
2 H/ y+ F2 B. n  E05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
+ \( j' B# W; m4 U% N/ @05:B38E:C9 FF     CMP #$FF% n9 w) Y  F8 C
05:B390:F0 3D     BEQ $B3CF
# g* ]! N' k: Q3 R, @8 T05:B392:95 5C     STA $5C,X @ $005C = #$00
/ \, {, Y2 l1 ~05:B394:C8        INY9 ]$ K) B" h. l9 G/ q) ?% O( ^
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00% z2 e4 n9 ], B% @2 C, T& m3 O: V
05:B397:95 5A     STA $5A,X @ $005A = #$00
. a5 Y4 W0 X3 |# }05:B399:C8        INY
) C( P  q  ]6 D) {: l05:B39A:98        TYA
/ G: S" f' m$ N% o看到7 G' w7 V& z+ C9 G5 u
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$002 @9 M. |1 n% R
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
$ H2 h. c9 U/ L$ Y, m说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:' S+ [# ?; Y& G& j
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F" C  n- [5 w* i, |* ?8 _' L2 Y: [
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
6 v0 `0 D# E! Q" r$ U05:B375:A5 30     LDA $0030 = #$006 r& i  g) t/ C# J
05:B377:0A        ASL2 P3 P2 P3 s2 y3 k  F9 X+ L
05:B378:0A        ASL
2 m* @- M- \5 v6 j05:B379:85 08     STA $0008 = #$29& f. Z% J% ]% P& C* p, F1 Z& }8 Z
05:B37B:8A        TXA
3 Q8 ~( T. ~) ~  a05:B37C:0A        ASL
$ W# `. r  n" t05:B37D:65 08     ADC $0008 = #$29- a' a" Q/ H+ k5 s* T
05:B37F:A8        TAY: T7 T, N1 K4 e
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4% j$ C$ E+ W2 o
05:B383:85 08     STA $0008 = #$29
* Y/ x" @+ A: m, R- L' n05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC/ s& Z: x- G8 b4 Y) K2 t& }
05:B388:85 09     STA $0009 = #$B2" g2 M5 q( }) n4 l/ f. }
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
! F. I& G4 f: T  C05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10% c) ]- U8 Z7 P* E" l  C7 S- n% Y
05:B38E:C9 FF     CMP #$FF1 E1 y+ m2 l. C& w  K3 I: _
05:B390:F0 3D     BEQ $B3CF
$ h" l  I# C' P4 t: G4 U) \05:B392:95 5C     STA $5C,X @ $005C = #$00
5 K8 o3 i2 p1 @  S  `05:B394:C8        INY/ H5 _/ Y4 c0 Q' B9 Z3 B5 |; ~
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
# B+ O# K# A' F+ m( \" ?2 w) p05:B397:95 5A     STA $5A,X @ $005A = #$7F
' K% q. W5 X- ^: r! X05:B399:C8        INY4 I6 O4 @& g8 M
05:B39A:98        TYA
' y+ [( F/ }4 c05:B39B:95 5E     STA $5E,X @ $005E = #$02
" j" y# ^: y. }9 f05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
/ c! N3 E  P7 N3 m: `3 ~  S05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
2 L+ ]: a+ }* v7 c+ j& a) q05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
4 U3 o8 r2 ~3 P05:B3A3:95 F1     STA $F1,X @ $00F1 = #$000 u5 X' E% m" m4 w& }; _

9 g) T! N7 l* u5 y' {) i! C由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了1 q/ M0 `) q/ R/ p. I
可以下载玩一玩4 D" r0 \1 K( s0 n9 D* ]3 _
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1305 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。' ?3 p6 D/ D( d  N& O
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
3 V( `$ C. m1 T3 c; B' [! I后来尝试其它修改,但是偶尔会造成花版或者死机。
9 `& I8 m' b! l7 v3 R1 h7 q/ v深入研究,发现要以演示模式通关,需要做的事情还很多。
3 ^* p8 d5 S) `! U8 K因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-6-16 18:45 , Processed in 1.061523 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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