1.&本文涉及的数据包种类
a)魔兽争霸III拥有以下类型的数据包
i.局域网UDP数据包。
这类数据包都用于在游戏准备阶段广播/检测游戏信息。
ii.游戏中TCP数据包。
这类数据包在游戏准备阶段和实际游戏阶段都会被用到。
我会分两部分来介绍这类数据包。
iii.Battle.net TCP/UDP 数据包。
有时间的话,我会用一份单独的doc文档来介绍这部分。
目前可暂且参考&.
b)本规范中仅讨论前二类数据包。
2.&数据包头
魔兽争霸III中使用的所有数据包都拥有四字节的包头,具体如下表:
字节&/ 类型
魔数标志位。
0xF7 - 局域网UDP或游戏中TCP数据包(本文中所有数据包都采用这个标志)
0xFF -- Battle.net战网数据包
操作码。详情参考第3、4、5部分。
2 / uint16
数据包长度(包括4字节的包头部分)。
3.&局域网UDP数据包
a)操作码0x2F
这种数据包用于查询局域网游戏,它可用于两种场合:1.应答0x31或0x32数据包以查询指定游戏的信息。2.玩家进入局域网游戏界面时发送。向255.255.255.255广播以查询所有可加入的游戏。
字节&/ 类型
4 / uint32
以低位在前的方式表示游戏类型。
'W3XP' = TFT&'WAR3' = ROC
4 / uint32
游戏版本。
比如War3 1.24,这里就填24。
4 / uint32
游戏ID, 广播时置零。
b)操作码0x30
用于应答UDP 0x2F数据包,该数据包包含完整的游戏信息。
字节&/ 类型
4 / uint32
以低位在前的方式表示操作系统信息。
'IX86' = Windows&'XMAC' = Mac OS X
4 / uint32
以低位在前的方式表示游戏类型。
4 / uint32
4 / uint32
系统时钟(比如Windows就用GetTickCount()来获得)。
N/以'\0'结束的字符串
这是一个经过编码的字符串,包含着大量重要的游戏信息。参考附注。
4 / uint32
玩家位置数。
4 / uint32
游戏标志。据我所知&0x01 = 剧情游戏;0x09 = 自定义游戏。
4 / uint32
游戏内玩家数。
4 / uint32
非电脑玩家位置数。
综上所述,我们可以得出这样的公式:显示的游戏内玩家数=游戏内玩家数+(位置数-非电脑位置数)
4 / uint32
未知。通常是0-0x80
2 / uint16
以低位在前方式表示用于侦听连接的TCP游戏端口。
附注(编码字符串):
所有值为偶数的字节都+1。因此所有编码后的字节都是奇数。并用一个控制字节来保存接下去7字节的转换方式。
因为所有空字节都会变成1,因此编码字符串内不会包含空字节。但空字节用于表征字符串的结束。
编码字符串以一个控制字节开头。
控制字节中第1-7位(不包括第0位)分别依次对应控制字节后的7个字节。
第0位无作用,永远设为1。
解码方式如下:
如果对应位为'1',那么该字符不作修改。
如果对应位为'0',那么该字符的值要减去1。
解码完一个控制字节其后的七个字节后,接下去的字节又是一个新的控制字节。
重复操作直到数据流中出现NULL字符。
用C语言解码的样例:
char* EncodedS
char* DecodedS
int pos=0, dpos=0;
while (EncodedString[pos] != 0)
if (pos%8 == 0) mask=EncodedString[pos];
if ((mask & (0x1 && (pos%8))) == 0)
DecodedString[dpos++] = EncodedString[pos] - 1;
DecodedString[dpos++] = EncodedString[pos];
pos++;
编码方案的另一种理解方式如下:
每个字符的第0位都移到控制字节,然后本身设为1。
解码后字符串的结构:
字节&/ 类型
4 / uint32
游戏设置。
2 / uint16
地图宽度。
2 / uint16
地图高度。
4 / uint32
地图本地校验码。
N/以'\0'结束的字符串
N/以'\0'结束的字符串
主机用户名。
永远为0(也算个以'\0'结束的字符串?)
20 / uint8[20]
地图本地SHA-1哈希值,这一段是1.23版后添加的,以防止地图互通。
关于SHA-1哈希和地图校验的算法,我会在另一篇文章里讨论。
c)操作码0x31
主机建立游戏后会向255.255.255.255广播该数据包。
字节&/ 类型
4 / uint32
以低位在前的方式表示游戏类型。
4 / uint32
游戏版本。
4 / uint32
游戏ID(初始为1,随着逐个游戏的创建而自增)。
d)操作码0x32
游戏内玩家数发生变更后会向255.255.255.255广播该数据包。
字节&/ 类型
4 / uint32
4 / uint32
显示的游戏内玩家数。
4 / uint32
玩家位置总数。
e)操作码0x33
游戏取消后会向255.255.255.255广播该数据包。
字节&/ 类型
4 / uint32
4.&游戏准备阶段的TCP包
a)操作码0x01
保持连接存活,也用于游戏进行中。
字节&/ 类型
4 / uint32
系统时钟(比如Windows就用GetTickCount()来获得)。
b)操作码0x04
向新加入的玩家发送,告诉他们各个玩家位置的状态及他们所处的位置。
字节&/ 类型
2 / uint16
接下去5段信息的总长度(到“开始位置数”为止,不包括本段的2个字节。)
玩家位记录的条数,这里记为RN。
9 * RN / 玩家位记录&* RN
每条玩家位记录代表每个玩家位的详细信息。每条记录的结构如下:
uint8&玩家ID。0为电脑,0xFF为空。
uint8&地图下载进度。0-100,0xFF代表'?'。
uint8&玩家位状态。0-空,1-关闭,2-已有玩家。
uint8&是否电脑。0-活人,1-电脑。
uint8&队伍。0-11,12代表ob/裁判。
uint8&颜色。0-11,12代表ob/裁判。
uint8&种族。
0x01-人类,0x02-兽人,
0x04-暗夜精灵,0x08-亡灵,
0x20-随机,0x40-地图未指定。
uint8 AI等级。0-简单,1-普通,2-疯狂
uint8&生命百分比。
通常为50,60,70,80,90,100。用GHost++可设为其他值。
4 / uint32
游戏的初始随机种子。
队伍和种族锁定标记:
0x01 - 队伍已锁定
0x02 - 种族已锁定
0x04 - 种族为随机(无法与0x02共用)
地图开始位置数。
为新加入玩家分配的玩家位。
16 / sockaddr_in
主机用getpeername()获得的目标玩家地址。
c)操作码0x06
向新加入的玩家发送,告诉他们已经在游戏中的玩家列表,每个对应玩家会发一个0x06的包。
字节&/ 类型
4 / uint32
始终为0x02,可能是sockaddr_in的结尾数字?
在玩家位信息中显示的玩家ID。
N/以'\0'结束的字符串
玩家名。最长16字节(包括结尾的'\0')。
后续的额外字节数。局域网游戏中总是1。
N / uint8[N]
额外字节。局域网游戏中总是一个\0字节。
16 / sockaddr_in
从getpeername()获得的该玩家地址。
16 / sockaddr_in
从NAT路由(如果有)获得的该玩家地址(似乎只用于Battle.net战网)。
d)操作码0x07
玩家离开游戏时向所有玩家发送。也用于游戏进行中。
字节&/ 类型
4 / uint32
离开原因标志。这部分还需进一步研究。
e)操作码0x08
当玩家的地图载入完成后向所有玩家发送(此时主机将会从客户端处收到0x23数据包),这样所有玩家的读取界面上,该玩家的姓名板背景会变成绿色。
字节&/ 类型
f)操作码0x09
和0x04基本相同,但缺少最后两段。当任何玩家位相关信息发生改变时向所有玩家发送。(比如说正在下载地图,玩家改变位置等等。)
字节&/ 类型
2 / uint16
接下去5段信息的总长度(到“开始位置数”为止,不包括本段的2个字节。)
玩家位记录的条数,这里记为RN。
9 * RN / 玩家位记录&* RN
每条玩家位记录代表每个玩家位的详细信息。每条记录的结构如下:
uint8&玩家ID。0为电脑,0xFF为空。
uint8&地图下载进度。0-100,0xFF代表'?'。
uint8&玩家位状态。0-空,1-关闭,2-已有玩家。
uint8&是否电脑。0-活人,1-电脑。
uint8&队伍。0-11,12代表ob/裁判。
uint8&颜色。0-11,12代表ob/裁判。
uint8&种族。
0x01-人类,0x02-兽人,
0x04-暗夜精灵,0x08-亡灵,
0x20-随机,0x40-地图未指定。
uint8 AI等级。0-简单,1-普通,2-疯狂
uint8&生命百分比。
通常为50,60,70,80,90,100。用GHost++可设为其他值。
4 / uint32
游戏的初始随机种子。
队伍和种族锁定标记:
0x01 - 队伍已锁定
0x02 - 种族已锁定
0x04 - 种族为随机(无法与0x02共用)
地图开始位置数。
g)操作码0x0A
只包含4字节的包头,当主机按下开始游戏,并开始倒数5秒时发送。
h)操作码0x0B
只包含4字节的包头,当5秒计时结束时发送,提醒所有玩家进入载入界面。
i)操作码0x0F
向聊天信息的接收者发送。
如果是私密/小队频道的聊天,而且发送者和接收者可通过TCP连接,那么这个数据包是直接发送的。
否则玩家会先向主机发送一个0x28数据包,主机再发给所有接收者。
注意某些平台会阻断客户端之间的连接,因此所有聊天信息都要通过主机来传递,这就存在潜在的安全问题,可能导致私聊信息泄露。
字节&/ 类型
需发送聊天信息的目标玩家数,这里记为PN
PN / uint8 * PN
每个uint8保存一个目标玩家ID。
聊天信息发送者的玩家ID
聊天信息标志。
0x10-准备阶段,0x20-游戏阶段
4 / uint32
发送目标标志。
0x00 - 向所有玩家发送
0x01 - 向盟友发送
0x02 - 向OB/裁判发送
0x03-0x0E - 向特定玩家发送(玩家ID=值-2)
当聊天信息标志为0x10(即游戏准备阶段)时,这段信息将被排除。
N/以'\0'结束的字符串
聊天字符串。
j)操作码0x1B
只包含4字节的包头,向玩家发布,告诉他们你已断开游戏,即使是主动退出游戏的情况。同样适用于游戏进行阶段。
k)操作码0x1E
这是当一个玩家加入游戏的时候向主机发送的第一份数据包,包含了该玩家的信息。
字节&/ 类型
4 / uint32
4 / uint32
游戏开始后经过的毫秒数。
2 / uint16
客户端的游戏端口。用于地图信息交换、直接私聊、主机变更等等。
4 / uint32
客户端会话计数器。初始值为1,每加入一个游戏都会自增。
N/以'\0'结束的字符串
2 / uint16
可用的公共端口。这里记为P。
16 * P / sockaddr_in * P
每个公共端口都有一个套接字sockaddr_in结构。
l)操作码0x21
向主机发送主动离开游戏的信息(主机总是会回复0x1B以断开游戏)。同样适用于游戏进行中。
字节&/ 类型
4 / uint32
理由标志。还需进一步研究。
m)操作码0x23
只包含4字节的包头。告诉主机当前玩家已完成游戏载入。
n)操作码0x28
该数据包有2个功能:
i. 请求主机转发聊天信息。主机会把此信息转发给目标玩家。同样适用于游戏进行阶段。
ii. 在游戏准备阶段对玩家位进行变更。
字节&/ 类型
需要发送聊天信息的玩家总数,这里记为PN
PN / uint8 * PN
每个uint8保存一个需发送聊天信息的玩家ID。
聊天信息发送者的玩家ID。
聊天信息标志。
0x10 - 游戏准备阶段的聊天
0x11 - 变更小队
0x12 - 变更颜色
0x13 - 变更种族
0x14 - 变更生命百分比
0x20 - 游戏进行阶段的聊天
当聊天信息标志&= 0x10或0x20:
字节&/ 类型
4 / uint32
发送目标标志。
0x00 - 向所有玩家发送
0x01 - 向盟友发送
0x02 - 向OB/裁判发送
0x03-0x0E - 向特定玩家发送(玩家ID=值-2)
当聊天信息标志为0x10(即游戏准备阶段)时,这段信息将被排除。
N/以'\0'结束的字符串
聊天字符串。
当聊天信息标志&= 0x11-0x14:
字节&/ 类型
聊天信息标志&= 0x11: 小队
聊天信息标志&= 0x12: 颜色
聊天信息标志&= 0x13: 种族
聊天信息标志&= 0x14: 生命百分比
参考0x04/0x09玩家位信息部分。
o)操作码0x3D
由主机发送,询问加入的玩家是否拥有当前地图。
客户端将回复0x42数据包。
字节&/ 类型
4 / uint32
地图ID(?)
N/以'\0'结束的字符串
4 / uint32
地图大小(单位为字节)。
4 / uint32
整个地图文件的CRC32。
4 / uint32
地图本地校验码。
20 / uint8[20]
地图本地SHA-1哈希值,这一段是1.23版后添加的,以防止地图互通。
p)操作码0x3F
当目标玩家没有地图(即玩家向主机发送的0x42数据包中可用地图大小&实际地图大小)的时候发送,客户端能够互相直接连接时也会互相发送。(我注意到可能存在一种操作码0x3E用于向非主机玩家查询地图,但尚未测试。)
字节&/ 类型
4 / uint32
地图ID(?)
q)操作码0x42
向主机发送,报告自己是否有地图或地图下载进度。
字节&/ 类型
4 / uint32
地图ID(?)
下载源玩家ID或主机ID
4 / uint32
可用地图尺寸(下载进度)
r)操作码0x43
向玩家发送地图数据,即传图。
字节&/ 类型
目标玩家ID
4 / uint32
地图ID(?)
4 / uint32
地图文件偏移,用于写入数据。
4 / uint32
后面这段数据的CRC32。
N / uint8[N]
地图数据。
s)操作码0x44
应答0x43数据包,并汇报已下载地图尺寸以示接受。
注意地图发送者并不会等收到这个包后再发送下一个0x43传图包。
字节&/ 类型
目标玩家ID
4 / uint32
地图ID(?)
4 / uint32
已下载的地图尺寸。
t)操作码0x45
该数据包用于回复0x3F数据包,以拒绝从目标玩家处下载地图。
字节&/ 类型
目标玩家ID
4 / uint32
地图ID(?)
u)操作码0x46
用于应答0x01保持连接存活的数据包。同样适用于游戏进行阶段。
字节&/ 类型
4 / uint32
与0x01数据包的值相同。
5.&游戏中TCP数据包
a)操作码0x0C
游戏数据包,每100毫秒向局域网中所有玩家发送(战网上是250毫秒,有工具可以调整这个值。)。
字节&/ 类型
2 / uint16
游戏已用时间,单位是毫秒。
2 / uint16
下一段数据的CRC32的低16位。
注意:如果游戏数据为空,这段数据本身也会被排除,这样整个包就只有6字节。
N / uint8[N]
游戏数据。
如果游戏数据超过1446字节,整段数据将被分割成若干个0x48数据包,并以一个0x0C数据包结尾。这是为了避免某些路由的最大传输单位限制。
游戏数据与录像数据相同因此其格式可以参考以下文档:
b)操作码0x0E
这种数据包很少见,只在游戏不同步时发送。尚需进一步研究。
c)操作码0x14
向玩家发送,告诉他们:你已经被主机踢了。(比如主机离开游戏)
字节&/ 类型
d)操作码0x48
就是缺少游戏已用时间的游戏数据包,用于游戏数据分多个包发送的情况。
字节&/ 类型
2 / uint16
游戏已用时间,单位是毫秒。这里始终是0。
2 / uint16
下一段数据的CRC32的低16位。
注意:如果游戏数据为空,这段数据本身也会被排除,这样整个包就只有6字节。
N / uint8[N]
游戏数据。
e)操作码0x26
当玩家进行了一些操作时发送给主机。主机会收集所有玩家的操作并发回包含所有玩家操作的0x0C/0x48数据包作为应答。
字节&/ 类型
N / uint8[N]
玩家操作数据,参考0x0C以获得更多信息。
f)操作码0x27
同步数据包,当收到0x0C游戏数据包时发送给主机。
字节&/ 类型
4 / uint32
同步哈希值。
主机将在本地计算哈希值,并与每个玩家的0x27数据包比较。一旦不同步现象产生,即0x27数据包的哈希值与主机计算不符,该玩家将立刻被断开。
本文已收录于以下专栏:
相关文章推荐
首先用一点儿时间来谈谈什么是加密狗(dongle),dongle经常被认为是硬件保护,它是一个可被附加在计算机并口、串口或USB上的小插件,它包含厂家烧制的EPROM和定制的专用集成电路。
转载自:http://blog.csdn.net/binbin0303/article/details/3074755
1.搜索局域网游戏:UDP,端口6112.
0x; FF FF F...
DescriptionData ConstraintSolution我们发现***最多只有两条直线构成,自己简单画一下就成。
现在问题成了如何求两条直线构成的最优方案。
我们设两条向量分别为(a,b...
魔兽争霸三加密地图修改工具
MPQMaster,MPQ工具解压和还原w3x文件
SilkObject,还原slk文件为w3u等
UltraEdit,用于打开w3x等文件
xdep,解密slk加密地图
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)当前位置: && 魔兽争霸3冰封王座地图大全
魔兽争霸3冰封王座地图大全
魔兽争霸3冰封王座之所以长久不衰,很大一部分原因要归功于种类多样的地图,是它们让这款游戏得以延续。而快吧为大家收集了最好玩、最具特色的魔兽地图,还在等什么?赶快来下载吧!(资源分享QQ群:)
推荐理由:
地图名字:Dota 6.84
更新大小:7.9 MB
地图类型:对抗地图
地图语言:简体中文
87位英雄改动,多项法术/道具完美兼容!
加入8种道具,辅助后期不再酱油!
让我们一起期待6.84早日到来
游戏截图:
好玩的魔兽地图
火影忍者羁绊
神奇宝贝乱斗
梦幻启示录
五虎将后传
推荐理由:《魔兽争霸3》七项修改器,适用1.26版本游戏,具有无限魔法,无限生命等功能,使用时先运行游戏,再启动修改器。
按键功能:
小键盘1 & 无限生命+一击必杀
小键盘2 & 无限魔法
小键盘3 & 无限金钱和木材
小键盘4 & 最大经验
小键盘5 & 快速建造
小键盘6 & 食物无限制
小键盘7 & 不会输
推荐理由:地图名称:神界危机8.22珍藏无CD无限蓝P闪版
地图类型:魔兽防守地图
地图语言:中文
支持人数:1-11
魔兽版本:1.24E
游戏介绍:
玩家一和玩家一的同盟玩家 p 键飞全图闪烁
玩家1的盟友无延迟清CD(玩家1的敌人不清除)
技能施放后立即清除CD
另外附加一个功能.调整经验倍数.
-suffer XX
可以调整经验所有玩家的倍数
XX的数值最大不能过超过99
如果你不想要经验加倍.可以在地图刚开始时输入 -suffer 1
这样就是所有玩家都是1倍经验了
输入次数无限制.感觉经验倍数高了或者低了随时再输入一次就改好了
为防止游戏自动设置20秒自动重新设置经验比率(以玩家1输入的倍数为准)
推荐理由:
地图名称:火影忍者羁绊 6.9
地图类型:防守
魔兽版本:1.24/1.26
地图作者:冬冬&暗君
支持人数:1~10
综合更新:
1、重新制作随机英雄系统。这次真的不会在同个时间点一直随机到同一个英雄了,随到了只能说脸好
2、修复了某些情况下长门和佩恩可以同时出现的BUG
3、因游戏等待计时触发在部分平台会出问题所以将受到影响的触发全部重新制做,更新延期有很大一部分原因是因为这个,十分感谢那些找出这个严重BUG的玩家
英雄更新:
新角色:TheLast佐助
单人模式下无需任何条件即可选择该英雄(也就是在线玩家数=1,不限局域网或单人模式)
该英雄需要玩家在 魔兽争霸官方对战平台游戏大厅内进行游戏并且玩家的地图经验要大于或等于5级方可使用
(本来没打算在这版本加入新英雄的,不过玩家要求新英雄的反响比较热烈并且为了奖励那些由于喊话功能不便还默默坚持在官方平台的玩家们,多谢大家的支持!)
游戏截图:
推荐理由:
地图名称:天灾来临IV1.1.9正式版
地图类型:生存
改图作者:黑框眼镜
支持人数:1-4
【11对战平台亲测有效】
注:一共有2个版本【破解+修改版】-【破解+修改+脚本版】
【破解+修改版】简介:82名定制英雄|天灾福利礼包 |复活功能|平台奖励|声望值微改|特改礼包|专属解绑
简介:在【破解+修改版】的基础上修改增添了一些其他数据功能
&所有密码指令均在压缩包txt文本中可查看&
定制英雄选法:【共计82名,有8条密码指令】
在选择英雄时,输入“特定密码”后,即可出现选择框,每条指令可选择11名英雄,可按取消键重新再输入
礼包密码:
“特定密码” = 天灾福利礼包
礼包效果:
玩家增加2点魔晶
英雄获得VIP头饰特效
英雄增加15点全属性
英雄获得一个《紫金宝箱》
修改内容:【有5处修改】
1.去除平台限制
并直接解锁需要积分才能兑换的系列特权
宠物-寒冰白虎
称号-文字称号
限时英雄-冰之妖精 - 琪露诺
2.所有专属解除绑定,修改为可丢弃
3.增加无限复活功能,输入以下指令即可开关此功能【死亡不会触发游戏失败】
“特定密码” = 开启复活功能
“特定密码” = 关闭复活功能
4.杀敌所得声望翻至5
5.输入“特定密码”即可获得一件《【神】-轩辕剑》【每名玩家限获一次】
【破解+修改+脚本版】
6.添加了《黑框眼镜专用脚本》开启密码在破解txt文本中查看
该脚本所有功能都需要先开启密码才能使用,不开启则无任何提示
脚本功能介绍:该脚本具有网上绝大部分的常用功能
如无CD/PM闪/开全图/英雄0秒复活/攻击附带属性伤害
杀怪加属性/无敌/被攻击满血/移动速度变为最快等等,都是支持多名单位多名玩家的
还可以输入指令来增加金币/木材/人口资源 & & 英雄三围/英雄等级/经验倍率
物品使用次数/复制物品/清理地面物品
该脚本拥有刷物品功能【页数查询以及模糊搜索】
具体说明请看附件中的txt附件说明
若开启无CD后,个别技能会不停原地释放,连续按S或者关闭无CD功能便可停下
地图截图:
推荐理由:地图名称: 白雪公主与七个小矮人 1.2
地图类型: 生存
魔兽版本: 1.24
地图作者: NC团队
支持人数: 1-7
做了5个神器,分别在5个野区BOSS掉落,做了3D视角,键盘操作,具体进游戏可看提示。
>>查看更多<<
最新补丁合集
扫描二维码