发新话题
打印

[魔力私服分享] 给新人,仿GA添加自己的头饰系统

给新人,仿GA添加自己的头饰系统

了解GA的都知道,GA有一个头饰自定义系统,可以无限添加头饰效果,很实用的一个功能。
5 ?0 Z2 ]6 Z* t" O+ ~( W魔力私服,最新魔力宝贝私服技术交流具体请看:http://cgdev.me/forum-viewthread ... t-%CD%B7%CA%CE.html—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) o+ [" v$ v/ E! f' T5 P: y/ ~

& V- w- E1 e4 r; M9 x( U' _5 h—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート今天我们要做的就是让韩服GMSV也同样支持这个系统,工具呢,我们今天准备了IDA和GDB,下面就让我们来分析并实现我们想要的头饰系统。
' L% X  h  Z1 U; p魔力私服,最新魔力宝贝私服技术交流
  ?3 M. v/ E* W# L1 ?魔力私服,最新魔力宝贝私服技术交流首先我们打开IDA,载入我们的GMSV,打开Function。5 E5 E1 V5 x; r# g3 U/ @
bbs.mocwww.com! P( p; \* D" X/ A* k1 F. n1 u$ d  g
哇,好多函数,是不是眼睛都花了?别着急,我们当然不是挨个找了,事实上有很多种办法来找到自己需要的函数,我们就先从一个笨但是比较直接的方法开始--搜索相关函数。在函数窗口里面按alt+t打开搜索窗口,头饰的英文肯定和head有关系,聪明的人可以立即知道是headcover,我们就先从head搜索开始:
) X- U; t/ n& J1 A
( }) e! |" [' q0 k! j—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート 魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表4 r' c7 @6 j5 _$ Z& ~: P! c2 X
这2个看起来都不是,pass,继续alt+t- N4 D4 n. o8 {0 e( r# z
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート, D. y) I1 A6 C( g* K0 R

" a' B  d% _, c# M# Z; {6 \. Z. P. q魔力私服,最新魔力宝贝私服技术交流运气真好,第三次就找到了,checkheadcover,即便不是头饰,那也绝对可以帮助我们分析,OK,让我们进入这个函数。
0 g1 {) N3 Y/ w8 ^妖城在线论坛
) T# I$ z' q$ J! R魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
% o: v; H; E; D& H7 m9 {' b可以看到,这个函数引入了一个变量,这里我们要判断变量的含义,用GDB可以很容易的实现,联系上下函数也能知道,这里我们假设传入的是玩家的指针(事实上除了对socket操作的,很多对人物进行更新的函数引入的都是人物指针)
: T, ]0 h) P+ H. ~1 b# Z  i% h妖城在线论坛
9 H8 l, j" }' T. J妖城在线论坛我们往下看
复制内容到剪贴板
代码:
push    ebp
mov     ebp, esp
push    edi
push    esi
push    ebx
sub     esp, 0Ch
这里是函数保存堆栈用的,无视
复制内容到剪贴板
代码:
mov     edi, [ebp+arg_0]
cmp     dword ptr [edi+0Ch], 1
jz      short loc_80E973A
解释:
, B- f7 ^4 S2 F妖城在线论坛设置edi=参数0
$ t/ v3 x. D! q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表对[edi+0Ch]与整数1进行比较
2 }4 ~0 @1 E. v% R( g+ j—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート事实上看到这里我们可以确定参数就是指针了,0Ch正是对象内存里面是否为人物的一个判断,如果此值为1,代表这个指针就是玩家指针。
! R4 r' \0 `5 S魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表我们当然是1,所以我们跳转到loc_80E973A:
复制内容到剪贴板
代码:
loc_80E973A:
mov     dword ptr [edi+974h], 0FFFFFFFFh
xor     esi, esi
解释:把玩家指针+0x974处双字类型的内存赋值-1,聪明人应该就想到了,没错,这个应该就是头饰内存了,到底是不是,我们一会再说。
& N  R0 \2 j% B% g% N我们接下来往下看:
复制内容到剪贴板
代码:
loc_80E9746:
push    esi
push    edi
push    0DECh
push    offset aItemItem_c ; "item/item.c"
call    _CHAR_getItemIndex
add     esp, 10h
cmp     ds:81F06C0h, eax
mov     ebx, eax
jle     loc_80E98E4
call    _CHAR_getItemIndex 根据字面意思,这个是是获取玩家身上的物品指针,我们同时也看到,从这里开始,是一个很长的循环,一直循环到函数结尾(IDA内绿色的粗线代表的是循环)
" r  [+ M! G- B! M4 J循环中间我们先不要管,我们来到循环的结尾:
复制内容到剪贴板
代码:
loc_80E9874:
inc     esi
cmp     esi, 7
jle     loc_80E9746
解释:esi自增1,然后判断esi是否小于等于7,小于等于的话就跳转到开头,这样我们就知道了,这个大循环其实判断的就是我们身上0-7的道具栏里面的物品某个值是否和头饰匹配,那么这个值是什么呢?当然是ID啦,具体如何判断的我们不再赘述,我们往循环的后半部分找,把函数往上拉:
复制内容到剪贴板
代码:
loc_80E9860:
xor     edx, edx
mov     ecx, offset HeadCover
nop
看到了吗?这里就是关键
) A# L2 J% k8 z% `+ M& t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートmov     ecx, offset HeadCoverbbs.mocwww.com& w( Y2 @( R+ h) C
把HeadCover数组的首地址赋予ecx,HeadCover这段内存里面到底存储的是什么呢?我们可以双击HeadCover然后选择Hex View来查看它的16进制数据妖城在线论坛% D; [( g6 K* y8 K2 m: O. {  P
没错!这里就是 道具ID-头饰形象 的对应关系了!每8个字节代表一个头饰,前四个是道具ID,后四个是头饰的地图编号。
) P$ g" F6 g9 G魔力私服,最新魔力宝贝私服技术交流# P' h- b5 e0 t$ x$ `
回到视图界面,继续查看:魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表1 N$ C5 j+ I/ R/ @
妖城在线论坛2 l! q! z9 P+ G$ }) O3 c
引用:
loc_80E9868:
; c. G" ^( ^/ r$ P: \1 p1 L& z魔力私服,最新魔力宝贝私服技术交流cmp     eax, [ecx+edx*8]—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート1 j+ a( S3 i+ x. f
jz      short loc_80E9883
8 Z% E/ |/ `. K  q魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表
8 g# @/ ^3 g' V9 `2 |5 l  k& u魔力私服,最新魔力宝贝私服技术交流解释:
8 Z$ K5 D8 @. _5 m+ g3 p判断eax的值是否等于[ecx+edx*8]bbs.mocwww.com' E9 q; O$ Y+ P( Z2 j
ecx事实上就是头饰的首地址,那么[ecx+edx*8]我们可以理解为,头饰数组的首地址+edx*8 edx在上面已经清0,这里只是作为一个循环数字,所以这里其实是判断eax是否等于第一个头饰所需要的道具ID,由此我们也知道,eax内存储的值其实就是道具的ID,这里其实就是CPU的一个寻址过程,继续往下看:2 q3 g+ u6 Y, O# ?- }2 X

