设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
3 L; L% ]  X1 B4 c4 m
9 n" D( y% q+ T3 h. CFC自动演示修改教程
" h- T/ r* k- |+ E  A作者:火焰烈旋风1 @. H% q, h- `- \7 P
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
  R+ d0 Y! }$ z" y/ ^1.找按键地址:
/ |3 N. ]6 q/ U7 i, A    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
3 Z% ]( W0 ^% h2.找演示时按键的数据来源:
: y" |/ L9 |( p5 y% G    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
4 U9 w5 D) B" S% F# {3 e1 X4 k2 X07:C38F:94 F1     STY $F1,X @ $00F1 = #$01+ u1 O, [! b$ z. X& R' I+ r+ ~* j
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
5 m9 M. F$ T) j  @( |3 p$ y07:C393:CA        DEX( a/ Q3 e7 b2 ], D8 u& X
07:C394:10 F0     BPL $C386
0 o8 d% m, M& n1 g- v( H3 s07:C396:60        RTS& z; |+ R0 l) u1 j! g
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
7 x5 t& Q3 x6 x* z- h07:C378:A5 1D     LDA $001D = #$07
, Z% Q% S  c- }+ H$ }07:C37A:29 04     AND #$04
0 \; _" k8 o/ m07:C37C:D0 06     BNE $C384
/ A: F( J* ]/ z! F07:C37E:A5 04     LDA $0004 = #$00
- i  S" k7 F' S  d0 [+ Y. z07:C380:05 05     ORA $0005 = #$002 C0 c* V  X5 c7 }; W# U  J
07:C382:85 04     STA $0004 = #$00
1 A8 I$ e$ H+ T' |6 H07:C384:A2 01     LDX #$01
6 G7 E5 H. y" n' N8 C0 z' L07:C386:B5 04     LDA $04,X @ $0004 = #$00
4 ^* v5 a+ J4 _07:C388:A8        TAY9 b& m0 _) ~  U( \& M1 \
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
# Q* z5 x: T8 N$ [07:C38B:35 04     AND $04,X @ $0004 = #$00# z- M( y& n5 A$ F- Z# N& }
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
, @( W, ]7 t7 A07:C38F:94 F1     STY $F1,X @ $00F1 = #$01! I7 x& X( I* C( H
07:C391:94 F9     STY $F9,X @ $00F9 = #$006 K6 ?3 Z% ]" v1 s* A9 P
07:C393:CA        DEX
* S4 P* p. j3 @, o07:C394:10 F0     BPL $C3866 x4 Q9 V  V. G  b7 N
07:C396:60        RTS3 |: F; s7 h* R$ j0 _& G, r
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
! d; J; z; p. m7 _* F! x05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00  l0 _/ t- J, P0 p
05:B3A5:A5 2E     LDA $002E = #$C83 G) Q& R/ v4 d7 H
05:B3A7:C9 50     CMP #$50
: C8 D2 H9 g. s2 k: O05:B3A9:90 20     BCC $B3CB; b) [7 G: Z) P% v; ]" C) a
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$003 Y, z2 U! u( v0 U- M" c. c% h
05:B3AD:29 0F     AND #$0F5 E5 s* e$ _$ @
05:B3AF:C9 01     CMP #$01
3 j. H9 W1 |% C" ?- }7 g05:B3B1:F0 04     BEQ $B3B7
# v+ L7 s" e! p! K$ Z3 O05:B3B3:C9 04     CMP #$042 ]  z, w8 O# @1 u
.........
. o! K) R% [7 }3 x: I7 B: o我们点击"运行"左边的上拉按钮上拉,看到如下指令:
5 X9 P; Y2 G' Z' i7 h& j! h05:B39F:B5 5C     LDA $5C,X @ $005C = #$019 j6 h* @, C2 H) W6 Q* z" [
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01  f  a5 x3 Y2 E' E* b! j% X- ^
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
% k1 `; M5 A4 _% \+ s9 N05:B3A5:A5 2E     LDA $002E = #$C8
6 }- Y1 c$ U4 o. I4 s1 o" F05:B3A7:C9 50     CMP #$50" z, h: D9 M9 `& v  {3 h
05:B3A9:90 20     BCC $B3CB: ~" R' E4 f& J* `# i# B$ V- x( H% M
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
/ k9 B+ T5 n* ]4 o05:B3AD:29 0F     AND #$0F. f, f: r4 I1 ~+ _0 g' Z
看到1 }$ a" ?/ `* o
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01+ Q/ O0 q5 r  c8 K# v8 W9 e
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
8 E3 f; u" J( |- n$ L# F05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
0 U4 j- |1 Y. ?( j# n没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
" v' f; h7 Q5 W  F    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
: E. @* O4 R$ w3 L" B2 ?' A05:B392:95 5C     STA $5C,X @ $005C = #$017 ]" k5 Q7 o3 R* S# h5 n
05:B394:C8        INY
% v4 E' @0 E* o9 U" \05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$092 \: a: \. e1 g6 r% K
05:B397:95 5A     STA $5A,X @ $005A = #$00* q3 f& b  |( }$ I# N% Z" q7 Z
05:B399:C8        INY3 ^; h; H! s2 f
05:B39A:98        TYA
4 J9 }& c" t. v& c然后我们再上拉,得到如下指令:% o3 j8 W9 Z6 u* W- x( I9 C
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09) q) @( z: z- V
05:B38E:C9 FF     CMP #$FF
  {8 @1 k$ B4 p* h/ f9 @05:B390:F0 3D     BEQ $B3CF
4 \, y/ I9 `4 a2 [  l& M9 h8 J2 x05:B392:95 5C     STA $5C,X @ $005C = #$01/ f9 [: D" K. \( v
05:B394:C8        INY4 F6 p- \0 v6 [( H; r" G
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
! k) L, h7 r0 w* h6 y& K; Z, `05:B397:95 5A     STA $5A,X @ $005A = #$00
+ P% [7 ~7 i( G4 e4 k$ o5 x# Q0 l05:B399:C8        INY
1 h9 T8 J# F5 H( ]# ^% \0 W$ e05:B39A:98        TYA
( b. N# j1 n: Z3 |! L) q' T看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09+ j3 p' D- L; a
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.4 Z/ b, e1 m% W8 q3 r$ v" }
3.修改演示:$ L6 W+ D, L. G: |& }1 D
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.6 @1 u5 L! o$ }( R% O( F
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:& J) _- G4 }. {- y0 m
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:9 Q% d5 Z) S" E$ U
05:B392:95 5C     STA $5C,X @ $005C = #$00
- F8 W3 l7 @# A9 f! B, b05:B394:C8        INY3 v5 r' G- i& y) A8 m3 C1 B
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
# d% b; b+ _. Z" a05:B397:95 5A     STA $5A,X @ $005A = #$00. P0 T# D1 {  A- r
05:B399:C8        INY
: k* P$ w$ T# W$ v( n) N  d& U05:B39A:98        TYA
* h' |% M1 T) {( K我们上拉看到了:
0 S0 n* ?9 Z/ G) M05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00) ?/ \& V2 o! ~$ l4 i
05:B38E:C9 FF     CMP #$FF2 o+ v# y) R1 Q) g  W0 z8 o
05:B390:F0 3D     BEQ $B3CF
/ N+ Z) g7 c  i05:B392:95 5C     STA $5C,X @ $005C = #$004 f8 p$ ^4 b2 R) y
05:B394:C8        INY
6 W: W$ J, c8 e0 m7 g8 }05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00. i! G5 C( b3 [0 p: S7 a& _
05:B397:95 5A     STA $5A,X @ $005A = #$00
. A: I( v9 l: t  S0 J05:B399:C8        INY5 c) N# O" M6 i  b0 a
05:B39A:98        TYA; Y$ s9 k" ^$ ]( n7 g
看到) l4 |* k# z' S2 }
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
1 X% E- |7 c' v# h( ]没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.' Z. a& x/ h* q& z
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
& C3 L; w* D6 X* C5 Q05:B371:B5 5A     LDA $5A,X @ $005A = #$7F4 l5 `& Y, ]/ f. \. i
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)+ q6 v5 @9 q" u# g: z& G
05:B375:A5 30     LDA $0030 = #$003 J7 I# `: F4 E
05:B377:0A        ASL" E- U1 @' l$ ~% E
05:B378:0A        ASL
, j) U$ j$ y4 M, H. h$ a) I, l' q$ K05:B379:85 08     STA $0008 = #$295 r! k6 Z/ q/ u) r' _
05:B37B:8A        TXA
3 a/ g! @& `( b05:B37C:0A        ASL3 @4 I# y* m2 \+ r! N' _6 q
05:B37D:65 08     ADC $0008 = #$29
+ k4 ]+ h# @) u2 B9 {0 h05:B37F:A8        TAY$ i& g3 d* H1 _0 g& R$ x$ I
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4# X. I* p0 N+ R7 K$ x. c
05:B383:85 08     STA $0008 = #$294 [: J7 Z$ |. U: U" Y
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
- h$ k5 \6 U7 ?1 ?4 }0 a9 _05:B388:85 09     STA $0009 = #$B22 o. B6 a: @* `- w! h2 x
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02( S( y$ b. i$ T+ [
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10- G. m) u; R1 l& V; O
05:B38E:C9 FF     CMP #$FF
( T% h' B( N, [2 u05:B390:F0 3D     BEQ $B3CF
$ P4 x- _9 K# {3 c/ Z  T# }$ Q8 ]05:B392:95 5C     STA $5C,X @ $005C = #$00
- G/ o& U# F% s3 L, s- ^) @05:B394:C8        INY
0 v$ C1 T( ?1 `05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
" D: r* S9 K# E: Q# W/ o% z6 D6 C05:B397:95 5A     STA $5A,X @ $005A = #$7F# W+ }( j& p% O8 W) e. ~/ m
05:B399:C8        INY
2 d2 G8 R" f- C" M! e05:B39A:98        TYA$ L% k' d$ ~3 n+ i6 H: h
05:B39B:95 5E     STA $5E,X @ $005E = #$025 @2 h! O9 M/ T
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
  Q$ z6 L6 b$ t5 V; N) T05:B39F:B5 5C     LDA $5C,X @ $005C = #$00- j2 P( |+ u; r# k
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
2 f9 p( v6 S) ^: M- i05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
) M; T1 z( A! z7 |! e! H! B% v1 w
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了; o1 c, |$ y+ u" K- }
可以下载玩一玩4 E% h4 C0 Q$ D# g/ Y7 {
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1291 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
( U0 R% m+ y/ }1 b) Q首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。, R" {: z, @0 P) g& w% Q8 @
后来尝试其它修改,但是偶尔会造成花版或者死机。
: N0 G* O" S) H4 V" C深入研究,发现要以演示模式通关,需要做的事情还很多。
1 w" ?: ^- ~" E6 K$ r* T% L$ v因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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 20:30

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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