EMU618社区

 找回密码
 立即注册
搜索
查看: 2068|回复: 4

[转载HACK教程] 游戏修改基础知识(游戏特攻队GameSF:Thor撰写)

 关闭 [复制链接]

签到天数: 1909 天

[LV.Master]伴坛终老

发表于 2009-3-9 23:14:36 | 显示全部楼层 |阅读模式
游戏修改基础知识
8 m( g( l2 }- |4 U; ^* ^! E5 m: i. \2 H) m& E' n! p0 C

' W* W3 u; c" U- M! P游戏天使语:本来不推荐这篇东西的,但太多网友需要了,本着为大众服务的思想,贴出来了,希望大家在修改的同时节制一下。/ c/ t- I1 Q8 d3 Z( Z
8 Z( d+ r. K+ O2 n# l+ {8 Q! n
; L: a" p$ K# d9 A/ V* h0 }
第一节 理论分析9 L) N" z5 b9 I( ]8 |
* W( k: ~/ T8 v
游戏修改并不是什么难事,首先要认清游戏本质,在修改之前,要清楚“自己所面对的只是一串数字”,修改精华和难点也都在于这里,阁下能不能成功的把这串数字和游戏中的HP、MP、物品、魔法等一一对位将成为整个修改全局的中心点。
* y0 H) B3 N1 T- @
8 d' e/ d5 H, ~+ j2 H$ j因为PC不同于街机和次世代游戏机,PC的硬件和软件都是开放式的,才给我们以修改的可能。% i3 m2 y8 J2 N& H& r

