EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑   }, Y0 Z( R" u- U
1 N- k( a6 C3 p5 a& Q+ a5 O
FC自动演示修改教程
2 l7 v5 |, K; {: I: F) A作者:火焰烈旋风6 }; }' |4 A1 K% l8 V3 d5 c
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
: A$ X2 {/ ?2 b* y1.找按键地址:( V' O) `; u+ {; I* j
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
) {( F, |- D# Q  i2.找演示时按键的数据来源:
" e3 K9 n8 C$ s( X% Z0 l1 i    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
: Q$ O2 v5 F1 [$ W07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
( K* T! U, ]( C5 D4 \' h07:C391:94 F9     STY $F9,X @ $00F9 = #$00
, R2 E4 z$ L/ v7 X/ S, c9 \07:C393:CA        DEX
" W6 [3 X. u- [( n07:C394:10 F0     BPL $C3868 F% @* X6 C+ `) {5 r
07:C396:60        RTS% Q  u2 b* R0 a* J
我们点击"运行"左边的上拉按钮上拉,看到如下指令:2 ^8 ]! ~( Z! K7 P
07:C378:A5 1D     LDA $001D = #$07
- u0 P7 L+ f! c& c( ~$ D" s07:C37A:29 04     AND #$04! S; t+ h0 j, j6 m  }
07:C37C:D0 06     BNE $C384
5 T% T$ E8 ?% I% n8 X: Q7 a07:C37E:A5 04     LDA $0004 = #$00
4 i6 }4 |( ^) A* Q) ~2 f. y' [! H07:C380:05 05     ORA $0005 = #$00
! q8 C: j3 \8 l+ M( d  R' F7 R4 y07:C382:85 04     STA $0004 = #$00
7 F& U" @: l% C+ j1 L: I2 N07:C384:A2 01     LDX #$01, ]' I7 Y+ {4 [
07:C386:B5 04     LDA $04,X @ $0004 = #$009 {9 b$ N5 ~' z/ Y% h8 P% T
07:C388:A8        TAY& e0 }* R$ A6 D0 H) J' a$ \
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
/ ?' b* t0 |) s! e9 C4 @% Y, A07:C38B:35 04     AND $04,X @ $0004 = #$005 \5 ^; ]4 y, n  _$ g% {
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
! m& T( `- i1 B7 H% q% S0 R. w07:C38F:94 F1     STY $F1,X @ $00F1 = #$01% o% w- ]& n: e1 E
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
$ B2 D3 z6 P  f4 @1 n' l07:C393:CA        DEX. m7 t; z9 n* _, Q# W* H5 w0 F
07:C394:10 F0     BPL $C386. U# x$ S% k9 T, d
07:C396:60        RTS3 N5 Z- n: O, y) P% v% I
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:. ?. u' H! E, J- c
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00) ^, m% |% n+ U4 k: A
05:B3A5:A5 2E     LDA $002E = #$C8, ]* L% J# }) [, K* Q4 t
05:B3A7:C9 50     CMP #$50
2 ?3 B, E& G, b( _0 w  C' ~# O05:B3A9:90 20     BCC $B3CB6 Y: v1 R1 F) _3 Z" t
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00* \( @) z/ l8 b/ Z% C/ P: [
05:B3AD:29 0F     AND #$0F9 w/ c  H8 q! ?6 j# P
05:B3AF:C9 01     CMP #$01
$ D. x: P9 g( C3 a4 N, [# U05:B3B1:F0 04     BEQ $B3B7* y0 w2 J+ A+ W. v# C. d+ W4 ^# e
05:B3B3:C9 04     CMP #$04& \6 g6 r7 |2 a/ j) d1 Y
.........; V: _0 I: O9 Y
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
' s9 U3 f: r$ L: O4 k, u* J& [05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
! l- S+ f& {  J6 l' K  X05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
7 v5 _" l9 N1 r05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
: n; h" u" b: m# I05:B3A5:A5 2E     LDA $002E = #$C8
8 i' U* [# `3 f; p' O05:B3A7:C9 50     CMP #$50( s, J# p1 G6 g$ w" [; v/ v
05:B3A9:90 20     BCC $B3CB
* d2 I  l7 @; |! `6 p' N- _05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00+ r5 s3 b9 l$ `, N
05:B3AD:29 0F     AND #$0F
5 W% w% ?' V2 B/ K6 [, D" ~看到7 \* ]& l$ S& E% @7 U: M
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
8 k* C: h- t0 B05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
  o) Q) V7 `0 m05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
% a! N- K" w9 S# ^  K" ]/ i+ a没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
# k& J: U  A& J    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:/ X' C: X" y5 T: L* J& j, M
05:B392:95 5C     STA $5C,X @ $005C = #$01
; R4 z+ S0 o3 I' p5 ~+ [2 d# j05:B394:C8        INY% w+ J4 w* N+ _# }
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
. ~9 x$ h$ `6 z05:B397:95 5A     STA $5A,X @ $005A = #$00
9 A& G# J2 T2 D# C- R05:B399:C8        INY
1 N: a7 K" |; g1 N05:B39A:98        TYA; z0 c! l4 J& ~2 N9 J# Y1 i3 d/ T
然后我们再上拉,得到如下指令:
$ ^: c& r0 p. O" A) G7 g7 I05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
/ R! ~, c9 d4 C3 N" k8 Q% z05:B38E:C9 FF     CMP #$FF
: H6 L% z5 R* I( A05:B390:F0 3D     BEQ $B3CF2 q6 A- f1 d2 T% ~, M  y
05:B392:95 5C     STA $5C,X @ $005C = #$01
7 E0 d1 x, C+ u3 M0 x- k$ i& U05:B394:C8        INY1 ?4 w3 c  s9 s1 p: W$ p
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09; M; \+ ?3 v' I, z, ~% r+ \
05:B397:95 5A     STA $5A,X @ $005A = #$000 Y  `' f5 @! K. c% }) b" [( V
05:B399:C8        INY
( B8 h# A) x( R' P  h05:B39A:98        TYA
( j& H( Q8 }3 v7 B看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$099 N& A4 n! d7 n
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.1 t, T6 I! r- c! H# q
3.修改演示:( k, i9 E% @7 d) ^$ l# h, g% C
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
  t1 p  {) C2 }+ A( [    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:& j; f5 b7 ~, \
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:" M9 p( I+ g8 d
05:B392:95 5C     STA $5C,X @ $005C = #$00$ a  r% T4 R2 t) r
05:B394:C8        INY
; I% j; i. K% f3 z+ E3 S05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
% A* V/ m. v( _05:B397:95 5A     STA $5A,X @ $005A = #$00( w* l3 K' A6 q$ K
05:B399:C8        INY/ r" h4 E  Q1 O2 `: e3 ^- E
05:B39A:98        TYA+ s- Q# B  d7 k
我们上拉看到了:; L, h2 B2 a& @7 K3 B
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
- F/ E$ o& I% v9 `( `# |05:B38E:C9 FF     CMP #$FF
- M+ V1 H* o: ^05:B390:F0 3D     BEQ $B3CF
6 |. [* ?# e3 ^! c' q05:B392:95 5C     STA $5C,X @ $005C = #$009 B# V& F% S' x9 o% Z
05:B394:C8        INY
9 y4 Y4 C7 K0 g: T2 ]1 G05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00' V- C  R: @6 h1 M7 c  V
05:B397:95 5A     STA $5A,X @ $005A = #$00
- l; l8 y7 x9 Q% v! S05:B399:C8        INY9 S4 `# {: G& W
05:B39A:98        TYA; I4 m0 \/ ~; [6 X  i% Q
看到3 a! L( a/ c! V- o7 n" D. d: G% u  v
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
0 P7 B1 ~* p1 D- |5 m没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.& x( E  x: |( m( q
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:4 S& P1 F  X) [* {1 q1 [
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
5 J& U) {: ]. ^2 q05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
. {( \5 T% z3 v+ i6 i6 z2 F05:B375:A5 30     LDA $0030 = #$00
, w* m# o% u0 G4 H05:B377:0A        ASL
) L# U& n. q! Z5 n6 ]. g: E05:B378:0A        ASL( w. q  b) g; z: z" C: h$ T
05:B379:85 08     STA $0008 = #$29
7 a4 k5 Q8 X2 V* A# h1 c' d05:B37B:8A        TXA. P- J7 H, j# n. U. c
05:B37C:0A        ASL7 U9 V& t6 _* R+ P9 X
05:B37D:65 08     ADC $0008 = #$29$ r/ I1 @+ j# W  ]2 P; b
05:B37F:A8        TAY
7 q2 Y% r9 U7 f7 e& h+ I+ Z8 \05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
$ ]9 a4 w' r$ E7 ?( d05:B383:85 08     STA $0008 = #$29
9 d  y: z& a! h3 Y05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC% C$ d9 C, l4 z' C
05:B388:85 09     STA $0009 = #$B2
: t! b/ p9 m# E1 l05:B38A:B4 5E     LDY $5E,X @ $005E = #$02" n" K, ^) I. V; O3 d
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
6 R! X1 X" R- {  Q5 h. a05:B38E:C9 FF     CMP #$FF
  W$ B: `# Z! C! ^, P05:B390:F0 3D     BEQ $B3CF/ ~1 P/ Y5 ^6 |
05:B392:95 5C     STA $5C,X @ $005C = #$00
2 L* B! O" a/ k  d05:B394:C8        INY
6 N$ x1 a7 ], ^( q/ Y; K05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
) m1 _. o, s/ B, f) l05:B397:95 5A     STA $5A,X @ $005A = #$7F
4 L2 \! u) |- I) S/ E2 K05:B399:C8        INY+ O! B' C8 v* N" D: [" ~
05:B39A:98        TYA4 h, a( N, J) B8 N" A: W; }9 r
05:B39B:95 5E     STA $5E,X @ $005E = #$02
* u3 u+ u# @2 n/ u7 k0 K( W05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
7 [+ I" E$ F. ^# J3 H; {! t05:B39F:B5 5C     LDA $5C,X @ $005C = #$001 e  w7 f8 s: v* r" \
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$007 G+ u/ \6 }2 b+ Y! K# O
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
  j- |6 Y# A8 i; W4 l/ _" ]+ v* b2 d" O* B
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了5 i* x7 S/ H! u4 _7 R! e
可以下载玩一玩
- @6 W4 p7 ~4 Y# }/ i$ phttp://pan.baidu.com/s/1bnE0AwZ

签到天数: 1305 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
# X$ |% j4 S: z0 x首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
4 x3 X4 X& @( s7 M; C后来尝试其它修改,但是偶尔会造成花版或者死机。
+ [! q/ d6 z' b0 L% A* K. O深入研究,发现要以演示模式通关,需要做的事情还很多。$ j1 }: x3 ?( M9 f1 i
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-10 13:48 , Processed in 1.092774 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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