EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 0 s! M4 p2 X, p5 A

/ u1 H1 ?" u$ ^& \FC自动演示修改教程+ Z& D' f( v8 f$ I. Y# L# I
作者:火焰烈旋风* J( {# Q. V! O" ]* u  o7 a2 K, V4 D" F
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
. a' F8 B( l6 t  [: a; E1.找按键地址:
2 }+ o4 h# v1 e    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
9 P. F( Q1 b! W, J, J/ o. J! v+ V2.找演示时按键的数据来源:
+ A& L- D0 C# V: X, L    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
$ Y& @3 F, I0 P% C0 V07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
6 Y- x7 \& G+ V7 ]07:C391:94 F9     STY $F9,X @ $00F9 = #$007 X7 q$ a: X. p3 o" `/ r
07:C393:CA        DEX/ B( @9 X3 w" r5 V" O$ \* p
07:C394:10 F0     BPL $C3868 `% S2 r  y2 J
07:C396:60        RTS9 m6 E8 n$ ?6 n: ~- T, O
我们点击"运行"左边的上拉按钮上拉,看到如下指令:! w+ j$ i8 m& g3 l( r
07:C378:A5 1D     LDA $001D = #$07; u* x; w, ?. ]) P' [
07:C37A:29 04     AND #$04
* C: u: B( j0 {07:C37C:D0 06     BNE $C3842 u2 o* ~9 F" U: Y' l
07:C37E:A5 04     LDA $0004 = #$00
5 i0 A$ k/ p, F! `' a6 ^07:C380:05 05     ORA $0005 = #$00
4 t8 |! g% ^9 _* l$ c# u6 E07:C382:85 04     STA $0004 = #$00
7 k. N" ~+ B, y8 B0 n: U07:C384:A2 01     LDX #$01( W9 J, w& F' U$ h' a# J6 i+ ?6 S
07:C386:B5 04     LDA $04,X @ $0004 = #$00
& \$ {- F9 x; H* z; Z4 k07:C388:A8        TAY
3 H9 y* P4 q. A1 N07:C389:55 F9     EOR $F9,X @ $00F9 = #$00, r$ i6 t1 x; x1 m4 W- C+ `2 m
07:C38B:35 04     AND $04,X @ $0004 = #$00
7 c( N" t) k( F4 i07:C38D:95 F5     STA $F5,X @ $00F5 = #$00+ l0 d9 q9 k# u+ r
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01/ _1 w) ^& I# {5 m8 I) ^2 I
07:C391:94 F9     STY $F9,X @ $00F9 = #$00( Q/ H- i- t7 F; o" _, R: h
07:C393:CA        DEX
5 p3 n6 c* i: v0 W1 J07:C394:10 F0     BPL $C386) l5 V: u# t- y+ `* H
07:C396:60        RTS
& `& s$ b% v' \0 U4 I由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
) M1 D+ W# O% U- o  q05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
  S2 L: q, ?7 K2 t% r5 h05:B3A5:A5 2E     LDA $002E = #$C8
  d8 }$ P9 H* t% k5 E) r7 L9 J  O05:B3A7:C9 50     CMP #$50
0 _. X. L; b! X4 {9 `/ I2 p05:B3A9:90 20     BCC $B3CB7 Q7 k. v; F4 q# D5 c& y) m) V1 I
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
7 u+ ^0 q. B, M( z, Y2 J$ n05:B3AD:29 0F     AND #$0F) d* t* l+ T7 B/ z3 ~6 f; S
05:B3AF:C9 01     CMP #$01* i5 E* V" X. c& c  a
05:B3B1:F0 04     BEQ $B3B7
# o- }$ [& E( Q4 K( [05:B3B3:C9 04     CMP #$04
# T% m) ]" [0 \8 w' w( M4 X.........5 c  m: W  A6 Z% X  y
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
! P# }+ m  t5 t: D! M, h05:B39F:B5 5C     LDA $5C,X @ $005C = #$01/ ?6 I& B8 ?; b8 V/ ?& y
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
% k& X! {3 R$ M05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
  x, ^; |! V9 A05:B3A5:A5 2E     LDA $002E = #$C8
  B$ A% ]! g1 R. c05:B3A7:C9 50     CMP #$506 y7 P( B$ V8 P% d5 J
05:B3A9:90 20     BCC $B3CB1 D  _% f1 T, k) N
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00$ O, ]7 I% b( z4 b- |9 k- I
05:B3AD:29 0F     AND #$0F% g( ^7 F6 G: h$ C% p
看到
" H- B1 N3 o- r05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
5 Q& M, G" u- \3 H) C; E05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
9 Y) A9 {" x( l4 `' d5 g% L/ U05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
' F, f3 T* ^) V7 b3 ~. T没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
8 Q- b0 n+ s" S- C/ N5 m    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:) c' L  m5 p1 ]  @+ y$ k8 O3 v* h8 f  R
05:B392:95 5C     STA $5C,X @ $005C = #$01" d$ N. e. w' u, G( T, p
05:B394:C8        INY
% F% y7 ]. Z3 ^) [05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
" Y; N1 x/ F# i7 T( ?05:B397:95 5A     STA $5A,X @ $005A = #$00
2 D$ J6 r* r1 Z) H05:B399:C8        INY
* O" }. f5 h- s7 I: v+ a0 e! I1 i05:B39A:98        TYA
! b7 S- E: K5 z3 P然后我们再上拉,得到如下指令:
0 P2 N& U) b$ Y/ E  r05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
3 W& h5 c! v- A$ W' N05:B38E:C9 FF     CMP #$FF
" \0 g9 }7 D- K2 r05:B390:F0 3D     BEQ $B3CF: L0 C! U7 M5 `, W3 f
05:B392:95 5C     STA $5C,X @ $005C = #$01
$ b5 ]) f, J3 n2 U" k3 p8 r. c05:B394:C8        INY! |: |$ m$ W+ N
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09' U- m* F- x/ T, b9 u. W$ R6 K
05:B397:95 5A     STA $5A,X @ $005A = #$00  p8 Y& I! n% v8 V' d: B: g" u
05:B399:C8        INY
! V% j& t# G( b$ X05:B39A:98        TYA
& s, T+ @8 T4 d4 w- @! h看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09. A4 J: U% k' R) \& ~( j
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
# a. G4 x. I7 I& ~3.修改演示:
3 N% S  g; ]; F( I  `$ L    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
( g/ t5 D  b. E3 p& i    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:1 H, Y5 \' j; s. U% I, f5 x, e
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
! ?; Z- f3 \) I05:B392:95 5C     STA $5C,X @ $005C = #$005 @0 ]' _  j3 N3 }
05:B394:C8        INY" E2 U7 ?: O& n4 P: d" I
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
, g' V7 {1 ^8 ^. t05:B397:95 5A     STA $5A,X @ $005A = #$00. T: W. E. p1 ]3 v! `7 {& r
05:B399:C8        INY
" L- ~) a* B- f" w05:B39A:98        TYA( e9 ^. f( M) Z3 @* {
我们上拉看到了:- ]- U! g2 A" @" Z3 ?* T
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00" Z5 I. R. a* r% g
05:B38E:C9 FF     CMP #$FF+ `  D8 T" B, z
05:B390:F0 3D     BEQ $B3CF
6 x6 H/ e1 U8 A8 K+ s0 |05:B392:95 5C     STA $5C,X @ $005C = #$00
( h2 F( e" [4 v. h$ t7 y1 @$ @. |05:B394:C8        INY
# p9 y# a" y6 f& f05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
- G+ O4 U# @* B" Q, ~* z05:B397:95 5A     STA $5A,X @ $005A = #$00
* @  g8 X) {" o4 f; |$ t05:B399:C8        INY0 {2 V- @, a( h* i1 ?
05:B39A:98        TYA
! G  Z6 E  Z* D! @3 _4 h看到
# t3 [4 v# u! F! W05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$005 f0 ^; J8 {* E% v& b" R4 I
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.. t6 m# C6 j- M( O4 D% o% x9 `! X
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
/ Q- k" k  l& L$ M% A05:B371:B5 5A     LDA $5A,X @ $005A = #$7F& Z4 u3 i: G7 ]( {7 i6 M! C
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
' d$ ]/ I8 K5 u3 ]05:B375:A5 30     LDA $0030 = #$00
5 I7 r0 E' r: f, J05:B377:0A        ASL
( M: |( [7 ~) G3 O" U05:B378:0A        ASL
7 a/ F: W" z* ^# P+ t/ k; @5 i! g05:B379:85 08     STA $0008 = #$29
* `# k0 J# ^3 ]3 L1 \05:B37B:8A        TXA
& a. o( k  w/ g3 @+ F9 X8 d$ E05:B37C:0A        ASL
, I/ s9 G" i* b2 R' t05:B37D:65 08     ADC $0008 = #$29
5 y$ Y. x: A% ?) W05:B37F:A8        TAY* W/ j4 W' O& h4 W, e! U- u) B; d
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
3 t0 W: A+ `& I; N* P05:B383:85 08     STA $0008 = #$29
  T" R1 x4 `1 e) i9 k, `) V05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
" Q! d8 ^  G" U05:B388:85 09     STA $0009 = #$B20 I. ]* [( T) X- F; N* o$ ~
05:B38A:B4 5E     LDY $5E,X @ $005E = #$025 k. a" J% [0 d9 D  Z
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$108 e6 Y5 y% @2 D/ B: ^
05:B38E:C9 FF     CMP #$FF7 G4 f5 p' ?% H$ Y1 l
05:B390:F0 3D     BEQ $B3CF* A% C3 D8 `+ ?' N
05:B392:95 5C     STA $5C,X @ $005C = #$00, l! R: N9 G' q: }( r  J* g
05:B394:C8        INY+ A( Q+ @  d7 R. d5 |6 Q, v
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
) T0 i( i7 G* o, R05:B397:95 5A     STA $5A,X @ $005A = #$7F; _; m  w( m" K/ _. W$ q
05:B399:C8        INY
3 s6 x/ W1 E# d6 I& p, v05:B39A:98        TYA
, S  w8 i$ M1 m* A. {0 ?: o05:B39B:95 5E     STA $5E,X @ $005E = #$02% ^0 @! f: x" t: v( n( T
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)7 O/ ]& w  x8 f
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00' B9 n2 P, @  z7 p) L
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00; q8 U! Q5 I5 m9 U4 z
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
0 ~/ a5 x* W+ W( f) Q" x4 B$ v: d# V* m
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了9 r+ s  m! s: j
可以下载玩一玩% r! `: [7 H7 m+ o# Q% K$ l# X
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
+ U2 u9 d! e' R  Q' W首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。9 j/ p9 a' ?  r' M- K
后来尝试其它修改,但是偶尔会造成花版或者死机。
/ N7 B9 m, q5 B2 K深入研究,发现要以演示模式通关,需要做的事情还很多。: X9 V# C- o/ I0 `$ f
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-12-6 12:41 , Processed in 1.086914 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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