传奇客户端源代码分析讨论~

shiqizheng 2003-12-27 06:26:40
说句实话,我对这个游戏没有什么兴趣。只不过上大学的时候看到很多同学因为这个游戏而浪费了大量时间觉得有点费解,所以在得到客户端的源代码后分析分析看看他到底是什么做的。
客户端是VC SDK写的,使用了DX(废话)。不过服务器好像全部是用Delphi写的,可能是因为Delphi操作数据库比较方便,而且个人觉得处理字符串的函数比较丰富吧~客户端自己使用了一个叫做WindHron的类库,主要是用来处理自定义的wil/wix图片资源的。还定义了许多操作D3D裁质的class。通讯方面使用异步socket,每次游戏中收到数据包后进队列缓冲,每隔一定时间出队列,播放出服务器的数据指令。然后就是通讯数据格式使用Base64编码,用#和!作为一个message的分割符。
这1,2天的分析就是这么点点,希望大家随便讨论讨论,呵呵,个人觉得代码有点乱,里面很多调试的代码段都没有删除掉。
...全文
1097 点赞 收藏 22
写回复
22 条回复
tmman 2004年01月03日
上面代码是比较老的版本,不过可作为参考,socket包的解析过程最好能将目前最新版的mir3.exe脱壳之后再进行分析。
回复 点赞
shiqizheng 2003年12月31日
谢谢大家的讨论。具体我已经写了个图片分离的工具大家可以到这里看看:
http://expert.csdn.net/Expert/topic/2620/2620645.xml?temp=.2884943
回复 点赞
zhijun8888 2003年12月31日
谁有传奇客户端源码,能给我发一份吗?
huzhijun@126.com
回复 点赞
wangdali 2003年12月30日
颜色怪怪的,要看你的调色板是不是对的。
要不有可能出现颜色就想相底一样的反差效果。
呵呵!!
回复 点赞
shiqizheng 2003年12月30日
果然都是256色的图片,怪不得画面看起来怪怪的,呵呵。
不过到了3应该都是16位的真彩图片了吧~~~
回复 点赞
shiqizheng 2003年12月29日
服务器是MFC写的,数据库是用ODBC来访问的,网络通信用的是完成端口,主要由LoginServer、LoginGate,GameServer、GameGate,DataServer,AdminnServer构成。
数据结构由Magic,MonsterGen,MonRace,MerChant,MoveMap,MapInfo构成。
呵呵,我也是刚看了两天,希望交流交流。
======
不是的吧,传奇2的肯定是delphi的,他的那个图标都是delphi3的标准图标呀。传奇3的
服务器是全sdk的,没有用mfc,连数据库都是自己写的几个类。不过可惜的是里面的主逻辑
服务器没有源代码,不然里面肯定有用到几个经典的算法哦~~~
回复 点赞
shines77 2003年12月29日
up
回复 点赞
pumaden 2003年12月29日
呵呵,已经找到了~~~~~~~~~
回复 点赞
pumaden 2003年12月29日
to: TangJunLin2002(红色袜子)

对的,在www.gameres.com 上有传奇2客户断原代码和服务断原代码和传奇3老版本的原代码!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在哪里? 没有找到啊。能发一份给我么,感谢888分~~~~~~~~
回复 点赞
wangdali 2003年12月29日
前段是见还分析了大话西游2的地图文件,
大话的地图文件就是用JPEG做的,可能是因为用的是国画的缘故,没有地图采用tile,而是直接扫描,压缩成JPRG在编译成地图文件的(.map)。

不知道大家有没有兴趣分析大话呢?
下面是我的原作:大话地图分析
===========================================
大话西游II 地图文件分析(.map) 2003年10月8日

下面用的是0001.map 地图,是傲来国的战斗场景地图。
头16个字节
58 50 41 4D 80 02 00 00 E0 01 00 00 97 02 00 00
前4个字节(58 50 41 4D)是文件标识XPAM

80 02 00 00 转十进制为 640
E0 01 00 00 转十进制为 480
640X480 为地图的总象素不是地图的坐标数。

接下来的16个字节,应该是剩下的4个单元的标志
CD 83 00 00 94 02 01 00 16 7E 01 00 21 FB 01 00

接下来的的数据以4字节为一个单位,应该是表示下面各个单元的(Cell),每4个字节对应一个单元。
大话2的地图是以单元为结构的,具体每个单元是做什么的还没有研究。

接下来的应该就是图象的调色板的,我认为是。还没有具体研究。
从 48 47 50 4A (HGPJ) ..... 一直到 47 45 50 41(GEPJ) 共 639字节

接下来就是地图的单元结构了:
一直从47 45 50 41(GEPJ)紧接着的后一个字节开始D2 5A 00 00
到4B 4F 4C 42 80 25(KOLB**)结束一共23260字节
这就是里面的第一个单元。

