修改gmsv制造出我们想要的脚本语句【第二篇】
这次给的图是我自己拼的,把整个函数都拼接起来了,比较方便一点,呵呵
3 {* |! z9 N' F0 N8 F: k/ i6 F- K/ c—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート我们上次说到 set_level 这个函数,现在来一句一句分析这个函数的功能,看看gmsv是怎么执行这个脚本改变游戏里面人物的等级的。
8 H9 g/ n6 f% h2 K魔力私服,最新魔力宝贝私服技术交流; L8 N% m& Z! ?0 d5 Q, L8 h
注1:
4 G: Y. W7 |, K/ J上次我说每个子程序的开头都是这样,是为了使用堆栈考虑。下面解释详细些。1 ?# x* Q: D. m& z: i7 p
准确的说是在linux下的gcc编译器在编译gmsv的源程序的时候,' p; K2 J. M$ W& ]
(我们现在手上的gmsv不是源程序,而是由源程序编译产生的可执行程序,这个都知道吧 = =!)
5 {9 W: M4 z& U4 u* t妖城在线论坛由编译器的机制导致的,就是说子程序存在注1代码这件事是gcc干的,
% M; N' }0 m4 U—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート(你反编译其他的任何程序,子程序几乎都以这样的语句开头)
' T- ^5 L1 S& t' D6 g魔力私服,最新魔力宝贝私服技术交流并不是程序编写人想这样。这个跟我们理解程序没什么太大关系(那还说= =!)
5 F( J5 k+ }( Z' S+ @妖城在线论坛但是我们要知道在每个子程序里面堆栈指针的作用,因为我们的机器没有太多的寄存器给我们用,有很多数据我们必须先放在内存里,妖城在线论坛7 w6 p$ p4 [2 D4 K& T9 s1 ^
必要的时候才拿到寄存器里面进行操作或运算。指针esp和ebp就是指向某个内存地址。魔力私服,最新魔力宝贝私服技术交流) T4 }4 t) L( ?7 B9 Q
顺便说一下,80x86机器的堆栈是递减的:就是说堆栈的底部是高地址,而堆栈顶部是低地址。(把堆栈想象成一个先进后出的装羽毛球的筒)—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート d( f( W! Y7 b" u! e
(80x86机器:就是使用IBM80x86指令系统CPU的机器,我们的PC机,只要用的是Intel的CPU都是基于IBM的80x86指令系统)
8 k- n9 T: Q4 l' y6 b8 A9 R# g0 J—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート想了解更详细关于 堆栈 寄存器 的资料请参见我发的那个汇编教程。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ O% Y: p7 c" D5 M5 ^
还有esp前面的e是扩展的意思,是80386以后从16位扩展到了32位的寄存器。bbs.mocwww.com/ I& A7 [+ @2 C' }" t& `8 n
在我发的汇编电子书里面寄存器一般是ax,bx,cx,dx,sp,bp等等。魔力私服,最新魔力宝贝私服技术交流6 o/ U4 D5 ]3 W1 S6 S5 }
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! E4 F x* F) F" J7 ?
注2:
: R3 u) q1 G! t4 ?0 {4 k魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表check_num这个函数不一句一句理解了,这个函数很短,有兴趣自己看下,我说下作用:—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート! V2 s1 D/ s/ |/ n6 z% ~
检查一个命令后面是否带的是否是参数(带正负号或者不带正负号的数)。魔力私服,最新魔力宝贝私服技术交流6 D3 u2 z. W" c
这里是数一般是整数。这个函数在这里主要是检测命令所带的参数是否合法。
2 j4 D2 q7 J, E魔力私服,最新魔力宝贝私服技术交流
* i& U7 H9 T) w( Lbbs.mocwww.com注3:妖城在线论坛/ K4 z# Q. N+ @- O# V
xor esi,esi 等价于 mov esi,0 就是把esi赋值为0,这个后面有用到。
8 ?# m$ P9 D2 r" T- i7 g! E魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表add esp,10h 是把堆栈指针向堆栈底方向移动2个字节。
1 W2 x3 T2 J6 h* q8 |—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート关键:test eax,eax 是把eax跟自己做 按位与(and) 逻辑运算结果不影响eax的值,只影响标志位(跟and不一样的地方)。$ V+ ]. f" n. _, b1 \+ O
eax如果为0,那么标志位(不知道标志位是啥参见汇编教程)ZF=1,如果是负数,那么标志位SF=1。
* z$ Q) `9 T2 Wjz short loc_8121514 如果eax == 0(即ZF==1)则跳转到(short表明是短跳转)loc_8121514处(即绿色线),否则往下执行(红色线)。魔力私服,最新魔力宝贝私服技术交流" k* r# h$ k/ ^+ r$ S. Y
loc_8121514 处很明显,是错误的提示。即 注9 所在的框。
$ ~' V3 e* M' A; h! B! C—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这里补充一下check_num的返回值:返回的是命令后所带的参数类型,在al里,al是eax(ax)寄存器的低8位。
. d4 [2 a; o; v# q( ]1 W; Fbbs.mocwww.com这里的 类型 是如下含义:如果是“+”或者“-”号,则返回他们的ASCII码(见注4),如果是数字,则返回对应的数。魔力私服,最新魔力宝贝私服技术交流$ j; m# V( S+ f2 R9 o
“如果是数字,则返回对应的数”解释:
# n' k7 a& X$ N% X: V4 \( i" K比如 setlevel 1,因为gmsv读取到的其实是"1”的ASCII码,即49,那么得减去48(这个操作是在后面的get_num2函数里实现的),
* O2 v* e, i: ~" n$ x8 o0 i- b) U' N4 k妖城在线论坛再放到al寄存器里面,才是适合CPU处理的数字“1”。
: t" Q7 j! w5 W/ l& {) V
( F3 p: x) f+ h4 x2 ~, U妖城在线论坛注4:
3 m/ m. v1 E, V! K1 }2 s0 V魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表这里两个 cmp,参与比较的是check_num的返回值eax,43是“+”的ASCII码,45是“-”的ASCII码。
# I) n4 P6 }: A6 h5 h—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート首先,第一个 cmp,如果是“+”号,那么跳转到loc_812150C,否则往下执行,即第二个cmp。
B1 M( q, G1 n2 l第二个 cmp,如果是“-”号,那么跳转到loc_812150C,否则(既不是“+”也不是“-”),那么往下执行。
+ x' e( U' \ J ?& c4 L魔力私服,最新魔力宝贝私服技术交流注意这里的往下执行是红线,即loc_81214B4。
' `- l) O; L$ U( I4 L& h# Y' x# pbbs.mocwww.com: _! ~& k" t0 C2 w/ P
注5:
- z% W7 Z: V9 g, M2 b妖城在线论坛mov esi,1 就是把 1 赋值给 esi。对了!看注3里面,不是esi赋值为0了吗?bbs.mocwww.com9 @# [3 Z+ L# O% ?6 [* k, H4 C
esi在接下来的作用是:当作条件判断跳转,这里后面还会说。
/ I1 |( z8 k- n- e+ k6 y+ L9 f妖城在线论坛这里,check_num这个函数的影响体现了,就是说:如果脚本参数是不带正负号的数字,那么esi的值是0,如果是带符号的,那么esi的值是1。魔力私服,最新魔力宝贝私服技术交流5 A2 j( {. E5 n: r
看注5的另一部分:test esi,esi 不说了吧?和注3里test一样的。好了,记住这里根据esi不同而又不同的处理(体现在注7)。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表4 \/ C! R( w7 i" y
; [0 f' q- F0 ]注6:3 U- a; f" {. ?
get_num2这个函数具体也不分析,这里给出这个函数的作用:
G" V6 `: L: N- C( e魔力私服,最新魔力宝贝私服技术交流取得数字适合在寄存器里运算的值。就这么简单。
- l: o7 m# q' ^. ]. w如果是正数,那么返回在eax里面就是正数;
1 V# [7 W9 F) w魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表如果是负数(我们写的负数CPU是不认识的,必须这个函数处理之后让CPU认识),那么返回在eax里面就是正数。
$ h* L4 B$ }3 R' {: ]7 X* Y魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! C0 A" i' I/ {0 B- S$ X
注7:妖城在线论坛( }8 Q0 [0 i# g! |9 U3 K; i$ t
我觉得这是函数最重要和最核心的一部分。理解了这里,很多事情就好解决了。
* n; S" x0 U O2 o4 i: P先来看这里出现的"2Ch”。转换为10进制是44,我们再翻看数据库的character表,看到等级是在第9栏。
& W- T: c8 I% t& X0 l—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート那么这个44是怎么得出的呢?答案是:character表的 (9 + 2) * 4 == 44 == 2Ch。反正记住这个公式就行了。
0 Q2 r- G+ I1 a$ F; G1 ybbs.mocwww.com再比如当前人物经验值在character表的42栏,加2为44,再乘以4等于176,转换为16进制是B0。魔力私服,最新魔力宝贝私服技术交流$ b! n( _0 N* E2 X; w6 b
因为我们的目的就是加经验,所以这个数后面我们还会说到。
, Q0 D' w) y( X& P% x[ebx+2Ch] 意思是取得ebx+2Ch这个地址处的内存数据。这个内存放的就是人物的当前等级。以后我就说当前等级了。妖城在线论坛: I M/ _# W7 t
继续正题:妖城在线论坛" t- ?5 i2 c U& T
我们看到整个注7是由esi为0或者为1进行跳转的两个分支。魔力私服,最新魔力宝贝私服技术交流. D T( x7 H2 k
我们分析左边的分支(esi=1):$ j6 r: J& I9 I8 O, ?/ H) e0 w/ t
add eax,[ebx+2Ch] 把当前等级加到(get_num2的返回的)eax里面。魔力私服,最新魔力宝贝私服技术交流# Z$ A# M# l# v- O
test eax,eax 将eax跟自己相与。
1 k/ S) i: t7 Q% P—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートmov [ebx+2Ch],eax 把eax的值写到当前等级。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート. S9 A( z/ q, s1 `2 o) Y
jle short loc_81214FB 如果eax小于等于0则跳转到 注10。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート; D- f) k2 \2 D, E
右边的分支(esi=0):
* R7 x$ O9 g" Y4 X1 i8 D妖城在线论坛mov [ebx+2Ch],eax 把eax的值写到当前等级。
4 |# `5 \* N4 \. W—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート功能:如果参数是一个带符号的数字,把当前等级进行对应的加减(因为eax里面可以是个负数,add负数就是减了嘛)
- N- n9 I. W# {1 f魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表如果参数是一个不带符号的数字,直接将当前等级修改成为这个数字。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! M! F- D1 A, O
( w" \: E( z$ A9 S/ S, g, c# x. pbbs.mocwww.com注8:这个函数没仔细看,但是从名字看是上传(?)人物数据的子程序。必须执行这个子程序人物的当前等级在执行脚本命令后才会变化。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! O& w7 C4 T% b' {
注9:这里是命令格式错误后的处理。不具体说了。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 P7 ]* l1 x4 ^1 c
魔力私服,最新魔力宝贝私服技术交流8 {# o8 ?3 j8 z1 G0 y1 Y9 X9 [
注10:
& ~/ l* Q% d% d7 W如果等级 变化之后 小于等于0 则跳转到这里。魔力私服,最新魔力宝贝私服技术交流: Z$ o* T- u* p$ i1 }0 C
mov dword ptr [ebx+2ch],1 将等级强制改成1级。* k. s2 {8 e+ v' y3 P I
也就是说实现了等级下限范围的控制,最小等级为1。
) A: A0 q: s; E+ K+ ~5 U—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート################################################################################# H) C( i7 {) m0 t$ P
大概就这么多,说了比较多的废话,但是我感觉在理解这个子程序方面还是有点帮助的,呵呵。魔力私服,最新魔力宝贝私服技术交流: v/ O$ F0 H$ }* S# U* y
这里说明一下,如果你将注7里面的(其他地方的别改)2C都改成B0,那么你在脚本里面使用setlevel命令的话应该就是:
$ D- j4 m- I* J魔力私服,最新魔力宝贝私服技术交流加或者减或者直接设定经验值为多少。
! `4 f) `& I4 F, X魔力私服,最新魔力宝贝私服技术交流但是我们发现这个脚本有2个不好的地方:
; Y- u4 X9 U* R1.等级变化了之后不会有提示,我们想要经验修改之后有提示;妖城在线论坛1 h$ f6 j- E2 L1 M2 j8 U; w7 B
2.只能控制下限或者上限(注7中的jle改成jg就是上限控制了),我们想同时控制上下限。
8 F- z! r7 M: `8 i5 d, h: Kbbs.mocwww.com我们下一篇再说另一个函数,更接近于我们理想中加经验的脚本语句的函数。bbs.mocwww.com9 U# V# w$ T, J
+ x" s, a' s9 ], c% v; K魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表妖头,我不要精华了……我要威望,嘿嘿……
8 ?/ ]. X# R" O b2 pbbs.mocwww.com
) Y9 } n/ f' T& J[ 本帖最后由 feifei1937 于 2009-8-5 12:30 编辑 ]
附件
-
set_level.jpg
(226.57 KB)
-
2009-8-5 12:26