" f5 F2 k+ F' D要使电脑执行一程序(这里就是阁下所谓的“游戏”),它首先把重要的数据读入内存。当阁下发出存盘命令时,程序自动将有关数据存入硬盘。游戏修改就抓住这两个环节,或改写内存中的数据(称为动态修改),或改写硬盘上的存盘文件(称为静态修改)。
0 d) M! m/ B  R3 |/ I( ^/ w9 c+ ?4 ~* m6 c2 N# {* ^

+ d- N( {1 e9 q: {动态修改,常规步骤如下:: s. F. E' e! N  i) R
1:确定欲改数据,记下它的值。, J4 u& @$ z0 U: _  ?
2:呼叫修改器,在数据栏里输入欲改数据。
' q) b4 |% F# \$ t* n3:回到游戏中,想办法改变欲改数据(比如,花掉一些钱或吃药加点血等)。/ u1 W9 }3 {( t) ]
4:再次呼叫修改器,在数据栏里输入改动后的数据。; A$ I* B4 [0 ^' G* f7 X$ Z# U7 Y$ K

# I4 T$ C) L6 |! |如此基本上就可以找到数据了,但有时找到的数据地址有多个,那么还要再进行一次或几次原有数据地址基础上查找。这样做实际就可概括为“筛选”。找到了数据就能改了,但有时无论怎么找都有两个以上地址,那么就把内存数据列表打开看看,一般来说,会有其中一个地址的内存数据非常简洁,那就是这个了。如果每个地址的数据列表都是差不多的,那干脆都改了。3 ]- ^1 o0 t7 k9 d/ z* T" c5 K
5 M0 T- W1 [$ x6 Q; U3 f/ D5 J
改数据的基本方式有三种:
2 c* Z- w% K0 C1.普通修改,是简单地把数据改过来,一旦修改数值应该发生变化,则修改数据会在修改基础上进行应当的加减变化。
' l8 k% M* N7 w9 k4 I6 J( o1 o, ~+ @8 ?2.锁定修改,修改器自动把数据锁定,如果修改数值应该发生变化,修改器也会强制此数值不变,或在极短时间内修改器会强制此数值变回玩家所规定的数值。
& s5 B) F! d( i4 O3 e, t7 T3.热键修改,可以理解为“手动锁定”,即数据改变后按一下设定好的热键,数据马上就又回到了设定值。
) e3 {1 y1 f% N# Z3 P
0 y# x8 c$ }# Z2 `静态修改,一般是利用存盘纪录的数值差找出地址,进行修改,一般为普通修改,多用于不支持切换的游戏,或防动态修改的游戏,需修改量大等情况下。+ Y  a+ k* Q3 Z7 C# b9 d' R

4 m6 m8 x3 R: E) y& U, c- E多数游戏中都有各种可用数值来标定的属性或特性,譬如RPG中的经验值、生命值,动作游戏中的弹药数和金钱数等等,这些都可作为修改对象。更高级的还可以通过修改程序中的代码对一些道具进行修改,其实质都是因为游戏是用数值编写的。但数据的存放和大家的平时习惯不同,一般存为16进制、10进制、8进制、2进制,而且会出现数值“倒装”譬如对一个数——9999,转为16进制为27 0F,但在电脑里的存放则为0F 27,正好两位想倒,所以一定要注意。
6 m3 A! I0 |/ p
4 |) J$ [: L* i" h; j& e2 o* U对于初学者来说,一般还是选一些明显的具有数值属性的目标修改,待积累了一定经验后再深入。7 T2 z. M" O4 |% Q2 Y- q( f

) r/ j3 S( ~% `1 S& [1 U- A+ W另外,游戏修改一般要有游戏修改工具,在学习下面的课程时请拿好阁下的家伙,动态修改如:金山游侠、东方不败、Game Master、FPE等都很适合初学者,静态修改如JediEdit、UltraEdit、HEX Workshop等,另外静态修改有时也可以利用动态游戏修改工具完成。
6 K6 v) n2 h+ h, N5 v' {总之,修改游戏比起编程、解密一类的要简单得多。记得有人说过:“游戏是通向电脑世界的捷径,那么修改游戏则是捷径中的捷径。”
' a% |: x6 R$ x4 e) j) ^% O5 }
  X2 h9 A% r- |* [$ z5 L第二节 进制换算
" J- B5 R8 s0 L- s% b4 P- A4 ~
1 {, u$ y8 z) g) a1 S- Z% |$ y, N" B大家在生活中一般接触较多十进制,即1+9=10,有时也接触到了60进制,比如60分=1时。以上是逢十进一或逢六十进一的。其它进制还有二进制,三进制,四进制...n进制,只要数得出来都可以。电脑(特别是对于游戏来说)一般采用二,十,十六进制。3 f( l( K1 M& q5 M7 D+ e, R
3 U1 c& v5 f' [% F3 s8 z  A
现在的Windows都自带计算器,进制的转换可以不用手算,但是实践中进制转化会对修改者意想不到的方便,所以劝告大家不要松懈,把它当作基础的基础来学习。
! r, a4 l3 N, P8 T8 D2 \7 G7 t' b' }+ v
首先学习几个概念:基数,权值。
4 [% y5 @3 D5 a3 |! d# L/ C
, d. s; X( c: M8 Z1 |逢n进一的n就是基数,基数为几就有几个数字,如二进制基数为二,则有0,1两个;八进制基数为八有0,1,2,3,4,5,6,7八个。总之从0开始,最后一位位n-1。而如十六进制等基数超过十的,从十开始为A(相当于10进制的10),B,C,D,E,F(相当于10进制的15)。
% b. \, B2 f+ i3 L$ t/ d; S9 m/ `5 [0 ]6 X5 ^
权可以这样理解,一种进制的某一个数的每位都有一个权值m,并且权值为位数减一,如个位上的数的权值为0(位数1-1=0),十位为1(位数2-1=1)。+ p1 k1 Y1 J6 Q) }
5 D5 V7 [4 {5 d" W+ q
各个进制之间的转化一般分为两类。/ q- m; _/ R( M) O# G; D* f& ^
) r9 S# O2 w; B
十进制转换为其他进制:可以概括为“除基取余”。如十进制的12化为16进制,12/16=0余12,但十六进制是用C来表示的,所以十进制的10就是12进制的C;又如十进制30化为十六进制,30/16=1余14,第二次用商14/16=0余14,则十进制30转化为十六进制为1E(由后往前取),其他类推。十进制转化为二进制也是如此,如9/2=4余1,4/2=2余0,2/2=1余0,1/2=0余1,也就是1001了。10进制转化为其它进制,也是一样,但不常用,所以就不说了。
3 \, o; w* p( Z$ y+ p% ^3 E
7 j  g& j" O4 e7 l  n其它进制转化为十进制:可以概括为“按权展开”。知道了权值m,就可以转化了。 首先,每一位的位数乘以基数n的m次方,如八进制个位4,4x8^0=4(8^0等于8的0次方),百位4,4x8^2=256.最后加总。
6 b1 ?( U5 N& H  B' ?" a' }" N& k" N
另外一般默认十进制以d结尾,八进制为o,二进制为b,十六进制为h。9 N3 g3 d7 `+ {' v

" q+ ]/ y6 U7 |# e================================================  @1 |: {  Z5 P3 f; j/ V8 d3 K+ B
下面来练习一下:
4 m. O# S5 x5 v. h1.420d=( )h
  G9 }4 k- @$ L7 S* O  j0 z! b6 ?2.420h=( )d
1 u2 s9 `: z$ P. Y; w3.110100100b=( )d/ Z/ z" D# f, K, S
4.420d=( )b) `8 l- h: k0 ~
================================================
- U* ~7 Q6 V: U' p$ `答案:1、1A4;2、1056;3、420;4、110100100. i& n; l. X- j5 H& M0 k: W
================================================
8 _& D6 ~, I% b4 t( C" Y0 g1 M! u' [1 G3 `9 @
2进制和16进制的转化:有些情况中,常会遇到2进制和16进制转化如果通过二进制转换为十进制,再转换为十六进制完成,有很大麻烦,下面有一种方法,提高效率。
' ?# L9 z( q2 k  W
. ^+ v: r" r: i+ }二进制到十六进制的转换。我们可以将二进制数由右至左分为几部分,每一部分有四位(因为2的4次方为16),不足四位的补0,如10111b,可分为0001(补了3个0)和0111两部分。然后将两部分分别化为十六进制,第一个是1,第二个是7。最后合起来,为17h。
7 X2 ]% Z) ?0 z/ I1 J9 b
0 o5 s0 Z1 z; m! d十六进制到二进制的转换。同理,我们可将十六进制的每一位,一分为四,再合并即可。如13h,分为1和3两部分,在一分为四,0001和0011,合并去0,就是10011。
* o( M# X% G! p0 {
. P. {/ P7 `& \  O) j! I! s0 Z进制的转化,就讲到这里,修改的一个要点,相信阁下已经掌握了。# {; g6 ^9 l7 r) Q7 k) T& E

- x7 E* P# p( O1 h# a# S/ K第三节 数据存储
5 x( }6 B* r* h' m* R6 b
1 s5 z8 l: Q$ c位、字节:+ B5 g- A) j( ]" G

7 l  |8 c  l/ p: V& h在前面,大家知道了二进制的权为2,即它只有0和1两个数字组成,表示及运算都十分简单。因此在计算机中就把它作为数据的基本单位‘位’(bit),然后再把八个这样的位组成一个字节(byte),如 1001,0011。
& q1 t1 j5 c( N7 K. E
: c5 Q7 p7 A1 ]! q1 M好了,运用前面的进制转换知识将二进制1111,1111转换为十进制,为255,于是可知1字节的表示范围是0(0000,0000)--255(1111,1111)。在计算机中常用来表示数据的有二字节,四字节,八字节,十字节等,他们都可依照上法求的范围。(在FPE2000中的8,16,32就是指一,二,四字节)。2 d, }* `5 R# k7 K  W$ a
8 q( C0 V( t/ u! T" w
另外,浮点数(即带小数点的小数)一般用四字节以上表示,视精度而定,对于初学者,也就不多说了。
5 N( n* v- K9 g; x# U9 I3 B1 j4 q- ?2 C
原码、反码、补码: & {) z8 A7 W: Z, i4 l
$ }* C: Y! K7 z1 }; B, f+ E
原码:一字节数据可表示的范围是0--255,那么负数又怎么表示呢?计算机中是这样规定的,用一个数的最高一位表示正负,0为正,1为负。例如0111,1111转换为十进制为127,1111,1111转换为十进制为-127,由此我们知一字节的范围为-127--127,其他字节的范围类推。
" w  i! @- N6 l
$ N3 w* {3 [3 z反码:上面讲的都是原码表示法,可在计算机中的数据都是以补码存放的,只有这样才能减轻cpu的负担。提到补码,就不得不提反码了。计算机中是这样规定反码的,如果是正数,则按原码形式不变,如127仍为0111,1111;而如果为负数则,第一位为1,其他各位取反(即0变为1,1变为0),如原码-127(1111,1111),表示为1000,0000。. U: q, q$ k* t) r7 {. j
& G( g. O; e, z$ K5 q" v
补码:补码同上,如果是正数,则按原码形式不变,如127仍为0111,1111;如果为负数则除第一位为1外,其他各位取反加1,如-127,先取反为1000,0000,然后加1,为1000,0001。但1000,0000比较特殊,用它来表示-128,由此我们知补码可表示的范围是-128--127(因为-64d为1000,000b反码为1111,1111b补码+1不能用2byte表示)。
" Z  z( j4 A. U9 U$ O7 @. r  y. W8 u, @$ J6 o! }2 C$ x$ g+ H
数据存储:
" A: |& F; M. }) E* q8 o: t, k" L- D. ]( a
现在把所有的有用的数据集中起来放在一起,并取一个名字来代表这些数据的集合,这就是一个文件了。如存盘文件就是将游戏中某一场景的关键数据集中记录到一个文件中,那么下次读取这些数据也就可以接着玩了。4 E$ u; ~: l1 b* Q( f, J1 y6 x

7 A9 u! W# c4 A# D4 L而且我们知道文件中数据的存放是有序的,以字节为单位,分别给他们编号,第一个字节为0,第二个为1……一定要注意的是第一个字节是0而不是1,这在后面会多次碰到。在许多地方所指的地址就是这些编号了。如一个二字节的数据,其第一个字节的地址为3,则整个数据的地址就为3。- `) D! O; u1 N' F1 Y+ M% L
另外注意的一点是,在内存(即文件)中二,四等多字节的数据,其存放的顺序是颠倒的;十六进制AA BB,你在编辑工具中将看到BB AA。
' a8 U& l5 q! d& i8 m
/ I% u, B7 m: b7 C游戏特攻队GameSF
: [/ K) b5 y: T- r! h) y0 MThor撰写; ?8 y" \6 ?8 b7 k% a

' p9 N0 C3 c% C+ @+ c+ g7 M[ 本帖最后由 疾风之狼 于 2009-4-10 19:36 编辑 ]

该用户从未签到

发表于 2009-3-10 00:19:30 | 显示全部楼层
沙发啊!
  ], n9 z  d- w3 \! \8 R说真的,这些东西我还不懂呢

签到天数: 41 天

[LV.5]常住居民I

发表于 2009-3-10 14:24:18 | 显示全部楼层
这个对新人很有帮助滴说···:good:

该用户从未签到

发表于 2009-3-15 17:08:16 | 显示全部楼层
可惜' `! |& ]8 |# }) X# b' r( f
我的数学不太好

签到天数: 6 天

[LV.2]偶尔看看I

发表于 2009-3-15 17:13:52 | 显示全部楼层
这个其实含义不大0 K6 o3 }4 f* S
" e2 y  j& }/ p5 P6 b1 g
2进制教学对新人反而是个障碍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-4 18:41 , Processed in 1.144531 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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