接下来的是一个9602字节的间隔段,具体做什么的还没有研究,我猜是地图文件的一些规则,比如地图那里是可以行走的,等等。

接下来又是一个单元的开始,这时都以4C 4C 45 43(LLEC)开始到4B 4F 4C 42 80 25(KOLB**)结束。这个单元有22853字节。

接下来有是一个9602字节的间隔段

接下来是另一个单元的开始。这时都以4C 4C 45 43(LLEC)开始到4B 4F 4C 42 80 25(KOLB**)结束。这个单元有 22016字节。

接下来是一个9602字节的间隔段

接下来是另一个单元的开始。这时都以4C 4C 45 43(LLEC)开始到4B 4F 4C 42 80 25(KOLB**)结束。这个单元有22409字节。

接下来又是一个9602字节的间隔段

接下来是最后一个单元的开始。这时以4C 4C 45 43(LLEC)开始知道文件的结束。这个单元有208字节。

这时整个文件结束,顺便提一下,这里的一些标志文字都是倒过来写的,比如文件的标识 XPAM 我想应该是MAPX才对,还有单元的开始 LLEC 应该是 CELL(单元)才是。而KOLB 也应该好似BLOK呀,还有HGPJ应该是JPGH,GEPJ应该是JPEG。不知道,是不是全部的数据都倒过来储存的。
==============================================================================================
大约的文件格式如下:

58 50 41 4D 80 02 00 00 E0 01 00 00 97 02 00 00 ;16字节
CD 83 00 00 94 02 01 00 16 7E 01 00 21 FB 01 00 ;16字节

48 47 50 4A (HGPJ) ..... 47 45 50 41(GEPJ) ;639字节
......KOLB** ;23260字节
...... ;9602字节
LLEC......KOLB** ;22853字节
...... ;9602字节
LLEC......KOLB** ;22016字节
...... ;9602字节
LLEC......KOLB** ;22409字节
...... ;9602字
LLEC...... ;208字节
文件大小为129,825字节
===============================================================================================
以上各段的界线可能有点偏移,比如KOLB后面的**两个字节划到下面的间隔段中,这时的间隔段就为9604字节,
或者把间隔段的前2个字节划到前面。我想多数是把KOLB后面的两个字节划到下面的间隔段,因为这两个字节为,
80 25 转成十进制 正好是 9600 。


接下来进行一下各个单元的分析。
第一个单元:
从D2 5A 00 00开始一直到4B 4F 4C 42(KOLB)结束,这里采用的是把KOLB后两个字节话到间隔段中,以后也都采用这个方法。
把D2 5A转成十进制为23250字节,而第一个单元的字节数为23260,用23260减去4(D2 5A 00 00)再减去6(4B 4F 4C 42 80 25)=23250 正好等于D2 5A 转成的十进制23250。说明前面的4个字节是表示这个单元的大小。

接下来4个字节 40 01 F0 00
40 01 转十进制为 320
F0 00 转十进制为 240

根据前面的0001.map的地图大小640X480,计算得出:
640/320=2
480/240=2
2*2=4个单元

说明每一个单元的大小为320X240个象素。一个640X480象素的地图要把地图分成4个单元来显示,即每个单元的大小为320X240象素。


接下来的24个字节具体做什么用,现在还不知道。
00 00 00 00 00 00 00 E6
BC 19 E1 9D 0B 50 F1 4D FD E7 8A AF D2 D6 D5 20

接下来的 59 6D D6 1B 开始就是地图文件的图象开始位置。这里的地图使用的是JPEG 压缩格式,前面的HGPJ.....GEPJ 之间有625字节是JPEG的文件开始部分,应该含有调色板。开始为FF D8 FF E0共625字节。但把调色板的625字节和单元一的59 6D D6 1B以后的数据复制到一个文件中只能看见一部分的图象(160X16象素),其他的图象还看不到,具体不知道什么原因,可能和前面的24个字节的内容有关也可能和开始对应的单元的那4个字节有关,具体还没有分析。
而直接把第二单元、第三单元、第四单元等等以后的单元直接复制进去则没有任何的图象显示出来,这有可能和JPEG的图象格式有关,因为数据的错误没有办法解压还原出图象来。这有可能是在第一单元中,显示出第一张图象完的时候把数据断开插入了其他标志性的数据,使接下来的数据破坏没有办法还原。到目前为止,还没有找到断点的地方。这也可能是我对JPEG的具体格式不够了解,没有办法把数据进行手工的恢复。具体还在测试之中。

















