设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 2576|回复: 17

[原创HACK教程] MD HACK简单教程(重制) [回档后帖子丢失了,重发一份]

[复制链接]

签到天数: 2052 天

[LV.Master]伴坛终老

发表于 2013-11-12 22:01:29 | 显示全部楼层 |阅读模式
准备东西:68K指令集资料、REGEN DEBUG、十六进制编辑器7 J5 D3 y6 i5 }: D

, ~+ A: [- }1 BREGEN DEBUG官网下载页面:http://aamirm.hacking-cult.org/www/regen.html/ ~8 o5 f6 P9 \% W+ j5 h4 P
; W6 R0 U+ z) J1 U* Z- r
以前写的MD HACK教程是用MD调试器,但这MD调试器在使用过程发现有点缺点,显示机械码只显示前2位,后面地址或数值却没有显示,有可能造成后来新手在修改ROM时寻找不到要修改的数据。
% Q7 h9 u- T6 @5 }- f1 V8 k3 e; o8 W6 m- b: P
本篇教程考虑改用REGEN 0.972 Debug版来调试跟踪,现在的REGEN DEBUG很强大,可以考虑放弃MD调试器。
- A$ z) C  L) R: V0 W4 X0 {. E% }* I& j; {
以《魂斗罗:铁血军团》日版为例,修改目标:体力值不减5 |0 q# T+ R+ k7 g0 P6 G0 _

: H3 k$ n; n! n* N" `3 l1 p1。先找到《魂斗罗:铁血军团》体力值存放地址,可通过REGEN自带的作弊码查找功能来找,我找到了,存放地址是0xFFFA0D。
0 G& J0 T4 ^2 I8 p8 [7 t3 F3 H
" |# r: p/ j' v; L+ o9 `) G0 p& L, s* Q2。选择人物进入游戏后,点击Tools->68000 Debugger进入68000调试器界面,图1:
$ c* v+ G! `# ~( l5 Z! K3 F% E5 b
# V  l# B; }  {2 ^* ~0 L1 @* a- s) o+ K. x5 G
左上角框是显示汇编指令,右边是寄存器显示4 J/ O2 K! l- Q9 Q0 y( t, y1 f( e& g' G
. E& o( _' D% v8 M" i& _5 j2 Q1 \) U1 b
Address Breakpoints是地址断点
$ w& }& [$ S2 e9 ?9 f: jAddress Range是对一定范围地址设置断点. ~" L+ R5 \2 b' D1 G5 v
Register breakpoints是寄存器断点* E4 }# V; X- w( o2 V8 W6 v
VDP Breakpoint Range是对VDP一定范围地址设置断点1 y  C; P4 s0 }7 d, H
VRAM breakpoints是VRAM断点, `2 T4 q! {# Q) L
Go to address是转到指定的地址# Q  t. H0 j; {* h6 k9 J: y# P% I8 A
show disassembly是对指定的地址反汇编
- f& z/ b9 H9 o( x8 y. KDebug step是进行单步或N步调试
0 [* }) K1 H& L) TROM MEMORY是ROM Viewer) ]7 o. u/ P* k" ~0 h) T
68000 MEMORY是RAM Viewer; S* y0 L7 t, o! P+ J$ N+ K
Z80 Debug是Z80调试器
( o) b! T" \& T! t
* V& ~, [" I, [6 T* p- fRead是读,Write是写,PC表示是PC地址,Trace是跟踪(选择该项会在模拟器目录下生成ASM文件)
+ `2 ~# K4 G6 [* ^3 i7 t$ M
1 ?5 m- E5 ~: xRESET是重启游戏,RESET68K是68K重启,RESETZ80是Z80重启6 ^  Z5 E) a" D

+ e$ s1 Z& d. D' R% R. {( l3。在Address Breakpoints的Set Breakpoint右边框输入地址FFFA0D,Write选项加勾,再在Set Breakpoint左边框打勾,图2:0 I- F5 [, \* T& l! C
6 R6 k( V: `' K# f/ A- o) y
  D4 b' ?: g" g1 ~0 b8 F. `
4。点击OK返回游戏,当被敌人攻中时调试器发生中断,图3:' b& u+ {9 x! B9 E, b
/ x( y  `' n% g$ L! o- D/ K

( ?3 Y9 H: t  r! ~! c; r指令停在011DEE 1C2A000D move.b ($d,A2),D6这一行,前面指令却没有显示,用show disassembly把11DE0~11DFA这段地址反汇编看看,图4:
) C, h/ _! Z+ z$ H6 g( O1 E8 M8 j$ k# |  J
" m" b5 h" _7 |+ E4 t  u% q* }" ?
现在来分析一下:
& Z" e9 k& C# @) y  R7 dA2=FFFFFA00
& E2 U- |+ y% o3 `2 @! XD1=00000001! f, Z) ?! [( S" [8 }

% d. o4 |6 _! D: J% F1 j. T6 h011DEA 932A000D sub.b D1,($d,A2)  把$FFFA0D(A2寄存器的数据($FFFFFA00)+$d=$FFFFFA0D)的地址单字节数据减去D1寄存器的数值,结果存入$FFFA0D
, {: {% T5 o  p; |8 W5 M" V011DEE 1C2A000D move.b ($d,A2),D6 把$FFFA0D的单字节数据存入D6寄存器
; [% B/ J$ M9 a. E: [6 k$ v% z* F+ I) l4 D  G' B. |
只要把11DEA指令NOP掉,就可以实现体力不减,NOP指令机械码是4E719 Y4 N7 w+ T" M0 ?% h/ H

7 u; q( c3 K6 _, V! y5。点击ROM MEMORY进入ROM viewer界面,来到011DE0地址,在Set new value输入11DEA和4E714E71,再点击Set 1-10 bytes写入,再点击OK退出ROM viewer,图5、图6:
4 l# S/ K, z" s3 X' f( @2 `; o* S5 l2 m0 l$ l9 U
. L# A& U7 A% @4 U% C9 C) |! C3 x
注意:在ROM viewer修改,修改结果是不会被写入ROM里,要修改ROM还得用16进制编辑器。
4 e  j) u) f) H3 Y3 y4 e) \$ c$ ]0 t4 @( r
" J& w* B( l7 E! N+ A/ k1 L6。再对11DE0~11DFA这段地址反汇编看看,11DEA的指令被NOP掉,图7:
, ?* X/ ~* J$ J5 F. K+ D, `
% e: ]6 w* g! C# d) [3 F! f" S5 L" s- |( Z/ I- p- t
7。把Set Breakpoint和write的打勾去掉,再点OK回到游戏看看,体力是否不减了?体力不减说明修改成功。图8:
( N" u) T* ^1 I3 M5 m: l; u( r& b7 u
. c& s. l7 V+ v% F
8。打开WINHEX或UE,载入《魂斗罗:铁血军团》日版ROM,来到0x11DEA,把93 2A 00 0D修改为4E 71 4E 71,保存。图9、图10:6 @' j4 q1 N. K" z5 e  r$ j. s
6 G7 X0 d% g" M7 d% r
% Y6 B! G# f) \( S7 V1 u5 }% C. \. t
疾风之狼9 M8 Y$ _3 V' n! z
2013/09/13
3 X+ _+ T( C5 Z# S  A# u
; {' O8 ^4 G" K
如看不清图片请点击图片放大,或至我博客:http://zero3c.blog.163.com/blog/static/278215082013813111414953/ 观看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[发帖际遇]: 疾风之狼花3 个 柠檬买彩票,血本无归T_T. 幸运榜 / 衰神榜

签到天数: 632 天

[LV.9]以坛为家II

发表于 2013-11-12 22:09:04 | 显示全部楼层
本帖最后由 ABC3637 于 2013-11-12 22:10 编辑
# y+ c( d+ V5 k! g
5 g! m, `8 V* _' a4 Z6 P( k# z大力顶下~好贴前,坐沙发。
回复

使用道具 举报

签到天数: 2060 天

[LV.Master]伴坛终老

发表于 2013-11-12 22:51:55 | 显示全部楼层
满复杂的。。。。。
[发帖际遇]: liujunbtx踩坏了花花草草,被罚款4 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 2569 天

[LV.Master]伴坛终老

发表于 2013-11-13 00:02:28 | 显示全部楼层
回档后最可惜的就是那些DEBUG教程了,现在终于等来了重发,支持一下。
回复

使用道具 举报

签到天数: 107 天

[LV.6]常住居民II

发表于 2013-11-13 12:40:30 | 显示全部楼层
好贴必须留名
[发帖际遇]: 猫咪的守候踩坏了花花草草,被罚款4 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 3022 天

[LV.Master]伴坛终老

发表于 2013-11-13 12:55:49 | 显示全部楼层
很不错啊,有空学一学。
[发帖际遇]: 天迹云间扶老大爷过马路,警察叔叔奖励天迹云间 2 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 380 天

[LV.9]以坛为家II

发表于 2013-11-14 20:04:33 | 显示全部楼层
喜欢看到这样的科普帖,顶上去。非常感谢楼主的贡献
[发帖际遇]: drogon49踩坏了花花草草,被罚款6 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 532 天

[LV.9]以坛为家II

发表于 2013-11-17 09:39:28 | 显示全部楼层
看这麻烦 弄起来很简单 呵呵
[发帖际遇]: 啍辤★箛独踩坏了花花草草,被罚款3 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 327 天

[LV.8]以坛为家I

发表于 2013-11-17 18:55:55 | 显示全部楼层
虽然不怎么懂,看看稍微学习下!
回复

使用道具 举报

签到天数: 260 天

[LV.8]以坛为家I

发表于 2013-11-17 20:29:32 | 显示全部楼层
观摩学习下
[发帖际遇]: climb2010 被钱袋砸中进医院,看病花了 1 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 548 天

[LV.9]以坛为家II

发表于 2013-11-18 14:53:50 | 显示全部楼层
有点眼花 呵呵 辛苦你了
回复

使用道具 举报

签到天数: 231 天

[LV.7]常住居民III

发表于 2013-11-21 22:53:37 | 显示全部楼层
这个真不错!受教了!!{:4_92:}
回复

使用道具 举报

签到天数: 229 天

[LV.7]常住居民III

发表于 2013-11-21 23:52:49 | 显示全部楼层
看了英文我的眼睛就开始晕了,为什么不是中文的....
[发帖际遇]: xindiandi 捡了钱没交公 柠檬 降了 2 个 . 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-5 22:29:12 | 显示全部楼层
大佬您好,晚辈这边斗胆咨询您一个关于MD Hack的问题,如有冒犯还请海涵!
2 U4 m0 y4 F4 @* d
+ e( ?$ o3 E5 f& Q- O6 Z. w0 C: b. Y. \有幸拜读了您的教程:
7 Q5 a( P8 U( c% |9 i) O- k& ^http://2006.emu618.org:6180/thread-193604-1-1.html
$ X* W8 Z5 S. g) _
# ?( G" e. k. C& i9 y% F* b跟着您的教程做了一遍,收获很大。
$ Z" l7 s  M( a6 i' D% z; U. d! c/ b* I- a. p- n; T. B- a4 y+ P
不过我由此想到了一个问题:; G" m! Y2 }, Q; G
例如《魂斗罗:铁血军团》体力值的例子
6 ~. y. t' ]1 g9 M" w5 ^2 p; n
1 m* B2 _2 _1 Z- x1 P1 E, M011DE8  7A01  moveq #$1,D57 e; q1 T3 R& x: |. Z* C! l& u9 u
011DEA  932A000D  sub.b  D1,($d,A2)
' C6 a6 V2 Q& F* {5 Q' i* l' C' Q5 \$ z011DEE  1C2A000D  move.b ($d,A2),D6
' N/ E7 }. T1 a1 Y0 q- u0 R( ~4 E5 J4 @  I
实测,在将932A000D改成4E714E71的前提下,再将7A01也改成4E71,不会影响无敌效果。3 B, _" n5 l8 t! {, E
% q  f" A# k$ B, `# E' |
那么我想,如果像下面这样,将011DE8和011DEA处的命令改成JMP,跳转到某个空白处,然后在空白处重新写上011DE8和011DEA处的命令,最后再跳转回011DEE,是不是就可以恢复正常的受伤功能:
* I0 r- j& H: j: q" h& F6 R) |8 Q2 r
011DE8  4EF9000801C0  jmp $0801C0.L( E* B) q. h" {- q, ?
) ?9 {$ k4 L4 D+ G
0801C0  7A01  moveq #$1,D5
9 ~9 ~) ]% c7 e8 l0801C2  932A000D  sub.b  D1,($d,A2)
% i: R& `/ ^: J. f, K3 ?/ V0 V0801C6  4EF900011DEE  jmp $011DEE.L4 X+ g- k! J* ?
" _7 O5 {, y* T! P( ^
011DEE  1C2A000D  move.b ($d,A2),D6
9 C" w$ x! F4 z5 s+ t; Z
' E* V( S1 }6 ^3 A* K* ~9 r9 h然而修改后并未达到预期效果。相反,游戏在角色受伤后立即死机。5 F0 _4 I! u. ~! X6 ~9 d

! p6 k7 w1 [% J) I3 M, Y9 _# C: z) L请问这是为什么?如果想实现这种操作的话,正确的方法是什么?  M& L: v* T& W9 m

' J0 _* U6 {2 d4 }' j之所以产生这个想法,是因为最近在汉化的一款游戏需要对字库进行扩容。汉化已经几乎完成了,然而游戏中的一些小字体区域还存在一些问题,如果不改会很难看。% d7 G, ?$ S3 |/ E4 c1 a
. w( \  M  I) F5 \# i1 Z6 I
这些小字体由于只使用一个字节进行编码,游戏原本只能显示256个字符。我希望将编码方式改为00-EF为正常映射,F0-FF则切换VDP至相应页码。我认为这需要将原本的程序跳转至一空白处之后再进行自由发挥。7 Z* |$ S( W7 {- [
: r& d/ ~9 @' Z7 J& Q$ E
我并没有任何汇编或反汇编经验,所以打算先从最简单的进行尝试。想不到一上来就遇到了问题。4 u0 b8 q7 y$ `; Z
7 |5 j% c; T9 |* d- V+ a  ]: D
期待您的回复!
回复

使用道具 举报

签到天数: 2052 天

[LV.Master]伴坛终老

 楼主| 发表于 2024-4-6 01:40:38 | 显示全部楼层
SchreckgSoldat 发表于 2024-4-5 22:29+ D4 v3 g8 j' A' }
大佬您好,晚辈这边斗胆咨询您一个关于MD Hack的问题,如有冒犯还请海涵!
# e3 O; Q9 k4 n* B$ s8 |1 w$ W8 A$ h( W
有幸拜读了您的教程:

- c4 d7 @6 H9 Y' {0 D5 z. k# c$ i, Y4 V
ROM名称:Contra - The Hardcore (J).bin
5 o* G! n8 }/ c+ ]! Q: @9 Y$ h$ n' N, K/ ?( k+ R- u% v
  1. 011DEA  932A000D  sub.b  D1,($d,A2)        ->4EF9 001FDD00 jmp $1fdd00.L7 F4 A' q$ G' `9 U
  2. 011DEE  1C2A000D  move.b ($d,A2),D6        ->4E71 nop) d/ t: g! c. |6 b
  3. 011DF2  6A02          bpl $11df6
    : g3 g* b4 L& O* d$ r4 \

  4. + W, [+ y* C2 `  C- z+ Z
  5. 1FDD00:
    7 W9 D) T8 J: X" \# N
  6. 932A000D  sub.b  D1,($d,A2)
    6 I! l! w' [& `; R' |- d
  7. 1C2A000D  move.b ($d,A2),D6# \8 _- C, N5 k" i1 C
  8. 4EF900011DF2 jmp $011df2.L
    1 A$ _4 g4 N' X) G
复制代码
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-6 12:18:46 | 显示全部楼层
疾风之狼 发表于 2024-4-6 01:40
8 ]& n; K4 g9 q8 q. wROM名称:Contra - The Hardcore (J).bin

