EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 . q5 r) X; J; i! H
) C4 k- {# \$ ]4 x4 a
FC自动演示修改教程
7 |* Y' {" K9 {9 n$ C: G0 p3 o作者:火焰烈旋风6 X. [1 n* N9 V. U6 E
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
# x- k, `% q+ K; n1.找按键地址:
6 W' {2 J( C$ j. D( N' g9 j$ I    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
1 S/ q/ l3 y' [- R: s6 d# o2.找演示时按键的数据来源:
7 w- J7 u  H3 K9 M9 G    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:+ X/ {9 V' Y" H  M& ~
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
  J- B8 B$ e$ M8 D9 w4 |- `07:C391:94 F9     STY $F9,X @ $00F9 = #$006 t/ s1 e$ s. Y( H( R
07:C393:CA        DEX! }9 }$ u! ~: w9 i; Y$ P( C! k+ ~7 z
07:C394:10 F0     BPL $C3866 i9 c: l6 P2 z
07:C396:60        RTS" o7 W4 v6 r+ ~5 K% }+ G% W  z
我们点击"运行"左边的上拉按钮上拉,看到如下指令:7 [8 x3 `7 w- ?- w: J' F3 N
07:C378:A5 1D     LDA $001D = #$07
* E. t0 [1 G* r4 C6 b  g+ M07:C37A:29 04     AND #$048 K" x7 r7 w% c% y  u
07:C37C:D0 06     BNE $C384! O. n; H- s1 P! m5 Z
07:C37E:A5 04     LDA $0004 = #$00
+ ?$ ~8 }( {$ K; x9 P$ r! v; P07:C380:05 05     ORA $0005 = #$004 ^  K# `8 L/ J% w9 a3 k: u
07:C382:85 04     STA $0004 = #$00; B# Y$ q7 F; ^  }  T
07:C384:A2 01     LDX #$01
+ u* G* x2 d- v* Y: @- k07:C386:B5 04     LDA $04,X @ $0004 = #$00
/ t$ k4 p* i1 y6 U, r% L- I. R& s07:C388:A8        TAY- H/ X, q+ p  e0 V/ _2 a- E
07:C389:55 F9     EOR $F9,X @ $00F9 = #$002 @& [, P) D0 {( k+ X
07:C38B:35 04     AND $04,X @ $0004 = #$00
- M# ]. G4 S0 ], n& [5 N4 U07:C38D:95 F5     STA $F5,X @ $00F5 = #$00& F  u9 W3 r0 @* Y8 K
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
' t, [# D/ U% m9 g( G( L07:C391:94 F9     STY $F9,X @ $00F9 = #$00
' Y) j+ x: O9 P  l8 k! b07:C393:CA        DEX  n" N6 |7 M2 j# T. [  N. U
07:C394:10 F0     BPL $C386
' w, o& q3 ~9 b6 D07:C396:60        RTS' [" J8 {8 p% Q. ^6 o1 c: O
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:, |: |3 W7 T6 n
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
. f2 N( \( \8 X, D* q05:B3A5:A5 2E     LDA $002E = #$C8. g% Q0 ^/ {: q8 P3 K# U6 }
05:B3A7:C9 50     CMP #$50
0 I* `. X, s& C05:B3A9:90 20     BCC $B3CB
' G, l7 ~. I' H/ h. z, B05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
. m# z7 v% q! s05:B3AD:29 0F     AND #$0F
; {1 r1 {- r/ t0 F05:B3AF:C9 01     CMP #$01
+ j$ z/ D% f* ^$ m; ~05:B3B1:F0 04     BEQ $B3B77 f5 p4 w4 X; p2 C* H
05:B3B3:C9 04     CMP #$04
6 ~+ Q* P; f; Z6 h. @9 g" V- B.........
6 ]4 K" J/ U8 A7 j我们点击"运行"左边的上拉按钮上拉,看到如下指令:
  @6 g0 `; Q  S4 E. S2 q4 N05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
  ?, F( b1 ~) W) K& }; O05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
# b, `# V9 _! b- n" t9 Y* m1 d  T05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00' F, N' V& Z: H6 E6 G  q0 F- N
05:B3A5:A5 2E     LDA $002E = #$C88 ^, y# Z# z) _% Z% ^# U  N
05:B3A7:C9 50     CMP #$50
) L9 W3 b  Q, ~+ S3 q05:B3A9:90 20     BCC $B3CB
; \' q( b; U8 j0 c$ A05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
7 c1 z( _8 m: t+ m9 h. s* {+ \05:B3AD:29 0F     AND #$0F+ i7 |4 ]0 y: F* i1 L# l3 k
看到4 c% I  D0 t9 a) j
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01( C' M* [4 I0 r& `
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$016 |! e; b, P  y+ t* h0 w' c! a$ P
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$003 I' x# A( s* U3 {  X
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
8 h  h# s9 S2 E% j. g    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:$ |' @) i% Y! X! E7 r
05:B392:95 5C     STA $5C,X @ $005C = #$01+ b% D( l2 f4 p7 i3 f4 @8 M& j3 K% Q
05:B394:C8        INY
, _7 p# k% D1 L05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$096 p& Z% B1 O: h5 x& Q4 ?) v
05:B397:95 5A     STA $5A,X @ $005A = #$00! |) B& J1 a. Q  D+ `, g
05:B399:C8        INY
8 o8 c( H3 [2 S! z' A  W6 W/ {05:B39A:98        TYA- N) U6 P+ H& k
然后我们再上拉,得到如下指令:
2 z. ^3 p6 a: F6 a4 a( u05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$098 y3 c# [, H3 }! H0 n
05:B38E:C9 FF     CMP #$FF
* i  T9 K$ \7 k2 o7 c7 j& A. A05:B390:F0 3D     BEQ $B3CF
9 }  l( Q9 e3 A8 t* c) B05:B392:95 5C     STA $5C,X @ $005C = #$01$ B3 D0 i1 o' ?' v9 F8 f7 N* K
05:B394:C8        INY3 ], |( w3 N& e" I! j
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09$ j5 E1 @3 m' m: z" |
05:B397:95 5A     STA $5A,X @ $005A = #$00
# Z6 r8 E- }+ S& z" G1 a9 V05:B399:C8        INY
* W1 T" w; R" {* J$ O6 s05:B39A:98        TYA
8 E. }6 S$ y; [3 s" z看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09' W0 `9 Z. F& n+ e1 c2 E3 A' m
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.( p+ Z+ `; f1 i' ]7 H
3.修改演示:
" Y6 `7 S8 K1 Z& y& r    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
% b4 a7 h* u% R  E$ d& [' A    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
, `! A( {+ c: \) s2 K打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:2 i: E7 ]% J/ S3 `* d
05:B392:95 5C     STA $5C,X @ $005C = #$00/ i. Z' B- ]' P/ ~( o6 C; H. ^
05:B394:C8        INY
0 t) J5 E& O1 E$ n! k. k8 K) Z5 L05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00- ]  R6 q! v1 `+ B0 M
05:B397:95 5A     STA $5A,X @ $005A = #$00
8 {8 {" Q: l2 I  X" R/ S05:B399:C8        INY
$ F( ^% s0 i: S7 ?. E9 e: q05:B39A:98        TYA
; O( W0 H# J0 ?- o4 s+ u我们上拉看到了:
6 j& @8 u# Y- q$ O5 T1 y; g) g05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00! q7 O; h  C1 ]6 @
05:B38E:C9 FF     CMP #$FF& Z9 F$ y! Q6 v% p4 D
05:B390:F0 3D     BEQ $B3CF
/ I8 S" o" {# b( b05:B392:95 5C     STA $5C,X @ $005C = #$00
: s" W& N8 l  D05:B394:C8        INY
; f: P  L# H$ {/ b& M3 _; o7 T05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00+ ^) \) t+ n9 a. {
05:B397:95 5A     STA $5A,X @ $005A = #$00: r/ f( C- F# m+ j4 G% w1 O( X
05:B399:C8        INY! b$ w3 N; E: M, s4 z
05:B39A:98        TYA0 X; ~3 V+ P$ z/ O+ |
看到; p! i6 D4 s+ j
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$000 j+ G# N3 ^+ l0 y" Z/ D. ^2 {
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
+ w2 `) ^0 l8 l* e* O3 r' e, @说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:# T% _# Y9 I( _5 w' G' E$ y4 c
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F: c! x6 t( J, J$ q4 Y# H1 P" \
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)- a6 H7 M' k% T3 p# g
05:B375:A5 30     LDA $0030 = #$00
+ Z1 b  v6 U1 ^# v; [' I05:B377:0A        ASL0 q8 G% E0 C$ G# D& Q
05:B378:0A        ASL
2 g$ \7 E' f" i' p05:B379:85 08     STA $0008 = #$29
/ W' @3 ^# i  T) Z6 E7 K8 U) s' U05:B37B:8A        TXA
6 `2 @9 x+ [" R! x05:B37C:0A        ASL) K- p+ O# n+ r5 P/ @7 F
05:B37D:65 08     ADC $0008 = #$29+ T- X' }; @; \. {
05:B37F:A8        TAY
# h& \/ }% f( g9 Z05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
, X/ ?/ ?# F) a' C4 Y7 Y05:B383:85 08     STA $0008 = #$29
3 z4 ^3 K' S' A3 A$ |, r+ Z  C) o% |% w05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
+ c2 c' u- U6 ]: G; _3 p1 M05:B388:85 09     STA $0009 = #$B2' e7 {' s: q, M/ w% ?- J2 u/ n& A
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
0 V0 \! v3 G: n' U# L$ U05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
" I  D/ `& Z0 X& ~2 T2 T05:B38E:C9 FF     CMP #$FF
0 g8 T7 _9 B# j6 }5 W5 @05:B390:F0 3D     BEQ $B3CF$ F/ [1 {; D7 y6 q
05:B392:95 5C     STA $5C,X @ $005C = #$00
2 m5 z3 h( w) {# e$ M( j05:B394:C8        INY
; b) K; i% t! w. [/ S5 ]1 P, C3 l3 I4 `05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
) t# R: h7 X0 s9 |05:B397:95 5A     STA $5A,X @ $005A = #$7F+ P7 W( o4 c- x; ], |2 f
05:B399:C8        INY
4 P& o/ _8 q* W* v05:B39A:98        TYA5 y+ X, d% |: v+ E- A/ O
05:B39B:95 5E     STA $5E,X @ $005E = #$020 Z* R' B5 k0 V) y& b8 \% w
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
% f9 u1 V3 y8 Z* r9 t05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
( m6 Z" R- Z" B" S05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00/ X0 ]2 P: Z& @6 U: b' i
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
0 r' h7 I& o% z' A4 d' B
5 A8 d4 I$ `6 ~' F  b3 h, p由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了, @  g% g' G, s) F! p  Y9 A
可以下载玩一玩# ^- Y, X  d2 m( ]2 c& p7 s2 y
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1309 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
! ^5 C4 S  n+ G' A/ p! j首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
3 C2 x& Y9 Z% [5 D! C+ |后来尝试其它修改,但是偶尔会造成花版或者死机。
3 z2 f4 K& z8 G6 G; g- r深入研究,发现要以演示模式通关,需要做的事情还很多。4 [/ e. z7 w5 L- a
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-7-26 02:58 , Processed in 1.068359 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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