设为首页收藏本站

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

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

[复制链接]

签到天数: 2032 天

[LV.Master]伴坛终老

发表于 2013-11-12 22:01:29 | 显示全部楼层 |阅读模式
准备东西:68K指令集资料、REGEN DEBUG、十六进制编辑器
- u( T9 x: D, H2 D  n# L% H6 O1 ]* {8 F  P! i+ d
REGEN DEBUG官网下载页面:http://aamirm.hacking-cult.org/www/regen.html
& _6 S% W6 t3 \- A! K! l+ O" L
( F$ E, w: F) n8 G以前写的MD HACK教程是用MD调试器,但这MD调试器在使用过程发现有点缺点,显示机械码只显示前2位,后面地址或数值却没有显示,有可能造成后来新手在修改ROM时寻找不到要修改的数据。
/ y' h+ N; y8 K( e( k- @6 r# \# K" T6 ]
本篇教程考虑改用REGEN 0.972 Debug版来调试跟踪,现在的REGEN DEBUG很强大,可以考虑放弃MD调试器。
; P6 I# }5 ?2 p5 O, p
- b* N" I5 }& r) Y* @8 z8 y8 N以《魂斗罗:铁血军团》日版为例,修改目标:体力值不减
( f5 e: z2 l; D  K! S7 E# ^8 d5 W/ N+ F7 q& f  z( K" e
1。先找到《魂斗罗:铁血军团》体力值存放地址,可通过REGEN自带的作弊码查找功能来找,我找到了,存放地址是0xFFFA0D。
' E& ]5 f: a5 E( J/ _4 z( N* Y$ I( c: _+ D. m7 E
2。选择人物进入游戏后,点击Tools->68000 Debugger进入68000调试器界面,图1:+ r1 A* I" C. s
1 q$ n. m; n# c5 D; v' N6 @
9 E- T! l8 b& e5 S, Y3 {5 ~
左上角框是显示汇编指令,右边是寄存器显示
% @7 v, X& R" g) Z, _) }* e7 N# H" Q9 T  H% k& n9 U8 v
Address Breakpoints是地址断点
4 N3 V' `* I: {1 M9 w6 WAddress Range是对一定范围地址设置断点: |# j0 b. ^5 q$ u- \9 i: I1 s
Register breakpoints是寄存器断点
* }7 M$ m# Q. d2 G# B/ ZVDP Breakpoint Range是对VDP一定范围地址设置断点; _1 v: }8 V# W9 V* x
VRAM breakpoints是VRAM断点
; W6 \$ V' m: x! |Go to address是转到指定的地址
, F1 o' m, y, \. \show disassembly是对指定的地址反汇编4 Y3 ]& x: y  U% Z4 {* K
Debug step是进行单步或N步调试* o1 c( A/ s0 l4 Y# N- N
ROM MEMORY是ROM Viewer! B: l  Q# x) o. h
68000 MEMORY是RAM Viewer
6 L- u0 n3 X: W! aZ80 Debug是Z80调试器& b" g! A8 f7 N" }9 u" r

! M. I3 |# }: Q+ B9 FRead是读,Write是写,PC表示是PC地址,Trace是跟踪(选择该项会在模拟器目录下生成ASM文件)
' b8 \) w# z5 B3 |5 @; i9 V/ z$ _! Z1 z) e7 T" o
RESET是重启游戏,RESET68K是68K重启,RESETZ80是Z80重启! u3 e  x. v: E, U4 n

: Y) ~+ X" J9 J2 }- G3。在Address Breakpoints的Set Breakpoint右边框输入地址FFFA0D,Write选项加勾,再在Set Breakpoint左边框打勾,图2:
: t7 [& \8 g" H  d; ^6 O9 H! I  |0 E6 h, ~& C3 M8 d  T  h: S% R6 z
* L; s+ p& C% p4 A: F$ a
4。点击OK返回游戏,当被敌人攻中时调试器发生中断,图3:$ D3 K2 X3 Y4 r1 |8 Y
  q: b" F& g  y- P& g& y

% j! y# v) ?/ s) E, a7 ]指令停在011DEE 1C2A000D move.b ($d,A2),D6这一行,前面指令却没有显示,用show disassembly把11DE0~11DFA这段地址反汇编看看,图4:
; ]& w1 M4 g, a( `$ f4 F+ Y$ Z" I# M9 `

. W4 d* j1 Y6 `- Z4 E. D现在来分析一下:1 x; ]8 g5 _- i- ]5 I
A2=FFFFFA00
( Z! n. m4 G2 H7 }2 WD1=00000001
0 n* L. ^) R3 r" e' c7 |/ s1 A6 Q6 _$ k- a  r- p, f  G% y" r7 X& f9 [5 R
011DEA 932A000D sub.b D1,($d,A2)  把$FFFA0D(A2寄存器的数据($FFFFFA00)+$d=$FFFFFA0D)的地址单字节数据减去D1寄存器的数值,结果存入$FFFA0D
! s: ?' }; i, Z( D) i011DEE 1C2A000D move.b ($d,A2),D6 把$FFFA0D的单字节数据存入D6寄存器3 Z- }( n- ~$ g& o  d2 T

* @: @7 D; b4 J5 H( M只要把11DEA指令NOP掉,就可以实现体力不减,NOP指令机械码是4E71( a, `( X6 ?; M. z; C3 h+ \$ c
- n" [/ ~. `1 O
5。点击ROM MEMORY进入ROM viewer界面,来到011DE0地址,在Set new value输入11DEA和4E714E71,再点击Set 1-10 bytes写入,再点击OK退出ROM viewer,图5、图6:
! n* @" I+ Z# S: N# C: t( s
5 E3 y2 A1 N/ _7 Z, X. B. g7 X, P( M: R2 `8 x5 k( b
注意:在ROM viewer修改,修改结果是不会被写入ROM里,要修改ROM还得用16进制编辑器。
% ?. ?1 O# X% t
. _, l8 J4 J# j4 q0 u7 d6。再对11DE0~11DFA这段地址反汇编看看,11DEA的指令被NOP掉,图7:
; C1 g0 p( a. b6 g: ^8 k0 u6 U0 [- O
* X' f" L$ O7 q" S
& |! `2 Z/ k+ v4 R$ {7。把Set Breakpoint和write的打勾去掉,再点OK回到游戏看看,体力是否不减了?体力不减说明修改成功。图8:
7 B$ y  ^+ G- z: [) C$ E, Y
; \0 B9 ~5 z, n9 R! g$ q4 ^( m6 h% {1 k1 z1 C
8。打开WINHEX或UE,载入《魂斗罗:铁血军团》日版ROM,来到0x11DEA,把93 2A 00 0D修改为4E 71 4E 71,保存。图9、图10:" ^' u) q$ `* l

" O" _6 F' {! B  y; _& S* o; C& E% N. j% _7 m6 \
疾风之狼  b2 L% j. z. q2 N) k
2013/09/13
% K+ q" e2 p, t5 w! U
# V. n3 K8 k/ E. n3 x, X$ X
如看不清图片请点击图片放大,或至我博客: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 编辑 $ |! J# k9 b6 ?0 T0 c# L: e. J

* h; ?) @) @# D! f7 E$ q: _大力顶下~好贴前,坐沙发。
回复

使用道具 举报

签到天数: 2060 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 2566 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 107 天

[LV.6]常住居民II

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

使用道具 举报

签到天数: 3003 天

[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的问题,如有冒犯还请海涵!
# V9 x$ w0 D7 j& h2 e% s4 Z0 p0 u; H% h  l
有幸拜读了您的教程:  p% a+ T' ^  G2 P, A6 n& g  q- O
http://2006.emu618.org:6180/thread-193604-1-1.html6 y, e% E; Z8 R/ t* n3 i# C5 j! y

( v$ m5 u7 E9 D/ D8 r跟着您的教程做了一遍,收获很大。
% Z8 z% n: T5 Q5 N8 X% @. z1 h$ u. m8 c
不过我由此想到了一个问题:3 K* G# ?5 X! D8 r
例如《魂斗罗:铁血军团》体力值的例子
6 q+ @; Y% c! e7 Y+ ]! L
% q3 g$ ]/ o( P- N011DE8  7A01  moveq #$1,D5
5 m2 B3 o% K, m' g( S011DEA  932A000D  sub.b  D1,($d,A2)
+ ^0 J* ?' k  b. x011DEE  1C2A000D  move.b ($d,A2),D62 |( l# x1 i- E5 @% p' f& U: A* h

2 t$ f$ f8 F( V, [9 \实测,在将932A000D改成4E714E71的前提下,再将7A01也改成4E71,不会影响无敌效果。  N9 t( x' F* P. w, n
" D' ~, E8 G+ ]. z! a
那么我想,如果像下面这样,将011DE8和011DEA处的命令改成JMP,跳转到某个空白处,然后在空白处重新写上011DE8和011DEA处的命令,最后再跳转回011DEE,是不是就可以恢复正常的受伤功能:+ ]- K3 c0 ?) M' ~0 _0 k% L9 S
* [" i: d2 E+ K( R& a8 w  ~
011DE8  4EF9000801C0  jmp $0801C0.L
* U* W/ M$ M- d" V5 q. S) c
* I* b) Q" A. ~0 b' N# f/ z3 u0801C0  7A01  moveq #$1,D5
7 k4 M7 [5 {/ D% j0801C2  932A000D  sub.b  D1,($d,A2)
$ S4 N, V/ k3 N" T. [0801C6  4EF900011DEE  jmp $011DEE.L8 I( W* R3 V' r
( y+ M0 I. [7 {* X; h& e& k4 O
011DEE  1C2A000D  move.b ($d,A2),D68 K$ Q' t2 |" q5 H" F& |8 y
0 m+ g* c8 _& q* ]+ D; ]) v$ Q4 G
然而修改后并未达到预期效果。相反,游戏在角色受伤后立即死机。7 g& f: U; P: n

( }) E6 y+ G4 E- i% Z2 h) k6 h请问这是为什么?如果想实现这种操作的话,正确的方法是什么?* J' b6 l, l3 t+ e  Y% M- w3 x/ X
% @1 m9 Y- d5 A& i" ?, f
之所以产生这个想法,是因为最近在汉化的一款游戏需要对字库进行扩容。汉化已经几乎完成了,然而游戏中的一些小字体区域还存在一些问题,如果不改会很难看。+ Y9 g$ |) A3 v% v" p) @+ r

$ n/ D- \/ W2 C" m1 @这些小字体由于只使用一个字节进行编码,游戏原本只能显示256个字符。我希望将编码方式改为00-EF为正常映射,F0-FF则切换VDP至相应页码。我认为这需要将原本的程序跳转至一空白处之后再进行自由发挥。' Q- T9 a8 |' l8 y& l" _
& N$ E% d' r. D% R8 w) m0 k
我并没有任何汇编或反汇编经验,所以打算先从最简单的进行尝试。想不到一上来就遇到了问题。) Z# q: y% h0 Q3 z) [

( j+ I) t# Q$ e) k' N# g期待您的回复!
回复

使用道具 举报

签到天数: 2032 天

[LV.Master]伴坛终老

 楼主| 发表于 2024-4-6 01:40:38 | 显示全部楼层
SchreckgSoldat 发表于 2024-4-5 22:29
3 I% L! M, n+ I4 ^$ v0 ~  }% W7 j8 Q大佬您好,晚辈这边斗胆咨询您一个关于MD Hack的问题,如有冒犯还请海涵!5 k% W' `* |# @6 B

( L- x2 M9 G2 A0 x有幸拜读了您的教程:

2 |  h1 Q/ W. Y" c' X: w% P8 C! f! F% ]5 ]0 B4 b4 G9 w- u
ROM名称:Contra - The Hardcore (J).bin% a2 U) D+ u& [8 G% \) W
; U, E7 m  q1 L& _
  1. 011DEA  932A000D  sub.b  D1,($d,A2)        ->4EF9 001FDD00 jmp $1fdd00.L
    6 S# X6 {0 `0 t% `4 q$ O
  2. 011DEE  1C2A000D  move.b ($d,A2),D6        ->4E71 nop
      ~! |: `+ T( O1 F  T- [1 R2 j
  3. 011DF2  6A02          bpl $11df6% P& K; G* ~" A; ~% V- Y2 m3 p# u

  4. 3 |4 w/ T) Y* y2 f3 ^
  5. 1FDD00:4 ?) a$ Q6 F( n3 X: M/ e
  6. 932A000D  sub.b  D1,($d,A2)) U% D" b9 _7 Y: Y& k
  7. 1C2A000D  move.b ($d,A2),D6
    ( n$ v( |! Y  t8 A& z$ R# r( a
  8. 4EF900011DF2 jmp $011df2.L
    ' t  N1 h4 h& t( Q
复制代码
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-6 12:18:46 | 显示全部楼层
疾风之狼 发表于 2024-4-6 01:405 [5 a6 g! c1 S0 P& ~
ROM名称:Contra - The Hardcore (J).bin

$ h# r" w1 J2 S3 @9 Y5 M) _- m" y1 y感谢大佬!+ v" V- J, D1 A* w) i

4 `4 u! x" {7 f/ G) t请问造成这种现象的原因是什么呢?为什么向后移动一个命令写入JMP就可以正常运行,而像我那样就不可以呢?
回复

使用道具 举报

签到天数: 2032 天

[LV.Master]伴坛终老

 楼主| 发表于 2024-4-6 18:06:29 | 显示全部楼层
SchreckgSoldat 发表于 2024-4-6 12:18
5 k& ^7 c2 s* P4 K$ t$ _, j2 Z, m感谢大佬!! d; Z+ t1 q1 M# ]) m5 ]

6 [/ v% ^1 X. S) F% r请问造成这种现象的原因是什么呢?为什么向后移动一个命令写入JMP就可以正常运行,而像我 ...
  1. 011DE0 7A00        moveq #$0,D5
    % p, ^5 d# j& v8 c- Y) N
  2. 011DE2 6006        bra $11dea
    7 z( Z1 l0 N5 C7 o3 {$ `* @
  3. 011DE4 45F8FA20        lea $fa20.w,A2; ?. f( n* H( \; o/ g3 V8 `
  4. 011DE8 7A01        moveq #$1,D5
    + D0 _% m* Z5 i1 q! |, n
  5. 011DEA 932A000D        sub.b D1,($d,A2)$ z: x8 \: J2 [* p7 @- L
  6. 011DEE 1C2A000D move.b ($d,A2),D6
    5 F$ z! e4 l* T9 M! _2 o4 q7 S
  7. 011DF2 6A02        bpl $11df6
    * Q0 V5 E- k( f+ O% r
复制代码

  C+ {# l" Z$ R; U- Z6 K3 n3 @( W9 s+ m- N5 ]& R& p4 O. w$ ~
你改错位置,011DE8地址指令没有执行到,程序是从011DE2跳到011DEA执行。
; B2 ^1 Z+ R0 J8 J! j2 F6 j( g1 j4 S& T, |2 i
你011DE8改成4EF9 0008 01C0的话,造成后果从011DE2跳到011DEA执行,那么011DEA指令机械码是0008 01C0,CPU识别不了错误的机械码,无法执行造成死机。
回复

使用道具 举报

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2024-4-6 18:35:35 | 显示全部楼层
疾风之狼 发表于 2024-4-6 18:06
5 u3 T; U  h& o7 Z% @/ e你改错位置,011DE8地址指令没有执行到,程序是从011DE2跳到011DEA执行。
. D5 G& L% X9 Z0 G  y% {7 R
/ y8 a7 _6 u" Y# s0 s你011DE8改成4EF9 0008  ...

# L  i' |4 U  t+ ^, D) r) f醍醐灌顶了!非常感谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-5 02:59

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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