EMU618社区

 找回密码
 立即注册
搜索
查看: 4013|回复: 12

[原创HACK教程] CheatMaker教学进阶之一 - 基地址与指针

  [复制链接]

签到天数: 6 天

[LV.2]偶尔看看I

发表于 2011-9-30 21:49:05 | 显示全部楼层 |阅读模式
本帖最后由 银河漫步 于 2011-9-30 23:11 编辑 0 A# [4 O3 ~% i- v& D

' e# u/ E+ I9 x基地址的查找与特征数据
' q; ~! I/ ^% v2 ]+ F% k; F# Q(指针部分的使用说明在二楼,对基地址没兴趣的可跳过)
" G, L2 A8 J. ]4 @3 r/ M  _* M* M$ p5 ~
  所谓基地址其实就是指针,其用法和指针的用法几乎相同,但是只所以区别开来还是因为模拟器这种东西,每次模拟游戏时游戏里的数据都是相对于某一个地址的偏移地址,所以与其每次都取写这个指针,不如把这个地址记录下来作为这个模拟器的基地址,则可以在做相同模拟器的游戏的时候方便很多
- F: [) ~! g! w; W  指针怎么查找?CM其实目前没有反汇编的功能,所以关于指针的查找还是建议使用CheatEngine或者OllyDBG,我个人推荐前者& a8 C  {& [! Q  V/ [
  CheatEngine简称CE,这软件功能十分强大,但是直到6.0版本,对于修改器界面的设计始终功能比较简单,无法做出比较随心所欲的修改器,而纯粹以编程的方式去处理修改器界面则门槛相对较高,所以也有了CheatMaker这一类的中间软件层的存在,所以就笔者我而言,是属于用CE寻址,然后用CM实现界面设计的这一类人(另一说,CE 6.1的版本已经可以推出了比较好的修改器设计功能,但是到目前为止笔者尚未研究出头绪…)
+ A7 F( H# q5 q" Q" u. F7 Z8 \) w1 i  u4 M- @( q6 ^1 b7 Q
以SFC模拟器:Snex9X为例子,模拟器版本Ver 1.52,游戏三国志III,如下图查找金钱+ L% {+ M! j4 [

* h1 W2 P. U  B& G2 `9 q, N4 A
4 p1 L3 U) b' e" D" Z$ r5 @; W8 u1 X( ?6 y% L6 ]
得到了唯一地址:013BF460
% R/ z* ?) r$ \
3 `! {+ l% u/ r  E, l( C
7 g, _% M4 h, ]2 `
6 A& k' F5 f# }) G7 l; D" h, j然后对这个数据跟踪,得到一个可能的地址指针值,注意这个地址指针值的013BCBA0是对应ESI的值,而EBX的值是28C0,这个是指的平原金钱的偏移地址
6 c% Z( X$ K$ e4 w值得注意的是[ebx+esi]的模式esi通常将不是固定值,这种时候,指针的好处就特别明显了,因为每次用模拟器模拟同一个游戏,对应的数据的搜索的绝对地址往往都在变动( b& i* W+ R; z* O* W. z' W9 s
但是相对esi的ebx的偏移地址则是固定的
* C& a9 U6 n2 a% h3 [7 t6 C1 O
8 Z, L6 e1 ]' Z! K  D. N( Z( Q3 h) R" r$ j; k5 o& {' f

' n' s& ]2 H" b  t1 z4 ]! W直接搜索相关这个地址的内容可以得到以下结果
/ X, E+ I7 [& r
2 K' m6 e' f" \; W6 T6 |- g* u
1 Q+ T8 Z5 v- Z3 E8 @) v- i) m$ u  S0 A& ^
$ q3 J  y, ?$ y1 m0 ]如果得到的结果很多需要做一些进一步的测试和跟踪, 其实这里搜索到的这些都可以作为这个版本模拟器的基地址,比如任意选择一个0076448C6 O1 e5 J! T* m7 |/ ^+ O& [0 g

+ X% A1 h! R5 S1 d0 R- A: R+ M; y' |
% ]) ^/ }2 `& {. R8 i  M: I" [
我们可以看到,指针指向的地址的数据已经和原地址数据一致了 ,这里的28C0是之前的ebx的值,就是刚才平原城金钱的相对偏移地址
- [3 B6 ]- F1 @) G那么我们把这个指针添加到CM的支持程序管理6 T0 Y/ z2 U3 n' R' s8 C
1 P+ X' ^; c8 d: _* J+ {/ \6 c
# r- H+ @1 o9 e0 i8 a& W+ H' X
' _/ ?: n8 A9 j/ R% ^
  a: m( G0 U( v+ K- Y1 H. K8 b! q
这里的最大偏移量是指的相对于这个基地址所指向的地址,最大允许的偏移量是多少,SFC游戏几乎不会超过20000,但其实这里填0表示不限制,也没有关系" Y- p+ K7 l- n" U+ X
添加完毕后,我在CM里搜索平原城的金钱地址得到如下图片
' L! U4 e) ]" a2 v( {. N' G7 p; [$ R9 P$ w7 B$ W; a% G( r2 ?( K
9 Z) a% o# q% A; Y0 D$ @) D, ^

( ]* z* `. N7 j- v- ?4 z这个时候,对应的CM地址等于了原来的ebx的值,即这个金钱地址的相对偏移地址,我们的基地址添加成功了
; F/ `7 ]5 f% x, ]# h: Y
9 b8 {8 g/ z2 S9 H  A但是这么添加基地址,仅仅只是支持了Snes9X Ver 1.52版,如果用户换了一个版本的模拟器,则将出现不支持的情况,这是因为一个程序的升级通常会让基地址发生变化,所以在模拟器里要能够支持一个系列全版本的模拟器,就需要使用动态定位基地址的方法,于是采用了“基址特征数据”这个概念
/ O* |6 h) R( S& b: n! L. e6 ~- w% {7 \/ x6 g
回到我们之前的搜索出很多基地址的那个步骤,这里选择基地址其实是有诀窍的,我们启动另一个版本的Snes9X模拟器,模拟同样的游戏,同样搜索平原金钱的地址指针
9 w: X& ~5 |1 W3 d: `我们保留之前的模拟器进程和调试器进程,同时启动不同版本的模拟器进程双开另一个调试进程来进行跟踪调试以方便对比. G2 P# X# _9 p( w% ?: ~/ M

) `! Q9 Q3 k  R' N* B8 a- s' Y, v0 E% \4 X$ \

! m, @7 q0 o5 |% s6 ]4 m3 h采用同样的方法得到了 也可以得到基地址列表
0 k' p4 V- [* @4 Z7 {9 G那么现在需要从这些基地址里面找到可以通用的特征码,这个比较考验经验,查看特数据的方式可以右键点击任意基地址,点击“反汇编该内存区域”4 Z! i8 s3 {% ]; r
然后找到两个不同版本的模拟器之间的通用的一个基地址特征数据,如果找不到甚至要开始进行2级或者多级指针查找
5 `2 G/ P/ ?0 [: \3 P# F所谓的基址特征数据就是指的通过一段内存数据的搜索可以定位到一个固定地址,然后通过这个固定地址增加一个偏移值就可以定位到基地址$ n" e1 ~9 U) C/ H: m' c# }
比如这里SFC模拟器SNes9X我们就用2级指针来进行基地址搜索以及确定基址特征码,首先以0076448C作为一级指针来追踪二级指针
1 d4 Q+ V' R! {(如果这里对于多级指针的查找和添加方法看不明白的,请在网上搜索CheatEngine八步教学的教程自学一下)/ {5 B8 W) e  v; P" J3 g& Q) e2 u
+ R8 i& Y) o% l* K3 i
$ t) I  }2 J# E. d/ {3 H

- M; o8 I1 _9 R# t+ \重新读取一下游戏就可以找到以下代码3 U4 |8 I7 a( s

5 {) `" q- R! \4 Q+ H
, p4 h2 m1 Y6 a5 l* d3 w, k/ s% R0 M
使用深度扫描可以找到对应007311C8的指针2 b' e# k- O5 E: A
  x- @: [+ w( r7 H1 l; h: _) N

7 \! ^' ^* Q0 J5 m2 z" b1 C2 |# U  d! N7 J7 }, V* Z6 z, z* P* s2 `
这个时候对于基地址的添加就多了一种方式,使用2级指针进行寻址,这时候【附加数据】需要填上1,才能正常寻址
- v* p5 E" s, C. l& b4 e5 d" A, C2 N( {: z7 ]

& a& Q: q# k7 |- b! Q3 E2 }/ d" A2 _/ G5 i; p& r! L
改完后我们可以尝试搜索平原的金钱,可以看到添加2级指针的基地址的结果和之前的效果相同
% N4 L4 e" b& g/ t' d
1 Z+ c8 @8 [# |% [8 M+ b
5 j7 b) @/ D+ {$ Q' {( Q* Q  k- }/ w1 j0 e7 Y$ `
但是换一个版本的模拟器时同样无法使用; z0 J3 @1 M  L  T7 k9 X
所以我们对于其他版本的模拟器以同样的方法和选地址方式进行这个2级指针的寻址,得到对比结果如下% r6 q+ k0 ]% F2 m3 g
( w% L' P( U( c/ O3 [6 l: }$ U1 P

. u/ [8 L2 Q" i+ k$ c9 g8 f+ U
: a  x8 H2 t& V. i+ ~6 u可以看到两个版本的模拟器,对应的2级指针地址很接近但并不相同,那么我需要一种可以自动定位到各个版本的基地址的方法,这种自动定位的方法就是“特征码寻址”
* f: T7 q6 \$ Z/ P/ i5 j$ v: `( O我们分别对上图的红框内的2级指针地址查看反汇编的代码,如下图* O8 f' f3 ^# R) r& M) e

$ @0 \8 \4 s# z+ Y& s% ^& _
. n6 w% H5 |& [9 ^5 {; X! o
- P7 v- ~) @7 d7 k* h! y然后又可以得到一个对比图,下图中选中的部分就是相关到2级指针的地址的代码4 T! n) [) N( v; l9 M% L7 o- b  v# F1 Z

3 @# x( V$ _+ z0 P+ L) _9 |
5 ]. ~$ V% V; l" M3 ^5 c/ S/ {! N1 C: i& L$ O
通过观察可以看到,虽然2级指针的地址和代码不同的模拟器版本有一些区别,但是在这段代码前两者确有一段共同的代码:2B C7 48 C1 E0 05 504 i+ v) F& G/ L6 L! i, X
我们不妨对这段代码进行搜索,如下图,注意反汇编里看到的字节搜索的时候要反过来,2B C7 48 C1,搜索就要搜索C148C72B2 }/ s% X; T1 ]0 f2 J
4 }) |1 D  z: d9 U' @' X* v
/ ]1 I1 _3 ?' `' B
: m1 }. A# |- [8 v, f+ B4 B: C; f
非常幸运的,这段代码在模拟器的程序里具有唯一性,那么我们就可以通过这段代码定位到之前的2级指针的地址
/ H5 ?+ y& J5 P: W这段代码的地址是00409664,2级指针的地址是00409674,两个地址之前相差10(H),那么我通过定位到00409664,然后增加10(H)的偏移就可以得到2级指针的基地址00409674+ H) X( O( N$ q  a, x9 S
我们在看一下另一个版本的模拟器,这段代码定位的地址是00409FD4,而2级指针的地址是00409FE4,差值也是10(H)3 u( D4 D2 y0 Q( D9 o
那么这两个版本的模拟器的共性我们就找到了(这种共性肯定不止一处,这里只是介绍方法)# }( Z! y) W8 h2 E1 n9 ^2 v
最后我们就是要把共性统一成模拟器的基地址
! P- K2 b- j* O2 n4 o: }% y2 K  g& J3 I, U/ b; T

/ w* D2 Z$ o: s: u1 |+ u& ]! L- _2 k
% ^5 X  l) p& b$ X6 m$ C& i这里的基址特征数据就是用刚才我们所说的不同版本模拟器的共性进行定位到基地址,而这里的附加数据“5”表示找到的基地址的指向的地址的偏移,我们再把前面添加2级指针的基地址的图来对比一下) e) i& ~3 E+ l& Z" Z& J' E4 m

! ?$ L/ N1 ]: x1 w5 T
  j* K3 Y" f& h/ @; o5 G3 B" F. r( e  k: s9 |* p# x
按照基址特征数据的方式,我们尝试一下对其他版本的模拟器搜索金钱地址的结果,之前我搜索的是Snes9X 1.52版,现在我来搜索1.53版0 P5 q2 n. E: C, Y: V

0 k0 e4 \6 Q, U
$ M4 s6 V: a4 ~5 ^7 b) k0 E  S9 j" V3 n) X+ t9 p6 r0 g0 o
. g, _5 X# [6 B2 }+ d
我们可以看到,现在两个版本的模拟器通过特征地址的方式统一了搜索的结果,但是这样其实我们还只是作出了通用1.52和1.53两个版本的模拟器: T- ?$ t: P- |) F# l, E" ~
如果想作出更大的兼容性,则还需要拿更多的版本的Snes9X来做这种共性的测试,最终找到一个共性地址
' D) {; M* L# [  @0 Q值得说明的是,这里的基址特征数据可以用?做替代,比如2BC748C1E00550作为特征地址码的话可以写成2B??48C1????50,这样其实可以模糊出更多的版本共性出來
; }6 q5 T5 p' x" G: y! [本文可以看作一篇实例教学,关于附加数据和添加说明写法的详细说明. t- \. {6 r: k% w4 `
还可以参考http://www.cheatmaker.org/Help/supportDoc/supportDoc.html; o1 {4 E, ?7 ]" j  f
这里最下面的位置写了各个基地址和附加数据的写法和作用1 c; Z3 I' B9 ^2 P# T6 Z# Z' ]
; x' c% e7 n7 S! y

本帖子中包含更多资源

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

x

签到天数: 6 天

[LV.2]偶尔看看I

 楼主| 发表于 2011-9-30 21:49:49 | 显示全部楼层
本帖最后由 银河漫步 于 2011-9-30 21:52 编辑 , S' V1 b& X. P8 ?0 E: _( M

' {/ b, o4 H! `2 P指针型数据的使用5 L5 n  E- |9 d$ Z8 _. C' Z' c: a- K

$ A$ g+ n4 R, G( g6 z  c0 A  上述关于基地址的概念其实就是指针,笔者之所以拿模拟器来举例子是因为基地址的应用大多在模拟器领域,而有很多PC游戏不同的数据用的“基地址”不是一个,这样就无法通过定义一个“基地址”来解决问题,对于这种多基地址的PC游戏,直接使用控件调用指针是最好的方法,在控件的基础教学里我们都有提到过一些控件的【附加数据】这个功能,但是其实所有的地址控件都有一个通用的附件数据“9”,9后面跟参数(第一指针,第一级偏移,第二级偏移...),这样一个控件就可以在修改器进程里做指针寻址,而不是单纯的静态寻址
: D+ {% s; C8 R# ^6 S& z5 n& P( s% q7 z  ^) m
我们以《植物大战僵尸》(应该没有人没玩过了吧…)这个游戏为例,使用的版本是年度版的汉化版,下图是通过指针寻址得到的游戏中的“阳光”这个数据的地址
6 @( q( i0 Y* B) U; Z; U/ D. P9 ^9 U& H/ ^; g7 z6 Y" a, a" ^9 Q
4 k3 Q0 Z0 U% G' {$ ]9 f2 g4 c& a
" _& n! q' f# R" S' p3 i* z  S3 j
可以看到,这个数据的基地址是7784F8,第一级的偏移是868,第二级的偏移是5578,在CheatEngine里通过这种定义方式就可以准确的得到阳光的地址和数据
: v  J( D4 K( D7 ^% \* Y7 U. j那么这个数据怎么在CheatMaker里制作修改器时进行添加,则可以如下图所示; X4 h& V; L' f4 e

8 e5 }8 t1 _5 X+ f  G- [! T' X2 F; D3 f' E# u5 B+ L
# M) _1 B& \6 s4 b" O) \- T
对应数据控件的地址写上指针的最后一级的偏移地址,对应这里的就是5578,而在附加数据部分,9(第一级指针7794F8,第一级偏移868),就完成了和CheatEngine相同的动态寻址效果
, V5 M0 p. \2 @/ u! c0 P" H我们再看一下游戏中的花园里那个喷雾剂的寻址结果% s' T1 n3 c- ]+ R
$ S1 Y/ y8 o% p# h
" F# b, R# ?* _& l
5 A5 H# _6 N8 B+ Y& M$ Q: S
游戏中是17,对应内存地址的数据是1017,有个简单的防修改算法,那么添加到CheatMaker寻址的方法和上述类似,但是我用了两个附加数据以控制数据的显示,如下图
; u+ T7 D% P" R; H* k
  y$ t) d/ I3 y& y; s
+ l' V  `) r" |5 ~3 N$ K7 o( a5 e
3 h4 N& k' `. I2 E- E* B% K这里9(7794F8,950)以及地址里的224,和上述金钱的一样,不解释了,附加数据的后半截,用“|”符号进行了间隔,20这个附加数据是对读出的地址进行运算后再显示,这个在控件教学的TextBox控件里是有说明的,同时你写入的数据也会根据这个运算反算后再写回内存
3 d& P* d& a$ ~$ U0 F  ]其实我想说的是,控件的附加数据是可以用多个的,中间只需要用“|”符号间隔,我们可以看一下修改器运行的效果对比
5 a. b3 A! X( B0 s; j/ {- I
% ^" s% Z; X( }/ E0 p
7 c4 ~7 N; }) A% }& X8 `) ]
0 Z+ Q# J: j8 i( B看上图就可以知道这样写可以让我们的修改器读起来更顺畅# @, m; d8 l7 t: C6 W* a2 d8 M2 O
但是我强调关于附加数据可叠加使用的目的是另一个,就是配合附加数据“9”来使用的另一个附加数据“6”
/ ~/ T8 H" t1 h, Z0 I' {7 O( g) u我们之前说过了,关于进程的“基地址”或者“特征地址”的查询和添加方法,如果一个进程被定义好了基地址,那么对这个进程做的搜索个控件地址控制操作都是以这个基地址为前提的,那么有些游戏,比如模拟器,大多数游戏的大多数数据都有一个固定的“基地址”,一般情况下只需要添加好了这个基地址就可以解决了,但是少数游戏的数据并不受这个绝大多数基地址的控制,而是另一个基地址,那么对这少部分数据我不需要按照这个进程所对应的基地址进行寻址,而想使用Windows下的一般进程的指针寻址,那么对于这种已经添加了基地址的进程,控件想要使用一般寻址来调用指针的话,则需要在把附加数据“9”和附加数据“6”一起用,格式一般为:6|9(指针),附加数据“6”后面没有参数,仅仅表示这个控件的寻址不受进程基地址的限制,而使用绝对指针寻址
$ n0 d8 G3 l3 Y0 i' m; ?  s* h: V' @0 o6 ^, k# @. ?

4 U( O$ l1 e+ O. K* x! ~% W2 Y
" h) e, ~3 j, `上图是NDS游戏《光与影的英雄》的修改器,对应的DeSmuME模拟器,该模拟器已经添加好了特征码,95%的游戏都可以使用这个特征码进行相对偏移地址的寻址,但是《光与影的英雄》这个游戏就是特例,部分数据不使用通用的那个基地址,于是我想在不改变DeSmuME.exe的进程的通用基地址的情况下,单独定义这个游戏的一些数据的基地址,就可以采用上图中的那种附加数据的调用方式6 l( B7 c+ G" a! Z4 x9 J" ^. m

本帖子中包含更多资源

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

x

签到天数: 1548 天

[LV.Master]伴坛终老

发表于 2011-9-30 21:54:22 | 显示全部楼层
制作教程辛苦了

该用户从未签到

发表于 2011-9-30 22:29:09 | 显示全部楼层
讀完了, 對基地址的查詢大致是理解的# Q9 q- R4 K5 i* U
主要是卡在了CheatEngine的使用方面和對ebx那些東西的具體含義的理解上

该用户从未签到

发表于 2011-9-30 23:11:10 | 显示全部楼层
高手,好东西先收藏了

签到天数: 14 天

[LV.3]偶尔看看II

发表于 2011-10-1 08:41:38 | 显示全部楼层
制作教程辛苦了

该用户从未签到

发表于 2011-10-1 01:00:51 | 显示全部楼层
谢谢楼主的分享,学习了

签到天数: 26 天

[LV.4]偶尔看看III

发表于 2011-10-4 12:42:35 | 显示全部楼层
银河漫步 发表于 2011-9-30 21:49 7 g+ _# G6 m! Y' d7 @3 i
指针型数据的使用0 h/ D, _2 p* L1 u6 u2 E6 ^: G

+ D5 d7 \+ P' Z) k  上述关于基地址的概念其实就是指针,笔者之所以拿模拟器来举例子是因为基地址的应 ...
. I# Q9 p( L, v/ s/ e" R
现在为几个游戏的遇敌率烦心呢,,
! L; {' c7 R% \- q6 _说说RPG的遇敌率怎样调整,主要只 绝对不遇敌和绝对遇敌 (口袋妖怪情况特殊啊)

该用户从未签到

发表于 2011-10-6 09:37:21 | 显示全部楼层
收藏。。。
7 c0 h. I. l% ?1 V0 X$ @5 F话说三国志3修改器很好用的说。。。一堆没年龄的家伙也可以出来显摆了。。。

签到天数: 16 天

[LV.4]偶尔看看III

发表于 2011-10-10 11:41:52 | 显示全部楼层
十分感谢制作这么详细的教程 不过就是还没有实际操作过 可能用一下会好些吧

签到天数: 1046 天

[LV.10]以坛为家III

发表于 2011-10-15 13:09:34 | 显示全部楼层
这个值得学习 谢谢LZ分享啊

签到天数: 31 天

[LV.5]常住居民I

发表于 2012-11-14 11:22:25 | 显示全部楼层
ce呀,不知道还有这个!

签到天数: 5 天

[LV.2]偶尔看看I

发表于 2012-12-25 14:51:26 | 显示全部楼层
一直把CE当做金山游侠用的飘过。。。。{:4_100:}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-13 09:53 , Processed in 1.092773 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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