回复 点赞
wangdali 2003年12月29日
因为前段时间在分析多个游戏的资源文件,有可能弄错!
而这几天有在整理硬盘,前段时间写的分析记录文件有不好找到!!
传奇3又删掉了,要重新装又要整理出4GB的空间!!
如果可以你发一对文件给我,我看看,就很容易记得起来了!!
两个小一点的wil 和 wix 文件(最好前面文件名一样)!!
wdl@sian.com

还有上面所说的传奇3服务器源代码是假的,具体能不能用我没有去试。
但肯定不是韩国传奇公司(我不知道叫什么名字)的原作,原作是用delphi写的。
并且用vc重写了且缺少最主要的游戏服务端主程序 Game Server 的程序。
只有三个门(有人叫接口)gate和一个游戏数据库服务程序。
传奇服务端的6、7个服务程序中,最主要的就是Game Server程序,他是游戏运行管理的主程序。
没有他其他的也就不用看了,浪费时间。
回复 点赞
wangdali 2003年12月28日
你要先了解wil 和 wix的文件格式呀
wix是引索文件
wil是图象资料库文件

上面两个文件在传奇中的两个版本是不太一样的就是传奇和传奇3的格式是不太一样的.
要看你具体是要打开哪个版本的文件了.
不过你都可以在wix文件中找到这个文件对应的wil库文件中包含的图片数,这个很重要.
具体位置不同版本不一样,不过可以找一个小一点的wix文件用他的大小字节数/4字节,就可以得到大概的图片数.

好了,具体我也不想说了,我分析过比较具体的这两个文件个格式,不过我现在找不到我写的哪个文件在那里了,下面就贴出一个别人写的文章,可以很好的说明这两个文件的格式,如果需要我再找我写的哪个详细的文件格式文章.
=====================================================
转贴
-----------------------------------------------------
对传奇图象数据的研究
最近一直在玩传奇,除了好玩之外,还有研究的意思(呵呵,借口)。
今天我稍微研究了一下传奇的图象数据存储,呵呵,终于明白了。
你也想知道传奇的数据是怎么存放的么?或者,你也想学破解游戏图片,那么就跟我来吧,不过,在这之前,你必须准备一些工具。

1---十六进制编辑器 这个可是破解的主要工具啊。推荐使用HEDIT,华军主页上有。

2---图象处理程序 这个是用来处理图片的。主要是生成我们要的图片框架。这个,用WINDOWS自带的画笔就成。

3---计算器 这个是用来转换16进制和10进制的,这个在很多时候都用的到的。WINDOWS自带的就行了。

4---记事本 用来记录破解过程的重要数据。

5---一种可以处理二进制文件的编程工具 这个是用来写破解程序的。因为手工从文件拷贝图象文件实在是太累了。特别是数据比较大的时候。

6---然后呢,一点预备知识在PC里面存储的数据是高位在前低位在后。也就是说 十六进制 0xf8890 在十六进制编辑器中是这样的: 90 88 0f 00。这个相当重要啊。

好了,下面我们开始了。

首先呢,我打开了一个WIL文件看了一下,感觉没有头绪。然后我打开了一个WIX文件,在两个文件的文件头,我发现了这样的文字。#ILIB v1.0-WEMADE Entertainment inc(这个是WIL文件头)#INDX v1.0-WEMADE Entertainment inc(这个是WIX文件头)。从这个上面我们可以看出,WIL就是LIB的意思,也就是库的意思。WIX就是INDEX的文件,也就是索引的意思。这样,我们就初步知道了,数据是存放在WIL中的,数据索引是存放在WIX中的。

如果你还不知道索引呢(什么??你不知道索引。。晕4),我就给你讲一下哈。索引就是类似地址簿的东西,你从索引中查找数据所在的地址(这个地址不是内存地址,而是文件里面的地址)。那么通过这个地址,你就可以在库中找到数据了。

好了,现在我们知道了数据索引存放的地方,那么,我们就开始找到这些索引吧。
我们用HEDIT打开两个WIX文件进行比较,我们发现在OFS=36之前的数据都是固定的,那么,我门就看后面的数据。我找了一个比较小的WIX文件。然后从OFS=36的地方选择。这里用的是DNITEMS的WIX。我发现,选择的字节数是1656,而我们清楚,一个文件位置一般是用4个字节存放,也就是说,这里总共可能有的图象数是1656/4 = 414个,用计算器算出他的16进制是0x19E,这时,我们就在开头找16进制的 9E 01,我们发现,在OFS= 44 的地方有一个 9B 01 的很接近 9E 01 那么我们就知道了,后面的信息不都是文件地址。因为还要记录图象的个数啊。所以,我门从数据的尾部开始选择,看着右下角的数字到了 0x19b时,我们停下,发现正好停在 0X44前面。哈,我们知道了,这些数据都是文件位置,这个9B 01就是图象个数。那么,第一个文件位置是干什么用的呢,我打开了两个WIX文件,发现在相同的位置,就是OFS = 44后面的文件位置信息开始的地方,数据总是38 04 00 00,哦,明白了,这个就是图象数据的开始位置。也就是第一副图象的开始位置。

