发新话题
打印

修改gmsv制造出我们想要的脚本语句【第二篇】

修改gmsv制造出我们想要的脚本语句【第二篇】

这次给的图是我自己拼的,把整个函数都拼接起来了,比较方便一点,呵呵—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1 Y' f$ b( C3 i7 [: w
我们上次说到 set_level 这个函数,现在来一句一句分析这个函数的功能,看看gmsv是怎么执行这个脚本改变游戏里面人物的等级的。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート  b' T. {+ p+ ~( c
0 A; Q' ?) [) ~' R$ ^4 q) x
注1:
% Q) a8 a) Y2 N( }! k6 A2 r2 L! @妖城在线论坛
上次我说每个子程序的开头都是这样,是为了使用堆栈考虑。下面解释详细些。
3 b) j! o2 G! |7 n妖城在线论坛准确的说是在linux下的gcc编译器在编译gmsv的源程序的时候,妖城在线论坛$ j5 j; A3 w. z
(我们现在手上的gmsv不是源程序,而是由源程序编译产生的可执行程序,这个都知道吧 = =!)魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表! }, O& D# B2 b& L
由编译器的机制导致的,就是说子程序存在注1代码这件事是gcc干的,
; D/ O8 l5 g% n$ j7 k" n7 rbbs.mocwww.com(你反编译其他的任何程序,子程序几乎都以这样的语句开头)魔力私服,最新魔力宝贝私服技术交流# q  m+ l0 }; M2 y* ~# Z! N9 C5 S- Q* L
并不是程序编写人想这样。这个跟我们理解程序没什么太大关系(那还说= =!)% z: c# m/ C( Z4 y# l7 O% ]
但是我们要知道在每个子程序里面堆栈指针的作用,因为我们的机器没有太多的寄存器给我们用,有很多数据我们必须先放在内存里,
) o( _) v& }* C3 J. u! W  hbbs.mocwww.com必要的时候才拿到寄存器里面进行操作或运算。指针esp和ebp就是指向某个内存地址。
/ b7 k0 C+ c* O( Q& d—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート顺便说一下,80x86机器的堆栈是递减的:就是说堆栈的底部是高地址,而堆栈顶部是低地址。(把堆栈想象成一个先进后出的装羽毛球的筒)
: {+ a6 D+ g3 q* B魔力私服,最新魔力宝贝私服技术交流(80x86机器:就是使用IBM80x86指令系统CPU的机器,我们的PC机,只要用的是Intel的CPU都是基于IBM的80x86指令系统)
( }6 H( w5 P& [! w  s魔力私服,最新魔力宝贝私服技术交流想了解更详细关于 堆栈 寄存器 的资料请参见我发的那个汇编教程。魔力私服,最新魔力宝贝私服技术交流2 L% E1 @  F3 Q$ c! M2 ^9 U
还有esp前面的e是扩展的意思,是80386以后从16位扩展到了32位的寄存器。
; a- _: l. a% Z* a) {4 {在我发的汇编电子书里面寄存器一般是ax,bx,cx,dx,sp,bp等等。
. w; ~$ g. |. m' A) J- U3 k魔力私服,最新魔力宝贝私服技术交流
( U, l! }! k8 b0 Lbbs.mocwww.com注2:
& X, Q6 j/ @; S7 }8 G! ^bbs.mocwww.comcheck_num这个函数不一句一句理解了,这个函数很短,有兴趣自己看下,我说下作用:
$ V- m5 W8 W; k) |( H. w- w% K检查一个命令后面是否带的是否是参数(带正负号或者不带正负号的数)。
2 O8 W9 q+ Q8 [) u8 F—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这里是数一般是整数。这个函数在这里主要是检测命令所带的参数是否合法
0 g; |+ y) J9 I/ D% ?% Y魔力私服,最新魔力宝贝私服技术交流
! I6 B' X* a, ?9 D0 i! x5 r% m. t, M魔力私服,最新魔力宝贝私服技术交流注3:魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* ]) W3 A7 W1 A2 D
xor esi,esi 等价于 mov esi,0 就是把esi赋值为0,这个后面有用到。
0 i4 F6 T; z' O- ]/ Q6 y' W—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートadd esp,10h 是把堆栈指针向堆栈底方向移动2个字节。
& d2 ~" @& ]4 E; Z魔力私服,最新魔力宝贝私服技术交流关键:test eax,eax 是把eax跟自己做 按位与(and) 逻辑运算结果不影响eax的值,只影响标志位(跟and不一样的地方)。
: w' e' @0 q' J9 z/ G6 b9 r妖城在线论坛eax如果为0,那么标志位(不知道标志位是啥参见汇编教程)ZF=1,如果是负数,那么标志位SF=1。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 x$ r- k3 [, v5 X0 y2 h" r7 j9 I
jz short loc_8121514 如果eax == 0(即ZF==1)则跳转到(short表明是短跳转)loc_8121514处(即绿色线),否则往下执行(红色线)。
8 E- |8 b" N' i) E: f* A. n魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表loc_8121514 处很明显,是错误的提示。即 注9 所在的框。
& e# [7 l! {& J% v& ~这里补充一下check_num的返回值:返回的是命令后所带的参数类型,在al里,al是eax(ax)寄存器的低8位。
# V1 c  l0 w" ~  x% g2 r妖城在线论坛这里的 类型 是如下含义:如果是“+”或者“-”号,则返回他们的ASCII码(见注4),如果是数字,则返回对应的数妖城在线论坛! W( g' n/ e2 V0 u1 e! b/ P4 W
如果是数字,则返回对应的数”解释:
( g  q  A$ S3 V5 R# d" ]魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表比如 setlevel 1,因为gmsv读取到的其实是"1”的ASCII码,即49,那么得减去48(这个操作是在后面的get_num2函数里实现的),
" P' A, P1 j5 {( g4 p/ G& p) E魔力私服,最新魔力宝贝私服技术交流再放到al寄存器里面,才是适合CPU处理的数字“1”。
) s# z# Y4 ?+ _; w+ q, }$ ?妖城在线论坛—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート% R  w& V* F4 P! k  Q8 o
注4:5 x( |9 i. F# u
这里两个 cmp,参与比较的是check_num的返回值eax,43是“+”的ASCII码,45是“-”的ASCII码。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート! \2 ^: U% G3 t0 T
首先,第一个 cmp,如果是“+”号,那么跳转到loc_812150C,否则往下执行,即第二个cmp
8 v* j, N% M) }魔力私服,最新魔力宝贝私服技术交流第二个 cmp,如果是“-”号,那么跳转到loc_812150C,否则(既不是“+”也不是“-”),那么往下执行。
  O7 }. |& P/ O9 S; H( `6 p- Z1 B—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート注意这里的往下执行红线,即loc_81214B4
" T" H: h) c- L9 m2 _' E, v魔力私服,最新魔力宝贝私服技术交流
4 a6 H9 u; J2 F魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表注5:魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表8 b0 g& L9 b$ M( l9 D2 R4 W
mov esi,1 就是把 1 赋值给 esi。对了!看注3里面,不是esi赋值为0了吗?
+ p( d6 i3 ~& \6 U6 ]# E6 Vbbs.mocwww.comesi在接下来的作用是:当作条件判断跳转,这里后面还会说。bbs.mocwww.com8 K" l; l2 o8 f; S6 A
这里,check_num这个函数的影响体现了,就是说:如果脚本参数是不带正负号的数字,那么esi的值是0,如果是带符号的,那么esi的值是1。
- T4 \) X: z- e6 y魔力私服,最新魔力宝贝私服技术交流看注5的另一部分:test esi,esi 不说了吧?和注3里test一样的。好了,记住这里根据esi不同而又不同的处理(体现在注7)。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート# V4 ]) m' m; W' S& i& n, d8 |  Y

6 m& b) H: g( |) }9 u) p( ~& Y8 D0 {bbs.mocwww.com注6:
- g0 f  u; v2 ^! S% n. }: fget_num2这个函数具体也不分析,这里给出这个函数的作用:妖城在线论坛& E3 Q% s8 J' o3 X9 F, A  A8 A
取得数字适合在寄存器里运算的值。就这么简单。1 q% O$ A2 n: Q5 ~6 W
如果是正数,那么返回在eax里面就是正数;bbs.mocwww.com4 U2 X* ^0 D$ @! a
如果是负数(我们写的负数CPU是不认识的,必须这个函数处理之后让CPU认识),那么返回在eax里面就是正数。
! q& U: a# K% |4 d! d+ ^0 m魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表bbs.mocwww.com5 d, P* r/ M# p  A" b9 j. f
注7:
& c- q" u; A3 u: T( |, T妖城在线论坛我觉得这是函数最重要和最核心的一部分。理解了这里,很多事情就好解决了。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. }" _6 O3 W( [0 B  a; u9 P4 P, }, k
先来看这里出现的"2Ch”。转换为10进制是44,我们再翻看数据库的character表,看到等级是在第9栏。
, O5 P( S) }( W8 n5 w—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート那么这个44是怎么得出的呢?答案是:character表的 (9 + 2) * 4 == 44 == 2Ch。反正记住这个公式就行了。妖城在线论坛; X0 V  }( ~  @) v
再比如当前人物经验值在character表的42栏,加2为44,再乘以4等于176,转换为16进制是B0魔力私服,最新魔力宝贝私服技术交流4 a# w& r! X6 [0 ~
因为我们的目的就是加经验,所以这个数后面我们还会说到。
2 {; Y& [2 d; w7 F, Q0 ]. Z—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート[ebx+2Ch] 意思是取得ebx+2Ch这个地址处的内存数据。这个内存放的就是人物的当前等级。以后我就说当前等级了。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート8 i/ |" K: Q) F+ X
继续正题:
6 s( M5 e% k- L5 q3 C: C3 a魔力私服,最新魔力宝贝私服技术交流我们看到整个注7是由esi为0或者为1进行跳转的两个分支。
9 I: E6 r2 R7 a* Y7 S5 ?魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表我们分析左边的分支(esi=1):魔力私服,最新魔力宝贝私服技术交流8 p+ z) Z$ B& ^9 Q. m  E. d
add eax,[ebx+2Ch]         把当前等级加到(get_num2的返回的)eax里面。* Z7 I( c0 J. Z2 A! E) C5 s+ p+ a7 `
test eax,eax                    将eax跟自己相与。
+ G( z- D- F1 R, G; `bbs.mocwww.commov [ebx+2Ch],eax         把eax的值写到当前等级。
4 A6 X8 f% F# P, _" Hjle short loc_81214FB    如果eax小于等于0则跳转到 注10。
8 r6 |9 T' {7 e6 Y2 m; V0 e—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート右边的分支(esi=0):
9 r( Y/ M1 T' J- z# H! A9 nmov [ebx+2Ch],eax        把eax的值写到当前等级。bbs.mocwww.com9 l! ]& c3 d2 f
功能:如果参数是一个带符号的数字,把当前等级进行对应的加减(因为eax里面可以是个负数,add负数就是减了嘛)
/ I$ {" w+ q: r: s. u+ bbbs.mocwww.com如果参数是一个不带符号的数字,直接将当前等级修改成为这个数字。
0 C* A" l) t0 K( m, a9 G魔力私服,最新魔力宝贝私服技术交流
+ g" U% {3 _$ I6 C+ l; \8 Q4 cbbs.mocwww.com注8:这个函数没仔细看,但是从名字看是上传(?)人物数据的子程序。必须执行这个子程序人物的当前等级在执行脚本命令后才会变化。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表8 I0 @: b& h! o* j/ W9 M7 u
注9:这里是命令格式错误后的处理。不具体说了。魔力私服,最新魔力宝贝私服技术交流5 z0 h0 S$ L5 [7 q( z0 y/ E2 M

- E. D! _+ ^# V$ P. q' K9 ebbs.mocwww.com注10:2 X6 H. f# p+ W2 D! I
如果等级 变化之后 小于等于0 则跳转到这里。
! [' O) H9 l$ t4 W- Jmov dword ptr [ebx+2ch],1 将等级强制改成1级。妖城在线论坛3 s( g/ |  b. Q$ S5 Y' T
也就是说实现了等级下限范围的控制,最小等级为1。
* m" A" y' D# s- v—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート#################################################################################
4 @7 h0 w- T+ P0 k9 ~% _魔力私服,最新魔力宝贝私服技术交流大概就这么多,说了比较多的废话,但是我感觉在理解这个子程序方面还是有点帮助的,呵呵。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 q4 ?; c  J. O/ @3 k
这里说明一下,如果你将注7里面的(其他地方的别改)2C都改成B0,那么你在脚本里面使用setlevel命令的话应该就是:魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表+ {" z+ d  O2 c! x+ X
加或者减或者直接设定经验值为多少。bbs.mocwww.com1 P" [( C5 ]! i4 |
但是我们发现这个脚本有2个不好的地方:魔力私服,最新魔力宝贝私服技术交流2 |/ G+ h" G$ R% S( F
1.等级变化了之后不会有提示,我们想要经验修改之后有提示;
9 Y7 Q. h6 k- ?* I7 c" E& O9 z魔力私服,最新魔力宝贝私服技术交流2.只能控制下限或者上限(注7中的jle改成jg就是上限控制了),我们想同时控制上下限。
3 |/ g2 [* |0 e7 Z% ^. G9 C: S  }bbs.mocwww.com我们下一篇再说另一个函数,更接近于我们理想中加经验的脚本语句的函数。
7 o/ p: r0 p0 f  @
) C5 ^* I& N. V) ^& ]# X8 Lbbs.mocwww.com妖头,我不要精华了……我要威望,嘿嘿……, B) G* l9 _5 ]6 k

6 a0 |! {: J- }bbs.mocwww.com[ 本帖最后由 feifei1937 于 2009-8-5 12:30 编辑 ]

附件

set_level.jpg (226.57 KB)

2009-8-5 12:26

set_level.jpg

本帖最近评分记录
  • 全熟牛排溅血 妖力 +30 2017-5-18 06:42
  • 易凡 威望 +1 最近越来越少会员肯在学有心得后共享了 2009-8-14 23:22

TOP

沙发我占了~~再看~~呵呵
! T/ ?. Z. c  P1 Y- G- Ibbs.mocwww.com好东西啊~~

TOP

引用:
原帖由 yaoguai 于 2009-8-5 12:47 发表
% z& S9 P( V6 H妖城在线论坛沙发我占了~~再看~~呵呵
9 q* C* Q- v- U妖城在线论坛好东西啊~~
bbs.mocwww.com7 `" m* D' i! m. K% X8 |
& j- A3 v! @" v0 o0 H: a
引用:
原帖由 mm80420mm 于 2009-8-5 12:53 发表 # H; o( a. V/ ^* l% K$ C, n7 y6 C; F, ?
试著理解               
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表8 s% f9 X1 T6 I7 N3 `
加油,你们肯定能看懂的,以后改出更牛逼的东西

TOP

这么肯定……

TOP

引用:
原帖由 yaoguai 于 2009-8-5 20:17 发表 bbs.mocwww.com( Z- o3 L- h% r0 D/ l, A
这么肯定……
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1 l- e% n/ ~$ Z
肯定前面还有个词……看见了伐?………………

TOP

我知道啊  “你们”……

TOP

引用:
原帖由 yaoguai 于 2009-8-6 21:38 发表 —魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート6 i3 {" g0 u5 A8 i! F$ o8 ]/ r
我知道啊  “你们”……
8 m% M  a- X, F% x) X/ @4 O3 s( A% _, b妖城在线论坛加油…………………………………………

TOP

把图插到文章中,这样看着很累
fuck you,and fuck your famliy

TOP

引用:
原帖由 40830702 于 2009-8-9 09:05 发表
9 n9 l2 ^7 ]* `! U+ s' y* Y—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート把图插到文章中,这样看着很累
  f5 o* S4 y$ i5 J5 L) a! R7 `把图保存到电脑里面,再看文章……如何……

TOP

很累 很累=。=

TOP

我和看天书一样
~我的丗界,隻有妳能領銜主演☆~

TOP

发新话题