; k$ F9 }5 ]3 Y1 E感谢大佬!6 K5 t- u$ o6 E4 x% o8 ~! n. G6 R
' R9 p! L6 Z3 u( _0 A9 U
请问造成这种现象的原因是什么呢?为什么向后移动一个命令写入JMP就可以正常运行,而像我那样就不可以呢?
回复

使用道具 举报

签到天数: 2052 天

[LV.Master]伴坛终老

 楼主| 发表于 2024-4-6 18:06:29 | 显示全部楼层
SchreckgSoldat 发表于 2024-4-6 12:186 g' R) f' o8 z! F: d( U% ?
感谢大佬!
) d5 A' S' X9 U0 D! s+ Y) |2 x: H0 r& a: m3 @% y, L# h
请问造成这种现象的原因是什么呢?为什么向后移动一个命令写入JMP就可以正常运行,而像我 ...
  1. 011DE0 7A00        moveq #$0,D52 H; U' I& b; j) J& a
  2. 011DE2 6006        bra $11dea  d/ R' P9 ~' }& f) B1 L& \- X6 _4 g
  3. 011DE4 45F8FA20        lea $fa20.w,A2
    3 c$ L$ i0 I; ]4 [% ^: l) R
  4. 011DE8 7A01        moveq #$1,D5; U" m- l, P9 ?- `! p
  5. 011DEA 932A000D        sub.b D1,($d,A2)3 e9 x) [' r" S& i- s
  6. 011DEE 1C2A000D move.b ($d,A2),D6
    ! \- I1 N5 _* ~+ J2 R
  7. 011DF2 6A02        bpl $11df6
    2 ~2 J. v' u+ c; a. w" W2 W
复制代码

/ y! I( _  T) n& Z) \
6 x8 W2 A) e2 k% P* Z你改错位置,011DE8地址指令没有执行到,程序是从011DE2跳到011DEA执行。
0 H$ S. j2 z- p; a1 |
9 D+ x& X5 u  `; l" x* l  v你011DE8改成4EF9 0008 01C0的话,造成后果从011DE2跳到011DEA执行,那么011DEA指令机械码是0008 01C0,CPU识别不了错误的机械码,无法执行造成死机。
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-6 18:35:35 | 显示全部楼层
疾风之狼 发表于 2024-4-6 18:066 Z; J8 O3 _( {3 D- o1 z
你改错位置,011DE8地址指令没有执行到,程序是从011DE2跳到011DEA执行。+ z2 ?/ s9 D# {5 K% @* r0 g
# |/ T: X; r8 r, v
你011DE8改成4EF9 0008  ...
. ]- p$ Z: F' p( A
醍醐灌顶了!非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-8-25 08:49

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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