那么我们把这个开始位置转换一下, 0X438 = 1080,呵呵,也就是说,在WIL中的前面1080字节不是图象数据。那么他们是什么呢?

根据经验,我们知道,BMP文件里面的调色板一个就是一个4字节的DWORD值,那么256个位置就是1024字节,哈,很接近了啊。然后我比较了两个WIL文件,发现,前44字节是很相似的。所以我们减去44字节就是1036字节。那么剩下的12字节是什么呢?呵呵,我也不清楚,不用管他了。我们只要图象。

在WIL的0X438的位置上,我们发现了14 00 0D 00的数字。我猜,图象肯定超不过65535大小的,所以我猜想这是两个USHORT的图象大小的数据。

于是我把他们相乘,然后我又找了0X438后面的一个文件位置,然后相减,得到了数据的长度。减去图象大小的数据,啊?竟然多出来4个字节。呵呵,我现在也搞不清楚他们的用处。恩,我就跳过去了,因为我想他们一般和图象没有什么关系。

然后我就把图象数据复制了,我又打开了画笔,把图象属性设定成0X14*0X0D,然后存成256色的位图。接着用HEDIT打开位图,在0X1078的位置把数据粘贴到这个位置。然后存盘,退出。然后用画笔打开这个图象文件。哈,看到图象了。看样子象一个符。不过颜色不对。恩,我进入了传奇。用PAUSE截了一张图,然后用HEDIT打开,在54的位置选择了1024字节的东西。然后复制,再打开那个图象文件,在54的地方粘贴,然后存盘,退出,用画笔打开。哈。是一本书。

啊,终于知道了。我从上面的动作中得到了下面的结论。

1 图象位置索引在*.wix中
2 图象信息在*.wil中。
3 图象索引从OFFSET 0X2C开始,有一个DWORD的图象总数
4 然后是DWORD的OFFSET值,第一副图象的OFFSET值固定为0X438,= (1080)10
5 那么,就是说在WIL中,开头有1080 字节的空余。
6 在WIL中,文件开头的44字节都是相同的。所以,就是说有另外的1036字节是另有用途。
7 (这个没有解决)1036中有1024是一个256色的调色板,那么,剩下的12字节是干什么用的呢?
8 在传奇下,有一个截图功能保存的图象里面的调色板就是是游戏图象数据的调色板。

那么,剩下的工作就是写代码来抠图象了。
这方面的问题我就不再阐述了,因为知道了图象存储的数据格式,程序就很好写了。
恩,现在我也要写程序了。看看觉得自己写了好多啊。不过放心,这个东西没有版权,随便用拉。

还有一点补充:
我没有说清楚,这些图象是完全用8BIT位图方式存放在文件里面的。没有经过任何压缩或者是编码。

回复 点赞
wangdali 2003年12月28日
我已经找到客户端代码,
我搜索的时候好象还有服务端代码,
不过是要钱的,
不知道谁知道,免费的下载地址,
提供一下,谢谢!!
wdl@Sina.com
回复 点赞
wangdali 2003年12月28日
差不多的
我也分析过传奇3呀!!!
只不过是使用JPEG而已!!
没有什么其它特别的呀!!
结构还是差不多!!

真的有客户端代码吗?
能给我发一份看看吗?
wdl@sina.com.cn
回复 点赞
lsaturn 2003年12月28日
wangdali(大理) ,真的就是jpg的吗?
我分析出来的还是bmp的哦!
回复 点赞
duty 2003年12月28日
好厉害哦
茫然。。。。
回复 点赞
TangJunLin2002 2003年12月28日
对的,在www.gameres.com 上有传奇2客户断原代码和服务断原代码和传奇3老版本的原代码!

回复 点赞
h705c 2003年12月28日
这种代码不必浪费兄弟们的时间
一来没有注释
二来十分不规范
浪费了很多时间
到头来发现还不如实实际际做些事的好
回复 点赞
lsaturn 2003年12月28日
wangdali(大理),你说的又是传奇2的,那个wil格式很简单的,传奇3的我已经分析过了,通过源代码我也应证了我的一些分析,0xC1.0xC0是特殊分隔符,但是里面的顺序是乱的,所以停滞不前了啊:)
回复 点赞
wangdali 2003年12月28日
对了忘说了
有传奇的客户端源代码吗?
有空能不能给我发一个

wdl@sina.com

先谢谢了!!
再见
回复 点赞
发动态
发帖子
游戏开发
创建于2007-08-27

7202

社区成员

2.3w+

社区内容

游戏开发相关内容讨论专区
社区公告
暂无公告