6 @7 O7 {/ `: d5 k+ A$ Z" t魔力私服,最新魔力宝贝私服技术交流
引用:
inc     edx魔力私服,最新魔力宝贝私服技术交流2 B0 {6 ^# }/ l* X' x- E  r
cmp     edx, 52h魔力私服,最新魔力宝贝私服技术交流. p, l" @- U  P
jbe     short loc_80E9868
魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表* l) a/ r7 t. {2 J0 d' [
, F; @4 l+ b" x
edx自增1,如果edx小于等于0x52的话,就回到开头继续循环判断。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート3 q4 ^/ i+ @4 b- h3 ]% l4 R3 Z
到这里我们就清楚了,GMSV一共支持0x52种头饰,每个头饰占用8个字节,前四个是道具ID,后四个是道具ID所对应的头饰图档。
% q# K1 c" \2 t—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート我们来看一下匹配成功以后的跳转
复制内容到剪贴板
代码:
loc_80E9883:
mov     eax, [ecx+edx*8+4]//[ecx+edx*8]是道具的ID号,那么[ecx+edx*8+4]正好就是头饰的图档编号啦。
mov     [edi+974h], eax
jmp     loc_80E9732
本段的意思就是将人物内存里的0x974位置设置为道具ID所对应的头饰编号,由此也印证了我们在文章开头所说的0x974应该就是头饰内存的判断。
! m) [% n* J# b) a/ _. U7 l
4 B( o3 I+ Y- L. C—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート分析到此结束,整个过程我们现在来理一下:bbs.mocwww.com% W1 r4 m2 L: M( U. b# h
bbs.mocwww.com7 @5 A$ {: S) w( ^
GMSV首先判断人物装备0-7栏位的物品ID,然后用这个ID对所有头饰所需要的道具ID进行对比,如果对比成功,则将人物内存里的0x974位置设置为道具ID所对应的头饰编号。
$ \( s) b+ C1 a/ `5 a: V: I9 K—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート魔力私服,最新魔力宝贝私服技术交流! t0 w3 x( t6 ^
具体的实现方法,高手可以直接找个空白写,新手可以用shen的扩展库源码直接修改,在GMSV启动的时候读入一个txt文件,把道具ID和图档编号写入一个数组,然后修改mov     ecx, offset HeadCover为你的数组地址即可,当然同时也要修改0x52这个头饰数组的大小。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート: {9 c3 f$ e7 a  Z5 C3 }8 e
" T  i/ z1 r1 a6 f. ?+ E- n
[ 本帖最后由 lenovo 于 2014-4-9 09:56 编辑 ]

TOP

所以说是给新手看的嘛,哈哈。

TOP

回复 8楼 的帖子

55不就是头饰种类吗?
3 l1 Y* g6 P) ?) x7 {妖城在线论坛
/ P: {1 }, D, B, B2 a! [$ b" R魔力私服,最新魔力宝贝私服技术交流HeadCover是头饰数组指针
9 M" w; d  Q' d- e8 x2 ~% Mbbs.mocwww.com# ?; P! f) v$ E# C' \
HeadNum=sizeof(HeadCover)/8

TOP

发新话题