转载自:http://blog.csdn.net/binbin0303/article/details/3074755
1.搜索局域网游戏:UDP,端口6112.
0x0000 FF FF FF FF FF FF 00 11-5B 82 2D EC 08 00 45 00 ..[??.E.
0x0010 00 2C A7 F4 00 00 80 11-D0 B2 C0 A8 01 72 FF FF .,..€.胁括.r
0x0020 FF FF 17 E0 17 E0 00 18-6F 04 F7 2F 10 00 50 58 .??.o.?..PX
0x0030 33 57 14 00 00 00 00 00-00 00
加粗黑色为数据:F7 2F 10 00是格式头部,消息含义的标志;50 58 33 57 是PX3W几个字,就是冰封王座的逆序;14 00 00 00 是版本号,0x14=20,即是1.20版的冰封王座在搜索游戏;00 00 00 00 是魔兽创建游戏的次数。
魔兽在多种情况下都会发布此消息,例如刚进入局域网,从游戏中退出,从创建的游戏中退出等等。
2.选择地图创建游戏后广播,即告知局域网我这儿创建了一个局域网游戏:udp
0x0000 FF FF FF FF FF FF 00 11-5B 82 2D EC 08 00 45 00 ..[??.E.
0x0010 00 2C CB C8 00 00 80 11-AC DE C0 A8 01 72 FF FF .,巳..€.括.r
0x0020 FF FF 17 E0 17 E0 00 18-6E 02 F7 31 10 00 50 58 .??.n.?..PX
0x0030 33 57 14 00 00 00 01 00-00 00
加粗黑色为数据:F7 31 10 00是格式头部,消息含义的标志。这个udp包通常是不变的。
3.选择地图创建游戏后第二个包:udp
0x0000 FF FF FF FF FF FF 00 11-5B 82 2D EC 08 00 45 00 ..[??.E.
0x0010 00 2C CB CA 00 00 80 11-AC DC C0 A8 01 72 FF FF .,耸..€.括.r
0x0020 FF FF 17 E0 17 E0 00 18-FE B0 F7 32 10 00 01 00 .??.?....
0x0030 00 00 01 00 00 00 04 00-00 00
最后一行的01表示当前局域网玩家人数加入一个人该数字加1,如果跟电脑玩这个数字不会变化;04表示总共有多少局域网玩家可以玩这个游戏+1,加入一个电脑,这个数据减1,加入局域网玩家这个数据不变,到最后这个数据表示玩这个游戏的局域网玩家数目。这个包除了以上两个数据,也通常不会变化。这类包在游戏开始以前每发生变化都要发送。
1、2、3数据包的发送在线程函数udp_send_thread_proc中完成。
4.局域网一个玩家收到主机广播后进行广播或者联系主机(UDP)
0x0000 FF FF FF FF FF FF 00 17-31 7D 9E 66 08 00 45 00 ..1}瀎..E.
0x0010 00 2C 08 39 00 00 80 11-70 0A C0 A8 01 D6 FF FF .,.9..€.p.括.?
0x0020 FF FF 17 E0 17 E0 00 18-6E A0 F7 2F 10 00 .??.n狑/..
0x0000 00 11 5B 82 2D EC 00 17-31 7D 9E 66 08 00 45 00 ..[??.1}瀎..E.
0x0010 00 2C 7D 7A 00 00 80 11-38 AE C0 A8 01 D6 C0 A8 .,}z..€.8?掷?
0x0020 01 72 17 E0 17 E0 00 18-AB 85 F7 2F 10 00 .r.??.珔?..
5.创建主机收到玩家信息后给玩家发送地图一起创建者信息(UDP):
0x0000 00 17 31 7D 9E 66 00 11-5B 82 2D EC 08 00 45 00 ..1}瀎..[??.E.
0x0010 00 98 C8 32 00 00 80 11-ED 89 C0 A8 01 72 C0 A8 .樔2..€.韷括.r括
0x0020 01 D6 17 E0 17 E0 00 84-80 0F F7 30 7C 00 50 58 .???剙.?|.PX
0x0030 33 57 14 00 00 00 01 00-00 00 24 22 31 02 E5 BD 3W........$"1.褰
0x0040 93 E5 9C B0 E5 B1 80 E5-9F 9F E7 BD 91 E5 86 85 撳湴灞€鍩熺綉鍐?
0x0050 E7 9A 84 E6 B8 B8 E6 88-8F 20 28 47 6F 00 00 01 鐨勬父鎴?(Go...
0x0060 03 49 07 01 01 53 01 B9-53 01 6F 35 C1 9F 4D AB .I...S.筍.o5翢M?
0x0070 61 71 73 5D 31 33 33 D5-5D 31 33 33 2F 77 33 39 aqs]133誡133/w39
0x0080 79 01 47 6F 6F 65 51 1D-6D 61 79 65 73 01 01 00 y.GooeQ.mayes...
0x0090 02 00 00 00 01 00 00 00-01 00 00 00 02 00 00 00 ................
0x00A0 4D 00 00 00 E0 17
其中F7 30是数据包类型,7C 00是数据包大小。
50 58 33 57 14 00 00 00 01 00-00 00是PX3W以及版本号、创建次数等信息。
24 22 31 02 这个数据不敢确定,老发生变化,?????
E5 BD 93 E5 9C B0 E5 B1 80 E5-9F 9F E7 BD 91 E5 86 85 E7 9A 84 E6 B8 B8 E6 88-8F 20 28 47 6F 00 这是utf-8编码,表示“当地局域网内的游戏 (ol”
01 03 49 07 01 01 53 01 B9-53 01 6F 35 C1 9F 4D 估计是是否开启地图或者裁判的消息。?????01 03 49 07固定,后面的01表示非裁判,如果是41则表示裁判。接着后面的01固定。B9-53 01 6F 35 C1 9F 4D这一段也是加密的,B9是加密字节
AB 61 71 73 5D 31 33 33 aps//123
D5-5D 31 33 33 2F 77 33 //123.w3
39 79 01 47 6F 6F 65 51 x/0GoodP
1D-6D 61 79 65 73 01 01 layer/0/0
解密方法:每一行第一个字节为密钥,这是一个奇偶校验加密程序,如B9,其二进制为10111001,逆序01000110取反为01100010,进行如下操作:
B9-0 53-1 01-1 6F-0 35-0 C1-0 9F-1 4D-0 去掉密钥部分结果为52 00 6F 35 C1 9E 4D即为:R/0o5
第二行 AB取反 0 1010100 逆序得:0 0101010 得61 70 73 5C 31 32 33 即aps//123
第三行 D5取反 0 0101010 逆序得:0 1010100 得5C 31 32 33 2E 77 33 即//123.w3
第四行 39取反 1 1000110 逆序 0 1100011 得78 00 47 6F 6F 64 50 即x/0GoodP
第五行 1D取反 1 1100010 逆序 0 1000111 得6C 61 79 65 72 00 00 即layer/0/0
合起来即为aps//123//123.w3x/0GoodPlayer/0/0 15 10
而且总结经验如下:当某字节的十进制数能够被2整除的时候需要补1,即偶数补1。
以下是裁判的:
0x0000 00 16 76 08 FE 30 00 16-76 08 FC D0 08 00 45 00 ..v.?..v...E.
0x0010 00 9E 63 CB 00 00 80 11-52 1F C0 A8 01 6C C0 A8 .瀋?.€.R.括.l括
0x0020 01 A8 17 E0 17 E0 00 8A-61 95 F7 30 82 00 50 58 .???奱曶0?PX
0x0030 33 57 14 00 00 00 02 00-00 00 2E 2F 4C 01 E5 BD 3W........./L.褰
0x0040 93 E5 9C B0 E5 B1 80 E5-9F 9F E7 BD 91 E5 86 85 撳湴灞€鍩熺綉鍐?
0x0050 E7 9A 84 E6 B8 B8 E6 88-8F 20 28 6A 69 00 00 01 鐨勬父鎴?(ji...
0x0060 03 49 07 41 01 35 01 C1-35 01 5F E3 E5 FD 4D 8B .I.A.5.?._沐齅?
0x0070 61 71 73 5D 63 6F 69 63-75 5D 29 35 29 41 65 55 aqs]coicu])5)AeU
0x0080 73 65 6F 61 6D 69 6F 3B-65 2F 77 33 6D 01 6B 07 seoamio;e/w3m.k.
0x0090 69 61 6F 01 01 00 0C 00-00 00 09 00 00 00 01 00 iao.............
0x00A0 00 00 0C 00 00 00 1F 00-00 00 E0 17
01 03 49 07 41 01 35 01 C1-35 01 5F E3 E5 FD 其中01 03 49 07是固定的,41 01表示裁判后面的固定使用即可
OC是总数目,加入一个电脑该数目减一,
09是管观看者数目?暂且固定吧。
01是局域网玩家数目。
接下来的0C不作介绍。
1F随机?最后是端口
该数据包5的发送在线程函数udp_recv_thread_proc中调用函数send_map_and_user_name完成。由于黄色部分数据未知太多,但是对每张图都是唯一的,所以采取了对每张图都截取该段数据,并做成一个查找表来完成。
6.主机给玩家发送地图UDP信息以后,玩家TCP连接主机(以下两个包连续发送):
0x0000 00 16 76 08 FC D0 00 16-76 08 FE 30 08 00 45 00 ..v...v.?..E.
0x0010 00 28 A5 E3 40 00 80 06-D0 87 C0 A8 01 A8 C0 A8 .(ャ@.€.袊括.ɡ?
0x0020 01 6C 04 18 17 E0 A3 27-A5 25 BC 99 68 7C 50 10 .l...啵'?紮h|P.
0x0030 FF FF A2 14 00 00 00 00-00 00 00 00 或者 AA AA-AA AA AA AA
其实这些一串0或者A不是客户有意构造的包,而是TCP自己构造的发送回馈。
0x0000 00 16 76 08 FC D0 00 16-76 08 FE 30 08 00 45 00 ..v...v.?..E.
0x0010 00 51 A5 E4 40 00 80 06-D0 5D C0 A8 01 A8 C0 A8 .Qヤ@.€.衇括.ɡ?
0x0020 01 6C 04 18 17 E0 A3 27-A5 25 BC 99 68 7C 50 18 .l...啵'?紮h|P.
0x0030 FF FF 8A 05 00 00 F7 1E-29 00 08 00 00 00 26 1B ?..?).....&.
0x0040 17 02 00 E0 17 01 00 00-00 6E 69 75 00 01 00 02 ...?....niu....
0x0050 00 17 E0 C0 A8 01 A8 00-00 00 00 00 00 00 00 ..嗬??.......
F7 1E是数据包格式,29 00是大小
08 00 00 00 是一个固定增长的数据,以后会用到,其实就是广播时的tag_count,每次连创建加1,这里我们都采取01,26 1B 17 02是服务器传过来的随机数(即以上实例中红色部分2E 2F 4C 01), E0 17 是端口, 6E 69 75是玩家名字。17 E0 C0 A8 01 A8是端口跟IP(6112 192.168.1.168),其余的暂不用管。
……
本人已经数据包分析完毕,开发出了一个魔兽游戏引导程序,可以引导玩家加入游戏
如果感兴趣者留言联系。