EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 , G8 A, G7 T  x* I% l

& P- ?; u$ V  fFC自动演示修改教程
: ~' v/ r- [7 S: s- d& v0 c# A8 T6 P作者:火焰烈旋风5 O1 ?- y; D$ T6 ^4 T- B
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
  {0 ?  e$ H+ {+ [1.找按键地址:. i3 N* `3 J# c9 z& {) }
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.: b( X! S* ~( ^
2.找演示时按键的数据来源:& P4 ]$ s$ S  Q9 n' v1 Y! p
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
4 ^& ?7 N8 n7 l8 s/ M9 [07:C38F:94 F1     STY $F1,X @ $00F1 = #$01% H3 j$ `- ?5 Y& I" o4 q
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
/ Y/ e! |- |: I07:C393:CA        DEX
" _3 H$ Y# @0 X* J1 V07:C394:10 F0     BPL $C386
% _, u4 m3 n: J5 u7 ^07:C396:60        RTS
. t" t6 ?4 y* z我们点击"运行"左边的上拉按钮上拉,看到如下指令:
5 S- M8 t" @6 U! ~* j3 P# J07:C378:A5 1D     LDA $001D = #$076 p/ l2 S  ~4 \- b5 U
07:C37A:29 04     AND #$04
. H3 N1 q- V: M. Y07:C37C:D0 06     BNE $C384
7 o6 H5 r$ v# B& h+ r07:C37E:A5 04     LDA $0004 = #$007 F9 B+ F2 g9 e. [0 l# j
07:C380:05 05     ORA $0005 = #$00
; E; g1 A! |7 z; _* n07:C382:85 04     STA $0004 = #$001 Z4 S5 y: \) Q: s( T& a( i) `
07:C384:A2 01     LDX #$01
) _. v1 K/ U' l9 ?3 J07:C386:B5 04     LDA $04,X @ $0004 = #$00# h; ]8 e8 w2 L. Y! d; ^
07:C388:A8        TAY+ K0 n/ E1 t) J6 H3 R
07:C389:55 F9     EOR $F9,X @ $00F9 = #$003 z! S% s$ ?' v
07:C38B:35 04     AND $04,X @ $0004 = #$00' T# @! z  b2 L/ }9 M3 \) ~- Z
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
: h% Z; j: R+ L( k; g07:C38F:94 F1     STY $F1,X @ $00F1 = #$01; A- i$ A! I* u3 R
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
& D' }- T" J$ ]" |- Z' g' M1 V07:C393:CA        DEX' o6 \! S' l% ~1 ~2 N5 d
07:C394:10 F0     BPL $C386
5 i* [" t( p* h! l; w" Q3 B07:C396:60        RTS' O0 B. p( c1 N" P5 v* y" `
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
" F8 f; _3 a5 w9 Z; X05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
# t* c: u0 y  p/ C1 A" @05:B3A5:A5 2E     LDA $002E = #$C8+ M& N6 c6 k3 B
05:B3A7:C9 50     CMP #$505 H2 \1 d& _: r, R6 F9 h
05:B3A9:90 20     BCC $B3CB
% s) r8 j# T7 A4 f- U4 M05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
  d2 a0 k) }1 W4 ~+ c. v05:B3AD:29 0F     AND #$0F  S) _$ V: U8 Z/ F) k! P
