发新话题
打印

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

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

这次给的图是我自己拼的,把整个函数都拼接起来了,比较方便一点,呵呵bbs.mocwww.com4 [; O  J- |( h: R: y! ~2 B3 [% v  n
我们上次说到 set_level 这个函数,现在来一句一句分析这个函数的功能,看看gmsv是怎么执行这个脚本改变游戏里面人物的等级的。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. L& O* [& W; \3 O  b
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート7 x. X' s0 Q4 K, w1 `2 z7 d2 B) k
注1:魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表& w8 S( X* X' ]8 }
上次我说每个子程序的开头都是这样,是为了使用堆栈考虑。下面解释详细些。
, L* D6 ], v; P# @妖城在线论坛准确的说是在linux下的gcc编译器在编译gmsv的源程序的时候,魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表8 w* ^: F( T* H( x. G8 q
(我们现在手上的gmsv不是源程序,而是由源程序编译产生的可执行程序,这个都知道吧 = =!)bbs.mocwww.com0 w( U* s" v2 U6 V7 \: b
由编译器的机制导致的,就是说子程序存在注1代码这件事是gcc干的,
3 m/ N" G" _5 S' A/ D+ T魔力私服,最新魔力宝贝私服技术交流(你反编译其他的任何程序,子程序几乎都以这样的语句开头)
- N9 P; p. p' i魔力私服,最新魔力宝贝私服技术交流并不是程序编写人想这样。这个跟我们理解程序没什么太大关系(那还说= =!)
9 B9 J; \  P1 V  J魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表但是我们要知道在每个子程序里面堆栈指针的作用,因为我们的机器没有太多的寄存器给我们用,有很多数据我们必须先放在内存里,魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表3 d5 R( j/ o% T
必要的时候才拿到寄存器里面进行操作或运算。指针esp和ebp就是指向某个内存地址。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート. ]+ G% u$ B: V' z# }4 }1 {
顺便说一下,80x86机器的堆栈是递减的:就是说堆栈的底部是高地址,而堆栈顶部是低地址。(把堆栈想象成一个先进后出的装羽毛球的筒)
5 M' Q" H: l3 T7 \; h7 E魔力私服,最新魔力宝贝私服技术交流(80x86机器:就是使用IBM80x86指令系统CPU的机器,我们的PC机,只要用的是Intel的CPU都是基于IBM的80x86指令系统)魔力私服,最新魔力宝贝私服技术交流, V& e, ^3 h/ E& V( K" [
想了解更详细关于 堆栈 寄存器 的资料请参见我发的那个汇编教程。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; x% ~5 @1 G3 Y& @9 I5 Q
还有esp前面的e是扩展的意思,是80386以后从16位扩展到了32位的寄存器。魔力私服,最新魔力宝贝私服技术交流/ u4 Y) E, g& A. o! _# q4 F# s2 ?
在我发的汇编电子书里面寄存器一般是ax,bx,cx,dx,sp,bp等等。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表7 X& u  V% ]8 ?; E2 e
bbs.mocwww.com# j" X+ T& u  L3 _
注2:魔力私服,最新魔力宝贝私服技术交流5 \3 q* e# O: B3 W- r
check_num这个函数不一句一句理解了,这个函数很短,有兴趣自己看下,我说下作用:
2 Q5 M9 u0 h+ ^' {" P魔力私服,最新魔力宝贝私服技术交流检查一个命令后面是否带的是否是参数(带正负号或者不带正负号的数)。
4 P1 d+ Z* D0 d9 \( ]—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート这里是数一般是整数。这个函数在这里主要是检测命令所带的参数是否合法魔力私服,最新魔力宝贝私服技术交流+ B8 L3 {/ D, p* T

* n) o, H8 `' |- d6 e6 @% M—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート注3:
! ^7 o1 d( k0 T  |9 y/ u* M5 q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表xor esi,esi 等价于 mov esi,0 就是把esi赋值为0,这个后面有用到。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; l& U7 A. u& \6 P
add esp,10h 是把堆栈指针向堆栈底方向移动2个字节。bbs.mocwww.com0 k. }3 s) T: F" E$ G; v$ Z
关键:test eax,eax 是把eax跟自己做 按位与(and) 逻辑运算结果不影响eax的值,只影响标志位(跟and不一样的地方)。
" E; J* M" b# N; q4 U妖城在线论坛eax如果为0,那么标志位(不知道标志位是啥参见汇编教程)ZF=1,如果是负数,那么标志位SF=1。
, ]9 K; E( u4 k: N—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートjz short loc_8121514 如果eax == 0(即ZF==1)则跳转到(short表明是短跳转)loc_8121514处(即绿色线),否则往下执行(红色线)。
1 F, ~/ r" d) K7 L魔力私服,最新魔力宝贝私服技术交流loc_8121514 处很明显,是错误的提示。即 注9 所在的框。
: T7 M* W3 `8 e" Q/ P- W/ A魔力私服,最新魔力宝贝私服技术交流这里补充一下check_num的返回值:返回的是命令后所带的参数类型,在al里,al是eax(ax)寄存器的低8位。妖城在线论坛) [( Q+ q% b% e5 `  D- r- n! j3 ?
这里的 类型 是如下含义:如果是“+”或者“-”号,则返回他们的ASCII码(见注4),如果是数字,则返回对应的数
6 s& d2 S0 {6 F+ V6 ?bbs.mocwww.com如果是数字,则返回对应的数”解释:—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート& ^# y7 I. l0 v
比如 setlevel 1,因为gmsv读取到的其实是"1”的ASCII码,即49,那么得减去48(这个操作是在后面的get_num2函数里实现的),bbs.mocwww.com! Q& ]( _6 H1 k1 |
再放到al寄存器里面,才是适合CPU处理的数字“1”。bbs.mocwww.com1 o& W* Q2 x- E

  f$ l/ B/ V& q2 z妖城在线论坛注4:
. \. c/ }& \, K: d3 D( b魔力私服,最新魔力宝贝私服技术交流这里两个 cmp,参与比较的是check_num的返回值eax,43是“+”的ASCII码,45是“-”的ASCII码。
7 ], s* r1 r" B  R魔力私服,最新魔力宝贝私服技术交流首先,第一个 cmp,如果是“+”号,那么跳转到loc_812150C,否则往下执行,即第二个cmp魔力私服,最新魔力宝贝私服技术交流; v2 X! v& ]; t1 T3 I& T- L# I: J& A6 o
第二个 cmp,如果是“-”号,那么跳转到loc_812150C,否则(既不是“+”也不是“-”),那么往下执行。bbs.mocwww.com' O/ U; [6 L" b
注意这里的往下执行红线,即loc_81214B4
$ s3 D0 `: S$ L魔力私服,最新魔力宝贝私服技术交流妖城在线论坛9 r4 w' Q, o$ Y# U2 T# D8 H, |2 R
注5:魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 \2 `6 d. E$ D
mov esi,1 就是把 1 赋值给 esi。对了!看注3里面,不是esi赋值为0了吗?
+ T4 u) ~2 ]& B' ?( f—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートesi在接下来的作用是:当作条件判断跳转,这里后面还会说。bbs.mocwww.com- R5 w* J. E8 U7 [
这里,check_num这个函数的影响体现了,就是说:如果脚本参数是不带正负号的数字,那么esi的值是0,如果是带符号的,那么esi的值是1。妖城在线论坛, T+ c" g' ?3 @  B, Q/ O! D
看注5的另一部分:test esi,esi 不说了吧?和注3里test一样的。好了,记住这里根据esi不同而又不同的处理(体现在注7)。
, k4 }& R* n! Y8 `9 m" Nbbs.mocwww.com
6 r. F: a9 `2 |; V. o+ n—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート注6:
" p) a2 a' ]. P- X6 n9 h5 X魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表get_num2这个函数具体也不分析,这里给出这个函数的作用:—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート# [0 \: o' @3 }
取得数字适合在寄存器里运算的值。就这么简单。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表/ {4 b$ f8 ?' v, k8 Z
如果是正数,那么返回在eax里面就是正数;
* V3 m5 ]7 w3 Z6 ]+ B1 s1 @5 \bbs.mocwww.com如果是负数(我们写的负数CPU是不认识的,必须这个函数处理之后让CPU认识),那么返回在eax里面就是正数。
, A8 l' Z, q" gbbs.mocwww.com
. }3 ]2 N% ^, Y8 e妖城在线论坛注7:妖城在线论坛8 e6 }" A9 A0 h$ A; K$ i& ^
我觉得这是函数最重要和最核心的一部分。理解了这里,很多事情就好解决了。
& u: M" m" z3 V% E' g- Sbbs.mocwww.com先来看这里出现的"2Ch”。转换为10进制是44,我们再翻看数据库的character表,看到等级是在第9栏。妖城在线论坛' D4 W4 A1 q8 L. w9 b4 b( I
那么这个44是怎么得出的呢?答案是:character表的 (9 + 2) * 4 == 44 == 2Ch。反正记住这个公式就行了。妖城在线论坛  }4 \& W% D8 T. a  K; {" x
再比如当前人物经验值在character表的42栏,加2为44,再乘以4等于176,转换为16进制是B0/ _0 d( S% B& a. k; X
因为我们的目的就是加经验,所以这个数后面我们还会说到。
$ i9 X4 [& d( m2 M5 X  f& }魔力私服,最新魔力宝贝私服技术交流[ebx+2Ch] 意思是取得ebx+2Ch这个地址处的内存数据。这个内存放的就是人物的当前等级。以后我就说当前等级了。bbs.mocwww.com9 x) V; Y* V' R
继续正题:妖城在线论坛0 V+ v. Q& ]3 l
我们看到整个注7是由esi为0或者为1进行跳转的两个分支。
' i7 I" |% \+ m% f# o" V) T魔力私服,最新魔力宝贝私服技术交流我们分析左边的分支(esi=1):魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表7 S0 F9 b- c1 P3 M
add eax,[ebx+2Ch]         把当前等级加到(get_num2的返回的)eax里面。
8 V3 T+ H0 T6 C( ~( {魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表test eax,eax                    将eax跟自己相与。
+ W, x& j6 D3 k- |/ B—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートmov [ebx+2Ch],eax         把eax的值写到当前等级。
& P" D, j) [+ a* }2 E7 ^1 Y—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートjle short loc_81214FB    如果eax小于等于0则跳转到 注10。
6 J# Y% N. D) W" `  {bbs.mocwww.com右边的分支(esi=0):
$ p$ A1 y& y2 J8 E- T2 |# C7 K* c妖城在线论坛mov [ebx+2Ch],eax        把eax的值写到当前等级。
/ E( v( h* w$ ]7 s魔力私服,最新魔力宝贝私服技术交流功能:如果参数是一个带符号的数字,把当前等级进行对应的加减(因为eax里面可以是个负数,add负数就是减了嘛)魔力私服,最新魔力宝贝私服技术交流- t& V: [9 I$ f; F5 n  b
如果参数是一个不带符号的数字,直接将当前等级修改成为这个数字。
( h9 y1 V2 {: v! V魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
9 W) Y: l& o5 a1 d魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表注8:这个函数没仔细看,但是从名字看是上传(?)人物数据的子程序。必须执行这个子程序人物的当前等级在执行脚本命令后才会变化。妖城在线论坛' b! s$ c6 T: j+ H% E; }1 @0 Z
注9:这里是命令格式错误后的处理。不具体说了。
. d( a' ]: ^: N. O/ ^7 b4 mbbs.mocwww.com
- d: L2 i) D; D4 u& @+ b妖城在线论坛注10:—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ j! H# `8 x7 T1 y) h- r0 F
如果等级 变化之后 小于等于0 则跳转到这里。
, |! y  h; f) R# K1 k* m1 a& ]! n魔力私服,最新魔力宝贝私服技术交流mov dword ptr [ebx+2ch],1 将等级强制改成1级。
) N8 i# ]6 J. R—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート也就是说实现了等级下限范围的控制,最小等级为1。魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表. V5 D# [% w, V1 a  a8 y
#################################################################################
4 ?. O& G% ]2 Q7 \$ N4 B& o% d/ c—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート大概就这么多,说了比较多的废话,但是我感觉在理解这个子程序方面还是有点帮助的,呵呵。魔力私服,最新魔力宝贝私服技术交流5 O: B" _. F. {0 H" ]
这里说明一下,如果你将注7里面的(其他地方的别改)2C都改成B0,那么你在脚本里面使用setlevel命令的话应该就是:妖城在线论坛8 t3 X$ N* r( [% \2 w
加或者减或者直接设定经验值为多少。妖城在线论坛/ V7 Y1 N+ e" U( [7 C* T* U
但是我们发现这个脚本有2个不好的地方:妖城在线论坛! W$ ]9 J+ H6 |, |! t2 H
1.等级变化了之后不会有提示,我们想要经验修改之后有提示;  k6 j; Z, ~' B& G0 E  C
2.只能控制下限或者上限(注7中的jle改成jg就是上限控制了),我们想同时控制上下限。
4 ]# Y, Q. s4 u. Ubbs.mocwww.com我们下一篇再说另一个函数,更接近于我们理想中加经验的脚本语句的函数。
7 W9 J8 B; b. ~. A" g' b—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート
+ e& Z+ N; z( \* a: J! ^' mbbs.mocwww.com妖头,我不要精华了……我要威望,嘿嘿……
4 k4 d8 q+ s( K$ \3 Mbbs.mocwww.com
1 Z9 b% A; L* b2 |* U( t$ X—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート[ 本帖最后由 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

沙发我占了~~再看~~呵呵
6 g( }# s2 M* w好东西啊~~

TOP

引用:
原帖由 yaoguai 于 2009-8-5 12:47 发表
; f+ e# ^( b) o8 ~5 S! V妖城在线论坛沙发我占了~~再看~~呵呵
) w1 N" I2 y  V: g2 T9 y; u魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表好东西啊~~
% e1 P; V+ {7 o" m& \

; Q3 B0 a  G7 Y6 v' l8 W" W- _
引用:
原帖由 mm80420mm 于 2009-8-5 12:53 发表
0 F7 t+ x/ ]- H—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート试著理解               
妖城在线论坛+ o/ s) a, j  ^8 M7 I  T) u' |' e
加油,你们肯定能看懂的,以后改出更牛逼的东西

TOP

这么肯定……

TOP

引用:
原帖由 yaoguai 于 2009-8-5 20:17 发表 ( X7 a) N+ C0 x) @4 `
这么肯定……
& Z9 X- U( U9 k& a/ R* Bbbs.mocwww.com肯定前面还有个词……看见了伐?………………

TOP

我知道啊  “你们”……

TOP

引用:
原帖由 yaoguai 于 2009-8-6 21:38 发表
2 J, d9 ?$ J3 z* y; L3 \$ pbbs.mocwww.com我知道啊  “你们”……
% r/ i6 H) v: M8 J0 t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート加油…………………………………………

TOP

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

TOP

引用:
原帖由 40830702 于 2009-8-9 09:05 发表 —魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート0 r: j% i  F- J- g# _. v/ s- v
把图插到文章中,这样看着很累
bbs.mocwww.com( e& I# x7 x' q4 E* Z- S7 I
把图保存到电脑里面,再看文章……如何……

TOP

很累 很累=。=

TOP

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

TOP

发新话题