CheatMaker[支持程序]完全攻略
( t Y- d. t2 e ?$ i X 天枫十一郎
) H9 e* v, A9 q* L$ t+ ^2009.10.08~2009.10.17
# @" o6 G1 h1 J& I! i( ^$ k+ z, r; I& y6 O0 q4 l v' {
在CM中 [支持程序]是它的主核心功能之一.由使用者将自己定义的程序加入其中 设置相关的数据 就可以使"动态修改"中的修改动态地址成为可能.而模拟器的修改亦是使用了这种功能.CM从一开始就支持自定义[支持程序] 攻略本中也有简单说明 但由于相关数据设置需要操作者有较进阶知识 所以这里将完整的介绍如何添加与设定[支持程序].在此之后 你会感觉新一轮探索CM的强大功能又将开始... 6 m) _" |! @$ [( v4 S3 \- }
支持类型分为三大类:一类为PC程式 一类为EMU程式 一类为FILE文件(存档/源文件).系统默认是有PC与FILE支持的.EMU程序类型也存在于EmuList.cml文件中.用户也可自行添加 添加新类型后 .\DATA目录中将会自动产生一个新的类型目录 用于保存此类型的CM修改器文件.一个程序可以支持多种类型 对于PC程式和FILE文件来说 都只有一个类型.但对于EMU程式来说 所支持的类型也许就不止一个了.不同的类型基址 实际地址 长度等都有可能不同 所以就需要分别设置. ^, ]' K% f0 f: c2 G, H
现在 将以实际例子先讲述如何添加及设置一个新的支持程序 之后再讲述如何获取与设置关键数据.CM支持使用基址和特征码来解决动态地址问题.基址可针对某个程序单个版本非常稳定有效.而特征码查找方式则可以对某个程序多个版本有效 这需要更多时间来查找某个程序版本之间最相似的特征数据 这样兼容性也更高.如果"基址特征数据"中有填数据 则优先使用查找特征数据方式查找基址数据.否则使用"基址"来定位基址数据.一般固定地址的程序使用明确地址进行运算操作 不需要添加到[支持程序] 这时候你制作修改器时要使用"内存地址"而非"CM地址".当然 你也可以将固定地址的程序加入到[支持程序]使其被CM支持.固定地址的程序地址也有可能在某种情况下变化 这需要你自己确定 确定不了就加入[支持程序]比较稳妥.
' _* w8 h2 w+ k& U% ` 首先 我们对一个程序修改 要先判断其是否需要加入到[支持程序]中来.更可以说是判断其要修改的地址是否是动态变化的 也就是第一次找到了一个地址后 关闭程序再打开或重启计算机或转移到另一台计算机则此地址会改变则一般能确定此程序中的数据地址为动态地址.但也有动态地址与固定地址混合的程序 所以主要还是看我们要修改的地址是否动态变化.
6 ^; J& A' }+ M h. I" t 这里我们将使用Windows系统自带的纸牌游戏为修改实例 要将其添加到[支持程序]中.我们将修改它的"得分"数据.当然 在这里 你们要已经会使用CM其它相关功能了.因为CM默认是已经将纸牌游戏加入了[支持程序] 所以这里先将其删除.如下图.在CM主界面中的"选项设置"中打开"支持程序管理器".找到sol列 点击右键将其删除." {' A4 [" L# ?& p: [
Snap2.gif (18.67 KB)
+ d$ Q; N) z D% s$ x8 w. z. W2009-10-18 12:39. P$ ]' u- K+ P+ d5 }( N
* }4 O7 v6 j" J5 g
& X4 P( F0 S% K% e' h9 D" D' A6 `( j+ N
第一步.查找得分地址.
/ \( i# x2 I/ `: O8 G7 i1 L3 [7 a Snap5.gif (17.28 KB)$ ?- g! q5 e/ @- v
2009-10-18 12:396 p$ ~5 t7 A7 i8 b- |* T" u. g7 V
+ e5 @; W* s6 Y1 ~: s
1 {7 q% l8 S6 k
Snap3.gif (16.61 KB)4 y N- ~! A. Z1 z' n
2009-10-18 12:39
- \. d( g7 Q* f/ x* W; @0 Z2 c- U) b0 P. O: Y+ J
$ @6 y( n, o9 Z1 U4 e0 M
如上图找到"得分"地址后 立即点击"内存查看"转到内存地址查看数据.这时候数据已经由9变为7了.因为纸牌游戏得分是与时间相关的 你长时间没有得分 则分数会慢慢降为0.
Q' M# ?" I' {& g1 C' g B Snap4.gif (25.78 KB)% B, j- X# S. L
2009-10-18 12:39
2 P4 \7 J7 g) ]4 w' A; ~9 q4 ~9 x* }5 y
9 U5 F% i0 u; ^, [2 t* \
应该理解CM地址与内存地址区别吧?CM地址即为使用了[支持程序]之后要使用的地址.而内存地址则为原始的PC内存实际地址.如果是固定的静态地址的话 则使用内存地址作为操作地址.如果此程序已经添加了[支持程序]则需要使用CM地址来操作.因为这时候是由CM地址映射出内存地址的.也就是说CM地址不会变化 而内存地址则会变化." A" I5 o" r( Q f4 {
现在 纸牌游戏还没有被添加到[支持程序].所以 现在如果关闭纸牌或重启计算机 CM地址与内存地址都有可能变化. (当然其它游戏的地址会不会变化还需要你自己先按照关闭,重启,换机器这几个方面进行测试才知道).如果测试为会动态变化的地址 则需要往下继续.如果不会动态变化的地址 则不必要加入到[支持程序]中来.我们现在已测试纸牌是动态变化的地址 现在要使用的地址就是"内存地址" 然后接下来关键的就是查找它的"基址".) Z1 a' R" F3 F
+ L6 x ?& \) B( a& ^$ d第二步.查找基址.) B, d0 e& x5 T1 E
首先演示如何使用基址来解决动态地址问题.稍后将演示特征码方式.用任何带调试功能软件都能查找基址.基址可以看作是一个固定的地址或地址指针 其保存了相对地址的偏移地址或指向偏移地址的指针.查找它是为了将基址数据加入到[支持程序]中.这样就能解决地址动态变化问题.关于更多基址信息 你可以网络搜索更多的资料.
+ `* q( a5 }" d0 e0 z2 p; g 这里使用OllyDbg/OllyIce中文版来调试纸牌程序查找其基址.当然 这里使用任何你熟知的调试器都可以. 9 T0 E: Z, f$ x/ z1 F8 Z3 S' D4 M
Snap6.gif (32.38 KB)
5 U6 g. {( q& v! A. H4 K/ J0 j2009-10-18 12:39
9 N0 w# X' L8 l5 e6 J0 L, c& ]' m9 w2 G$ B
; D8 Z; d, o1 y1 I' z
开启OllyDbg.选择 文件=>附加=>找到sol/纸牌进程=>点击附加.完成之后再打开"内存"窗口.随便双击则出来数据窗口.然后再按Ctrl+G调出"跳转地址"窗口.输入上面我们查找到的000A9E61得分地址(内存地址).当然 这是动态变化地址 也许在你操作时就是另一个地址了.或者随便点击右键出现的菜单中也有"转到地址". # r X) A6 y/ k& G. I
Snap7.gif (19.95 KB)
8 B' W! i# I( u4 F, L Z2009-10-18 12:391 g( N+ F) q, L: s1 d# H" `
! ?" |: {, \9 @
7 O0 x% K0 R( R4 Q 接下来就是要操作纸牌游戏得分.随便移动一张牌得几分 然后调试器就停止在操作得分地址的代码段了.如下图的CPU窗口.
" M; {+ i5 X; w$ I Snap8.gif (34.54 KB)
8 v1 S* G3 ]* X: v6 Z% Y5 O2 m4 v2009-10-18 12:391 |' L- \! h0 m. j h
- u: m$ g" j, W2 d7 G
6 h! _ m% l9 c- j6 q 你能看到代码段为: dword ptr [esi+30], eax 这是得分地址增加的操作代码段.eax为增加的得分值.esi为起始地址.30为得分地址基于起始地址偏移.意为将eax的值写入esi+30地址指向的数据段中.esi+30=000A9E60 这个地址就是我们已经查找到的得分地址.这个地址中的数据亦是纸牌的得分数据.不同的程序这个操作代码也会完全不一样.现在看到的 只是纸牌的得分操作代码.我们要理解的就是学会分析操作代码 获取我们需要的数据.也就是存储了起始地址的基址.
! L' P+ t+ z$ ^* N$ ~" m# Z 在右侧的寄存器窗口中 我们可以看到ESI 000A9E30这一行.则表示了ESI指向000A9E30地址.这里仍然要说明.查找基址的方式有很多种 实际情况要根据所看到的操作代码的不同而决定使用哪种方式查找.有的操作代码能直接显现基址与起始地址.现在我们看到的是使用了寄存器地址操作 这种方式不能直观的看到它是如何被计算出来的.如上面esi值的获取操作 如果要追踪那需要许多时间.不过还好我们看到esi的值获取没有进行多重计算.我们将使用一种简便的方式.# S. _5 V( f, m t
我们之所以需要获取基址 是因为它指向了内部数据的起始地址.而其它数据的操作亦是根据我们所谓的起始地址来相对偏移的.所以 我们实际需要的是这个起始地址.而基址则为我们保存了这个地址.基址一般是没有固定的概念的 至少CM中是将基址这样定义的 能够帮助我们找到起始地址的地址 亦为基址.它一般是程序中某个指针变量.变量.操作代码或全局变量等.一般都存储在代码段.数据区.exe文件长度范围内.是程序编译好后就固定的 运行时分配相对程序固定的地址.在CM动态地址操作中 已经定义这三类地址.基址.起始地址.数据地址.基址指向了起始地址.数据地址基于起始地址偏移.有的地方将起始地址亦称为基址.所以在这里不要混淆." {8 W: g0 W* i. ^7 t
了解了以上特征后 那么我们根据现在得到的起始地址esi=000A9E30 就可以尝试查找.上面说到 基址指向了起始地址数据 那么 我们可以直接查找起始地址000A9E30.查找出来的结果理论上就包含了基址.那么我们就使用CM搜索esi这个起始地址试试.
0 U: Q; |& m" c+ M$ D* H( M Snap9.gif (19.45 KB)
& r* c# [+ V6 X( x& ^ k5 o7 n2009-10-18 12:39
4 K' K0 |6 R i& D, G$ J5 n
5 } F* a' t, K- I/ ~9 o
5 U( A2 `; u; n( ?4 N 使用CM搜索十六进制数309E0A00.因为一般情况下保存的地址数据值都是低位在前高位在后 所以查找地址000A9E30时 则查找的值就是309E0A00.$ i* f; g2 P3 O
如上图结果有11个.上面也提到过 基址范围一般在exe文件内.代码区.一般程序的这个范围都在0x00400000以上.而我们上面搜索到的结果中 只有最后一条记录匹配.上面的结果都在栈中存储 会实时动态改变 一般不会在这里面.但实际上一般情况下 也不会在上面最后一个结果0x01007170中 因为一般程序被装载后exe起始地址都会是0x00400000.但我们在OllyDbg中打开"可执行模块"窗口时 就发现了 纸牌这个Windows中系统程序起始地址是0x01000000.长度为0x00010000.那么在这个范围内存的地址才有可能是基址.而我们查找出的最后一条记录0x01007170正好匹配这个条件.那么 现在就先暂定使用这个地址为基址.
# A* t2 W& ?" N6 { 一个程序的基址不一定是唯一的.像我上面个人定义的基址概念一样 能获取起始地址的地址就可以称为基址.所以 有可能其它程序查询出来的结果有非常多.你可以逐个筛选 如果此地址的值固定 每次都能根据此地址的值查找到正确的起始地址 我们即可采用这个地址.当然 一般程序也会有一个比较唯一基址.例如打开文件或运行后 装载的动态数据一般都会有一个指针变量来定位.再如模拟器打开ROM时的操作代码附近 一般就能看到某个变量保存装载后的起始地址信息.当结果较多时 则需要个人的经验来快速确定是哪一个.# z1 r5 Y( g7 a* ~
Snap10.gif (32.91 KB)- I9 w5 O. l$ o( ~/ k2 K6 x; u
2009-10-18 12:39& ?7 Z# f! k' U; A
0 p4 L' f+ W6 |2 v# G6 |% Z
~; [) l& b5 _8 o! u$ s' |% {. o H; d
8 R# s' v* m. n @& Q2 O第三步.添加支持程序.
- C: ]; S3 O- @1 q& S1 G 找到基址后 关键的数据也就有了 接下来就要将纸牌程序添加到[支持程序]中了.
9 P( v* _' o5 d Snap11.gif (18.31 KB)
4 q1 G; J# I( B' f; h5 J" \2009-10-18 12:39. @& e% v* o* @" O3 Q
$ m4 t% f' Z, R+ Q7 t3 b6 |, |# z/ |4 A ?+ J! P+ k
返回CM主界面 在纸牌进程上点击右键 在出来的菜单中选择"添加至{支持程序管理}".随后 纸牌游戏就被自动添加进"支持程序管理"器中了.你也可以在主界面的[选项设置]中调出"支持程序管理"器.手动添加纸牌程序.在有关其它数据的详细设置 将在后面列出.
" j/ u1 p$ C6 }/ a2 k7 _ 自动添加完毕后会默认为PC类型程序.纸牌是Windows的程序 所以选择PC类型没有问题.之后在"支持类型数据"中的基址栏内填入刚刚查找到的基址01007170.输入的是十六进制格式.数据大小填0表示从基址指向的起始地址到程序最后长度.添加完成后确定退出.
( p$ e; Q6 a- G4 } w Snap12.gif (16.58 KB)
3 ]% o7 Y& ?; H( e7 [$ j! f6 Y2009-10-18 12:39
' ], M; a5 A) i: Y+ M& X. N# F/ e/ G* q. s* _0 p1 o2 x; v) p
1 m" g- E" R h% A 返回到CM主界面后发现名称栏中的PC名称变成了刚刚设定的sol名称了.这样一来 纸牌程序就被CM识别了.也就成功的成为了[支持程序].+ k* @7 S0 H" e# }0 t. V
Snap13.gif (17.3 KB)$ f9 R/ Z4 v& ~* e( q* s) c
2009-10-18 12:39
3 c( L" p P/ O2 n x0 @
5 t8 K9 x2 Z6 R" U5 A! b9 e+ C- ?2 T
. f! C/ v( {1 v5 w% g
第四步.制作CM修改器.
1 B+ ?% A8 F' }6 b+ O 有了操作地址 制作修改器我想看到这里的CM使用者都应该会操作了吧.如果还不会的话 请参考"CheatMaker攻略本".内部有详细说明.并且 CM官方自带了纸牌游戏的修改器.你可以直接"修改器选择"中找到.唯一要注意的就是 使用[支持程序]制作修改器 在修改器中设定的操作地址要使用CM地址.非[支持程序] 则使用内存地址做为修改器中的地址.
3 y( ^+ Z; @1 n6 U: |) E3 n r2 Y7 i3 l
第五步.使用CM修改器.
+ j6 N% {- y8 G5 f& ? 制作好修改器后 就可以直接使用了.如何使用可以参考帮助文档.如果不会 那么应该放弃看此教程. - D( ` h$ g7 a8 @
Snap14.jpg (131.98 KB)
' `0 f& D- [5 U, _2009-10-18 12:39 t( ^' u3 c2 {; ^% w, t
# |+ \. n. t6 G6 O/ d
$ I9 z& C0 ]+ K9 `' k$ ^ Snap15.jpg (216.79 KB)
; } a( D8 ?+ @* n$ \ B1 E, V2009-10-18 12:39$ T- r% d9 K1 @% ~% \
7 Q4 \- a: ], n& D! [3 X7 q# K. L) M/ R/ q& Y6 X) s/ x
( S# O! W: w9 z+ m
◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆
# S, X0 M5 F* U/ n) ?. ]* C' s8 L3 e# y8 _* Q; t9 w1 s
此教程目的就是让设计者完全了解[支持程序]的强大功能 对于其它操作 只简要带过.当然[支持程序]离不开基址的支持 如何学会查找基址 才是最基础的学识.所以这里也提到特别多这个概念.CM除了支持固定的基址来操作[支持程序]外 还提供"特征码"方式来自动搜索基址.当然 这还是要设计者自己先判断出基址数据 然后再进行特征码确定.这比直接固定基址方式更繁杂些 所以对设计者要求也更高.但这样方式对多版本程序有着很好的支持.通用性很好.如果只是需要支持单程序的话推荐使用设定固定基址方式.如果需要单程序多版本支持的话 那么只有使用特征码方式了.
' }/ T/ ]( R! o/ N; u, g( _' y; n# H! n
查找特征码.
" z% Z x- @5 M 特征码一般理解为基址特征码 也就指向基址地址的特征码.CM所给其定义为广义的特征码.也就不局限于基址.凡是能定位到固定地址的特征码就是CM定义的"基址特征码".能定位基址和起始地址或其它固定地址的数据 就称它为特征码.它是连续的十六进制数据串 可以模糊定义 也就是中间的数据不一定全部需要.具体请看下面"基址特征码"的解释定义. ( t9 V, u, h( f7 O) O
这里还要强调一下 一般如果只是需要查找某一个程序的某一个版本特征码作为基址的话 那么 只要取程序中不重复的一段数据即可.当然重复数据CM也支持.还有一种就是为了支持某一个程序的多个版本而查找的特征码.这个特征码的数据需要是多个版本中都匹配的数据 需要搜索所有要支持程序版本 所以比较复杂. 这里先以单个程序查找特征码来获取基址为例.稍后将讲到以特征码来支持单个程序的多个版本7 B- y& \/ ]4 y# M
Snap14.gif (44.71 KB)
. K# U7 v9 ~% C2 M* W6 B2009-10-18 12:39
% O+ X4 a8 Y" k% y$ @* L; L, U# I( b" t$ Q" Q
9 Q9 [: o3 T* V) p% M 以上示例使用了PC程序-纸牌 接下来则要使用模拟器来示例特征码方式查找基址.以Cygne模拟器为例.这是一个WS/WSC类型的模拟器.先以v2.1a版本为例使用特征码数据查找基址.CM中已经有对其支持 我们可以看到基址固定为:40954B.那么我们现在不使用这个固定的基址 而采用特征码方式来确定基址.我们先以上面讲到的查找纸牌基址方法查找基址.如上图是以ff2.wsc游戏为例.其中在操作金币代码时下了断点.所以在游戏中改变了金币后 就停留在上图.[eax+14B9870] 这一代码就明示了"起始地址".这样的代码是最简单的操作代码 我们可以直接判定其中的eax就是金币偏移地址.而14B9870则是"起始地址".这样一来 我们就获取到了"起始地址" = 14B9870.而按照上面纸牌基址查找方法搜索 也很快就能确定基址.但这次不同的是 搜索出来的结果非常多.如下图.
( p3 K4 ?* _8 v Snap17.gif (18.65 KB)
& x5 G4 W1 \; {) k1 `9 `2009-10-18 12:39
& g+ O5 z4 o+ {3 a" d8 C7 P, @' O; W2 Y$ b9 o: v
1 o" C! o X9 l, x/ s8 y
回到之前我提到过CM对基址的定义.凡是能找到起始地址的都可称为基址.CM中对Cygne 2.1a版本使用了0040954B这个地址.相对于这个模拟器来说 其它地址很多都可以使用.只要其位置指向的数据是"操作代码" 而不是无意义的数值就可以了.所谓"操作代码" 即OllyDbg能识别的代码数据.假若代码中显式的跟有起始地址 那么这个地址很可靠.相反 如果是一些无规律的数值连接起来的非有效代码 则非常不可靠.另外也讲到过 如果地址在栈中也是不可靠的.如果你不是很有把握 则只要选择一个地址后 进行重启电脑和换机器测试就可以判断其是否持续可靠.0 r% c& p% h% J. i3 H
那么这个模拟器的基址我们也找到了 也就可以被CM支持了.可以制作修改器了.CM已经支持了 你可以在"支持程序管理"中看到这条栏位.现在回到上面调试停止的图中.我们看上面画了特征码的地方.其实对于单程序来说 我们要的特征码就是在基址或起始地址附近出现次数最少的一段固定数据.8A4D0C8888我们使用这个特征码.一般来说特征码内最好不要有操作数据 全是代码最好了 所以这里没有加入70984B01这个动态的起始地址数据.
& ]/ w7 f/ l. y: A2 ]" M, ?% w Snap18.gif (16.71 KB)
4 h. I9 y1 I7 _1 P2009-10-18 12:396 _& p9 d: ^4 E0 \1 P
3 Y2 j$ v( k2 Z( M9 I3 z
/ i( L$ d; u: F# h6 k, L$ z 特征码的本质就是搜索.我们在CM中搜索Cygne时(Cygne已经被CM支持.你可以选择删除原有记录或增加一个PC类型支持.否则你只能搜索支持的数据范围.) 符合8A4D0C8888特征码的地址只有两个.其中有一个地址与我们调试图中的起始地址很接近 其实这个地址就是特征码地址.我们只需要再设定偏移量即可得到"起始地址".我们可以这样计算出来: 查找出来的地址 = 00409546 + 特征码长度 = 5(2个数据占1位) = 0040954B.然后我们从 0040954B 取出的数据就是"起始地址".当然 这一切都会由CM来完成.我们要做的 就是将特征码加入到支持程序中.
?- a- U o6 Q, q+ B Snap19.gif (19.93 KB)* Q) L( M4 U6 W, E- x
2009-10-18 12:39
5 f6 a+ `+ Q4 C/ Q1 @) U& G( J) ^- I; C2 \& W
; C( q( z0 p e9 w' G
如上图.我们的"基址特征资料"应该都明白含意了吧.就是特征数据,偏移长度.如果这个栏位填写了信息 那么前面的基址栏位的数据就无效.而这里要使用附加数据=1.因为特征码查找到的地址就是起始地址而不是基址.这里是设置0还是1要根据特征码查找到的是基址还是起始地址而定.
$ p0 V7 `/ Z; D- m Cygne v2.1a模拟器已经被完全支持了.制作一个修改器试试吧!; k* t) ^7 w# D# [/ J/ H
现在 该来到特征码真正做用的地方了.基址只针对某一个程序有效 如果一个程序升级了 改动较多 一般这个基址都会失效.那么特征码就很好的解决了这个问题.我们先准备好Cygne v1.0模拟器.使用以上学到的方法找到其基址.结果是什么?对的 它的基址与v2.1a的基址完全不一样.如果这样的话 我们要在支持程序中加入两个条目才行.而上面我们已经改用了特征码来查找"起始地址".那么 如果直接使用v1.0版本会是什么结果呢?是的 已经完全支持v2.1a与v1.0.看到如下图你就应该明白了.* v3 s" D9 C! z f
Snap20.gif (41.96 KB)
# p+ [. c' m( R$ \! t0 ^; p/ l2009-10-18 12:39
3 T4 \/ b8 p: R' k g; a9 c7 ]
9 g# |6 P ~+ h* Z
) k t0 k; Q2 T 请与v2.1a的调试图对比一下.虽然两个版本的基址不一样.但特征码是一样的.CM会自动找到地址码进行偏移+5.之后取出的地址就是"起始地址".这个操作对两个版本都是有效的 所以我们不必再建立多条记录了.此模拟器正好对应了相同的特征码.如果对应不了 那么我们应该重新设置特征码.只要特征码相同 并且特征码地址到"基址"或"起始地址"的长度也相同 那么就可以采用.特征码查找出来越少的最好 如果很多就增加特征码数据长度.比较简单的方法就是同时调试两个版本的程序 在同一个代码操作段中 直观的查看相同数据的位置.取出固定的代码数据作为特征码.以下再展示Cygne两个版本另一个特征码的对比.你感觉特征码应该设置成什么呢?参考一个吧:F3ABB940000000,-49 h7 |; C) f' ^: L) t* r B
Snap15.gif (43.74 KB)* r, p" {4 h7 `2 X7 n8 x, b
2009-10-18 12:39; H A" H& C- P( N# Z3 |/ j2 x
8 [$ P: z$ B6 N) Y' I; D) L% v5 K
/ V' w# H/ V# Z/ J
Snap16.gif (43.96 KB)
* E) @' ^$ _1 W2009-10-18 12:39' H5 {7 \5 f. m% S
s( f. U8 G1 T. D! J/ x
" H- m2 R$ ~6 D j4 \1 X 当然.以上方法使用其它的特征码也是一样的.但是 为了兼容其它版本 我们要选择一个稳定的特征码 意思就是获取的起始地址每次都要一致.以上示范使用的特征码是基于"起始地址"的.也可以查找基于"基址"附近的特征码.总之方法非常之多 但也需要个人经验的技巧.以于一些显式的"基址"或"起始地址"都比较好解决 难的则是一些多级指针地址及多重运算获得的地址 需要花较多的时间去查找其"基址"或"起始地址".
+ K% B( H& p0 q! r
& _3 L0 D0 ?2 c6 w! y◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆
% G2 i. z2 ]3 C
7 z/ s$ @; p4 e% A 至此 我们已经成功的完成了一个动态变化数据地址的程序转化为固定地址的操作.依据以上方法.你能够将更多的动态地址程序加入[支持程序]中 使之可以制作专用的修改器 一直都可以使用.但是 程序千差万别 你会遇到各种各样不同动态地址的程序 使用以上简单方式可能不能将其转换为固定地址.所以 CM兼容了许多常见的不同地址查找方法来获取基址及固定的地址.这些功能可以使用特征数据查找方式及附加数据设置方法来改变.& H1 G9 e6 D+ j; i- `6 r0 m
下面详细了[支持程序]的相关含意及设置.着重理解"支持设置"中的基址.基址特征数据.附加数据.将会让你在千变万化的程序中 找到转换为固定地址的方法!+ a% d2 ]0 k/ B' O3 s
程序设置. D6 R: v% f9 h( R
系统: 如果勾选此项 则表示下次打开管理器 则隐藏该项.! f& j! h" f4 R
名称: 用来标识程序的版本或做特殊的标记用于区分同一个类型程序不同的版本或功能.即为显示在界面上供用户识别的标识.
, {0 K4 o5 n! T9 i$ g' l$ w9 p6 } 标识: 用来识别这个程序的可执行文件名.当在进程列表中点击这个程序时 会根据这个标识来判断是否支持.它与类名同属于一个功能.& i+ r+ L1 ?# E% c1 C( N
类名: 唯一的用来判断程序是否被CM所支持.
0 T8 m; ?+ T6 S# N+ [8 {5 f 特征地址: 标识某一个地址 用来确定程序所读取的内存地址起始位置.(保留)8 Q2 H' ~0 l9 L+ X2 \! r" P, X; F/ P
特征数据: 标识某一个唯一数据 用来确定程序所读取的内存地址起始位置.(保留), v1 h; s) P/ f& S" A
附加数据: 保留
( R4 g/ Z! i. d5 C0 T0 X+ z7 c 说明: 对此程序的简要说明.选择此支持程序后 会在界面中显示此信息.) H1 c; Z2 y/ g2 R. S% B: i' d. q6 A% E
支持设置9 A/ C' j6 a. g5 q! {0 T7 I
基址: 读取这个地址所指向的数据(地址).用于初始的CM地址 也就是起始地址.CM一开始将会查找这个基址的数据 将其数据设定为起始地址 然后对应修改的所有地址操作 都是基于此地址偏移的.对于PC类型也就是非支持程序来说 一般设置为0.表示直接使用PC程序在操作系统中的起始地址. B; f. X+ I, g$ Z. S7 c! t
在新版中 此基址支持多级设定.格式为:0018A041,0,7,2,0 表示首地址为0018A041 然后依次读取4级地址后使用最后一个读取的地址数据.在读取第一个地址数据后根据第一个,号后面的值0进行偏移查找 然后再进行第二个,号偏移7进行查找 再依次到最后一个 获取到的地址数据为最终使用 将其设定为起始地址.
% Z& N. D" S; M+ u$ b======================+ n1 d- O6 e" d9 C9 l$ N, E
基址特征数据: 标识某一个唯一十六进制数据 用来确定基址的位置.如果希望设置一个基址就能完成对某个程序大多数版本都支持话 那么使用特征数据是很好的方法.使用单个基址设定有个不好的问题就是 如果程序版本升级 代码有改动甚至长度改变都有可能影响基址的正确性 模拟器就是比较典型的例子.CM使用特征数据查找到定位相同程序不同版本的基址.这样准确度更高.
7 ^) M+ v7 I: Y4 Z2 D, h: T+ |基址特征数据格式: 6FEC9807E9,3,1
0 J# \# r# v% \1位是特征数据用来查找指向基址的内存地址.查找到此数据后的地址中的数据即为基址.
/ M0 i, L% E' d$ L2位是找到的地址偏移多少位再取值设定为基址.(可以负数,可忽略)0 c2 [, J7 A4 Y. r& k p I8 m
3位是找到的基址修正大小.(可以负数,可忽略)
* m( }: {. i$ ` h& G) U$ R4位是使用顺序第几次的查询结果(可以忽略则表示使用第一次查询到的地址).也可使用负值 -1表示使用最后一次查找到的值.4 V) S9 D( ?! v0 w
可使用?符号通配符 例如: 6FEC????????98??E9,4 则表示使用查找到的数据中????????中的数据为基址.6 s% I/ F2 |( y$ y
======================
. G" g/ } {$ S/ f/ H8 U" v: p 数据大小: 读取数据的长度.对于PC类型来说 一般为0 则自动使用程序的长度.% M; c1 z3 Y+ h2 m. i6 E4 h1 c$ e9 B
======================+ h( e0 P+ Y7 \' J
附加数据:
8 K6 _* A" H$ A* `$ |. O6 b% T7 f1 U2 T0或""空值表示使用"基址"或"基址特征地址"定位到的地址为"起始地址".; |( z y1 z7 V1 B
1 表示直接使用"基址"中设定的数据为"起始地址".一般PC程序使用.如果设定了"基址特征地址" 则查找到的地址为"起始地址".
$ p0 T2 r6 Y0 H2(-4000) 表示修正"起始地址".用于确定"起始地址"后再次修正.
$ q0 Y2 s0 ]$ ]/ B3(8) 表示使用基于上一个"基址"的偏移为本次要使用的"基址".(要减去4位自身长度); z9 l Q8 z U t. z$ @
4(4) 表示使用基于上一个"起始地址"的偏移为本次要使用的"起始地址".5 U9 t: x# ]4 m( `3 H
5(80) 表示修正已定位的"基址".
6 ? l! B% l% z9 Y p1 G/ _4 ^, L9(CPS3_Emu_Fix,Turn_Data) 表示选择此类型自动应用插件.8 G. B' k m0 H, ] O' G
以上附加数据可以多重设定 以|为分隔符.如: 1|2(800)|9(Turn_Data)3 \* n; j( @9 x: I, _
% |. n u5 g1 R5 `" |5 E 其它相关资料 请查看CM帮助文档或登录论坛进行交流.如有需要请直接至邮件交流.
) o" a; b6 K& R5 v! D" c◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆
# J1 Y& Y4 ~9 @, K6 z官方论坛: http://bbs.yslx.org.cn/bbs/forumdisplay.php?fid=55
5 Z6 h5 z( V1 G; r; m- {. z共享修改器: http://cheatmaker.ys168.com' [2 R8 q2 Z# Q d T+ i& {7 c/ h
E-Mail: smallfishff@hotmail.com |