05:B3AF:C9 01     CMP #$01- b6 I- X. m- b4 {- S
05:B3B1:F0 04     BEQ $B3B7' N( T* p( h: x! z! e1 p6 v. F
05:B3B3:C9 04     CMP #$04
, Z- ]8 |3 z; z0 M" Y1 g.........
  d+ A6 e- X9 v2 h, w我们点击"运行"左边的上拉按钮上拉,看到如下指令:6 I2 _, G" @0 ~2 y: `/ C. p
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
, k- s1 Z% L- j6 ?+ \05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
/ h. I! @3 M; Y& C5 B05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00, ]/ w/ T) f. f4 P4 H% n# s/ ^
05:B3A5:A5 2E     LDA $002E = #$C8
3 Q3 V+ t1 B. `0 ]- b2 b( S3 x05:B3A7:C9 50     CMP #$506 S" v% M/ f9 ~9 \( _
05:B3A9:90 20     BCC $B3CB- g* u* |$ c3 Z) {& w1 W" e$ b
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$003 z& Y2 p$ E  b# c3 J# i
05:B3AD:29 0F     AND #$0F6 i: V  |5 J1 N7 _9 c$ N! I
看到' }% l7 |" U( |1 a
05:B39F:B5 5C     LDA $5C,X @ $005C = #$016 T0 V$ w+ v8 l, n- }1 ?% S
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
1 g0 T; \: \+ q: ^! Y- S2 l  z05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
* Z" n) H4 O9 t1 w( m( p* D% X没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手./ n) g% Z, y5 v9 `) m7 p( B
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:5 d! F  L) n4 @7 R
05:B392:95 5C     STA $5C,X @ $005C = #$01
) N$ s5 F4 g8 y; M$ P; ?' W05:B394:C8        INY: O+ [* w: v* P+ f/ d) X! b
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
* g0 d1 T8 F0 E( Q05:B397:95 5A     STA $5A,X @ $005A = #$00/ C' `1 O3 v3 s* K+ [( f5 q
05:B399:C8        INY
& U' z$ p! }5 I' v1 K/ [! Z8 |3 v05:B39A:98        TYA. i! {2 v4 ]7 i& s/ P3 _* [' ~
然后我们再上拉,得到如下指令:
* T+ z1 Z: R4 H* B' N05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09% t/ |( V" H4 o/ n. W
05:B38E:C9 FF     CMP #$FF/ a0 s5 N5 V2 x- y$ g1 j
05:B390:F0 3D     BEQ $B3CF; P8 \. s5 L/ H8 q0 U
05:B392:95 5C     STA $5C,X @ $005C = #$01
6 E0 D/ v: _; \6 ~* P! G2 Y* e05:B394:C8        INY
7 F% q1 z  j% h; J4 t, c" z05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
/ M, f5 D/ N8 s+ o+ d, t8 v05:B397:95 5A     STA $5A,X @ $005A = #$00+ b/ _2 Q: M( C/ P
05:B399:C8        INY
/ r7 m, j9 ?  E% O& w! X05:B39A:98        TYA
- b: D- p$ H  h& _, t' F+ D看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09& c5 s( \' U) |+ H6 d5 s
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
$ ?/ D3 A& z9 m  e( u7 @  I/ ]3.修改演示:" F1 d+ A& z! i0 r  x& y
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
$ N( D" W. c$ G+ J1 ?6 _    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:% S- v# q6 [: |/ U
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:* c7 j9 {, R) m& {5 i
05:B392:95 5C     STA $5C,X @ $005C = #$00* T# @8 P+ F+ m; q' W; l
05:B394:C8        INY
: |9 A) H6 d1 ~1 U# o1 Q" R05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00. g9 k) }" B& t- [9 d) T5 U
05:B397:95 5A     STA $5A,X @ $005A = #$00
; U/ p. F3 d; _& d& ?* X05:B399:C8        INY
" R, R0 D8 X8 M( R$ \9 q05:B39A:98        TYA
6 Y& f' y, D2 h, n我们上拉看到了:' \; o8 a  W& {" s2 t3 c# J( y
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00) s, t) ~  J2 K+ Z
05:B38E:C9 FF     CMP #$FF
) i4 y* P# s) r* D- \% D05:B390:F0 3D     BEQ $B3CF% ^( O3 c+ Y3 j, O! Z" ~# A& E
05:B392:95 5C     STA $5C,X @ $005C = #$00+ A; Q0 ~+ n" N+ s  j8 g
05:B394:C8        INY
( _! m8 F$ F* U& y$ t6 D05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
' _7 W: q. m) `4 f( [& n  g05:B397:95 5A     STA $5A,X @ $005A = #$007 l( |. P( d9 L* d+ U3 ^0 K
05:B399:C8        INY8 X+ g6 L$ b( _! F3 R: Q* T. v: ?
05:B39A:98        TYA
8 `5 I* L0 X+ h看到
/ l( R. z$ o: Q( p  a3 K( w05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00: ]  J4 t/ }: v) [0 {5 `: @: H8 v
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.0 {& S0 B! H( o5 q; S1 k# U; n# |
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:& u3 L! V& ?1 Q% {
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F/ m1 d# y, W% V# W! Q
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)# b9 z, @3 Z( N/ \7 M# D  x
05:B375:A5 30     LDA $0030 = #$00. P, q) B0 ~, Z, S: ^2 h
05:B377:0A        ASL' I; g0 e, R! @. K7 l
05:B378:0A        ASL
- v; v2 O6 H/ N* s05:B379:85 08     STA $0008 = #$29
6 G" `* F+ M0 r6 g) F6 }& }05:B37B:8A        TXA
2 r) M2 I+ Y! Q1 k" F  W2 s5 \05:B37C:0A        ASL- h; b% N# `5 l/ X. N
05:B37D:65 08     ADC $0008 = #$29
2 x7 b+ K& Y; n3 N8 j4 S% m05:B37F:A8        TAY& x6 A/ i/ q! Z; S2 w
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
7 b8 x  @3 t9 d+ m% u1 ?* p05:B383:85 08     STA $0008 = #$29- r1 d3 z! H0 K1 K* B1 ]0 w8 M
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
" H+ D! J8 e7 h' R05:B388:85 09     STA $0009 = #$B2
* ~. V0 _/ H) _! _05:B38A:B4 5E     LDY $5E,X @ $005E = #$020 O: t# K/ P6 G* H$ M& \5 ^7 A8 q
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
! x: w# ]$ m  z05:B38E:C9 FF     CMP #$FF
5 B! k5 m2 O7 |; y9 [% c05:B390:F0 3D     BEQ $B3CF
% e3 e3 y1 }" i, p05:B392:95 5C     STA $5C,X @ $005C = #$00( j- C# k1 h$ P" I% }4 z+ N; t
05:B394:C8        INY. R% b+ O) n; c- ]5 J3 q
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10) F" ]# W& q& r- ?: E* n  h! T9 h
05:B397:95 5A     STA $5A,X @ $005A = #$7F# f7 n# T6 G; V9 \* E
05:B399:C8        INY, _# Z* W" _6 V6 p+ U0 @8 q
05:B39A:98        TYA
" M+ s2 J0 I% b5 I; D9 Y05:B39B:95 5E     STA $5E,X @ $005E = #$02; H4 j- c  s6 {( A8 ~4 w$ Q- {
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
4 ]4 N8 W" q" a: d05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
: O- A! R/ }4 X: g/ k1 _) U, H05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
! Y% n( Y! Z: c2 z05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00. @6 r+ [% s% _( D9 f9 s

+ U/ R& j# j$ a0 |* J/ Z0 U由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
' W8 Y# s. {* k$ B( u% y; E, q可以下载玩一玩* x0 P/ M& k6 d6 \$ W& a1 S
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1309 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
- P8 c" D2 a8 s8 ?首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。% \3 w; N% w- F0 c" @1 i
后来尝试其它修改,但是偶尔会造成花版或者死机。
) K  P' U% c8 G% n, P深入研究,发现要以演示模式通关,需要做的事情还很多。* F$ J6 z! y4 `
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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:55 , Processed in 1.082032 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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