- 浏览: 462507 次
- 性别:
- 来自: 广州
最新评论
-
lhgyy00:
很好,回去好好研究下,3Q
博客资源与博客工具大全 -
ljl.java:
♦
你会遇到几段恋情?很准的哦~ -
ljl.java:
♦
你会遇到几段恋情?很准的哦~ -
jzzwy:
你这个red5是什么版本 Iterator<IConne ...
red5获取在线用户列表 -
81365341:
看着标题“red5配置详解”点进来的,结果没看到一句和配置有关 ...
red5配置详解
首先,你需要安装有VPC,这样你才能运行PC版的QQ。其次,你要有你机器root用户的权限。
然后,你启动VPC,注意先不要登录QQ。
打开终端窗口。输入su命令,在提示里面输入root用户密码,进入root用户。这时候提示符应该是个#号。
以root身份运行终端命令:
tcpdump -w dump.dat -s 0 udp
这个命令的作用是把网络上传输的数据截获下来。
-w dump.dat 意思是把输出存到dump.dat文件下。
-s 0 是指定保存完整的包,如果指定一个非零的数值,那么将会保存这个数值的长度。
udp 是指只保存UDP协议的数据(腾讯文字通讯所采用的协议)。
(你有PC的话,也可以使用windump来截获你PC上的QQ的数据包。windump是windows下的命令行程序,它的使用参数和tcpdump完全一样。你可以在 http://windump.polito.it/ 中下载)。
然后我们启动VPC里面的QQ,执行我们所想要研究的有关操作。完成以后,会到终端窗口,按ctrl-c中断tcpdump的运行。这时,在当前目录下就有dump.dat了。
然后,可以用hexedit打开这个文件,观察一下我们dump的结果。
里面是连接着的数据,是按照“QQ包->UDP包->IP包->链路层封装->tcpdump的文件格式”的层次结构进行封装的。
下面是一个数据片段:
0008: A1 B2 C3 D4 00 02 00 04
0008: 00 00 00 00 00 00 00 00
0016: 00 00 FF FF 00 00 00 01
0024: 3F 44 32 28 00 0C 2D AF
0032: 00 00 00 96 00 00 00 96
0040: 00 06 25 60 F4 C0 00 03
0048: 93 A7 09 38 08 00 45 00
0056: 00 88 8E 53 00 00 80 11
0064: 9D 9D C0 A8 01 66 CA 68
0072: 81 FD C2 34 1F 40 00 74
0080: C3 AD 02 08 16 00 22 00
0088: 10 01 82 5D 90 6F 30 FD
0096: 96 3B B1 0F E5 FF 8E 3E
0104: 4B 38 E2 86 E1 8A F7 C8
0112: CA B2 01 76 B6 ED 9E 2B
0120: 97 FD B9 7F 23 B2 09 02
0128: 71 22 94 E3 4B E8 E2 8F
0136: FD FF 02 87 83 0B 32 57
0144: 73 91 7F EF 7B 7A 60 CB
0152: 44 A4 B5 CA 13 19 F6 CE
0160: D5 EC 2F D5 8A 88 22 48
0168: 14 4E 44 08 18 37 9D 8D
0176: AA 42 9C 88 A4 AB 44 0D
0184: 4B 23 74 AC ED 03 3F 44
0192: 32 29 00 06 D0 EA 00 00
0200: 00 68 00 00 00 68 00 06
0208: 25 60 F4 C0 00 03 93 A7
0216: 09 38 08 00 45 00 00 5A
0224: 8E 54 00 00 80 11 B2 F9
0232: C0 A8 01 66 3D AC F9 8A
0240: C2 35 1F 40 00 46 23 2C
0248: 05 01 00 01 82 5D 90 01
0256: 1F 02 16 08 00 00 00 00
0264: 00 00 00 00 00 00 00 00
0272: 00 00 00 00 01 02 5E FD
0280: 00 01 01 00 00 00 00 42
0288: 62 0B 9F 27 F3 D9 FB 05
0296: C6 54 E3 7F 01 E4 B4 01
0304: 00 00 00 00 04 00 3F 44
0312: 32 29 00 06 F6 48 00 00
0320: 00 B3 00 00 00 B3 01 00
0328: 5E FF FF FA 00 06 25 60
0336: F4 C0 08 00 45 00 00 A1
0344: 00 4C 00 00 04 11 F9 CE
0352: 18 C0 B3 77 EF FF FF FA
0360: 04 09 07 6C 00 8D 91 43
0368: 4D 2D 53 45 41 52
Tcpdump文件格式:
首先我们看到的是最外面的一张包装纸:tcpdump的文件格式。它的格式是这样的(详细的描述可以参考:libpcap-format的资料):
文件头 | 数据包头 | 链路层数据 | 数据包头 |链路层数据| ....
首先,每个文件以一个24字节长的文件头开头,我们需要知道的是最前面的四个字节是:A1 B2 C3 D4,如果不是这个标识,那么就不是tcpdump生成的数据文件(如果是PC上的windump生成的文件,那么则是D4 C3 B2 A1,以表明PC上的endian不同,我们这里不用关心这个区别)。
跳过这24个字节,下面就是以“数据包头|链路层数据”为一组的这样一组组的数据。数据包头不是网络上真正传输的数据,它包含的信息主要是截获这个包的时间等信息。它的长度16个字节。我们关心的是第8-11和9-15字节(我们按编程的习惯,把第一个字节称为第0字节,下同)。前者表明后面的链路层数据包在文件里面的长度,后者表明它的实际长度。两者可能不同是因为可能存在截断的情况。由于我们使用了-s 0参数,所以他们应该是相同的。从数据包头结束,到长度指明的字节数为止,是实际在网络中传输的链路层数据包。然后,就是下一个数据包头。这样,我们就可以逐个把tcpdump文件的封装去掉,获得一个一个实际在网络中传输的数据包了。例如,我们忽略文件头,从第24字节开始的3F 44 32 28 ...就是数据包,数据包的第8-11字节:00 00 00 96就是这个后面数据链路层数据包的长度。也就是说,从40字节开始00 06 25 60...的150(0x96的转换成10进制)个字节就是实际网络传输的链路层数据包。然后,我们在第190(40+150)字节的位置又看到了3F 44 32 29...的下一个数据包头。
我们这样就获得了一个个的链路层数据包。我们上面例子中的第一个是:
0000: 00 06 25 60 F4 C0 00 03
0008: 93 A7 09 38 08 00 45 00
0016: 00 88 8E 53 00 00 80 11
0024: 9D 9D C0 A8 01 66 CA 68
0032: 81 FD C2 34 1F 40 00 74
0040: C3 AD 02 08 16 00 22 00
0048: 10 01 82 5D 90 6F 30 FD
0056: 96 3B B1 0F E5 FF 8E 3E
0064: 4B 38 E2 86 E1 8A F7 C8
0072: CA B2 01 76 B6 ED 9E 2B
0080: 97 FD B9 7F 23 B2 09 02
0088: 71 22 94 E3 4B E8 E2 8F
0096: FD FF 02 87 83 0B 32 57
0104: 73 91 7F EF 7B 7A 60 CB
0112: 44 A4 B5 CA 13 19 F6 CE
0120: D5 EC 2F D5 8A 88 22 48
0128: 14 4E 44 08 18 37 9D 8D
0136: AA 42 9C 88 A4 AB 44 0D
0144: 4B 23 74 AC ED 03
链路层数据包:
下面我们要撕去链路层数据包这个第二层包装纸。链路层数据包格式是和传输的方式有关的:如果我们是在局域网里面共享上网,那么一般是用称为 RFC894以太网协议,少数情况下也会是RFC 1042的802.3协议。如果你用Modem拨号上网,那么可能会是RFC 1055的SLIP协议,如果是用ADSL,那么将会是RFC 1548的PPP协议。
链路层数据对我们来说意义不大,我们要做的是剥去这层包装纸而已。
RFC894/RFC1042/RFC 1548:
这三种协议的形式都是:
包头|IP数据包|(包尾)
对RFC894,包头是14字节;RFC1042,包头是22字节;RFC 1548,包头是5个字节。我们跨过这些字节,就是IP包的数据了。包尾如何并不要紧,因为IP包的内容本身会告诉我们它的长度。
在上面的链路层数据包中,我们跳过14个字节,第14字节以45 00 00 88开始的就是IP包的数据。其它的协议也可以这样处理。
RFC 1055:
IP数据包被封装在一对的0xc0字符中间。但是,由于数据包中间就不能有0xc0字符,所以原来的0xc0字符被其它代替了,我们要把它还原。方法是搜索这个数据包,把0xdb 0xdc转换为0xc0;0xdb 0xdd转换为0xdb。比较麻烦,所以,最后不要使用它来截取数据。
IP包的第2-3字节是它的长度,上面我们看到的第14字节开始的IP包,它的长度就是00 88。也就是136个字节。所以,从14字节开始的136个字节就是IP数据包。这样,我们就剥去了链路层的包装纸,获取了IP包。
我们上面的例子的第一个IP包是:
0000: 45 00 00 88 8E 53 00 00
0008: 80 11 9D 9D C0 A8 01 66
0016: CA 68 81 FD C2 34 1F 40
0024: 00 74 C3 AD 02 08 16 00
0032: 22 00 10 01 82 5D 90 6F
0040: 30 FD 96 3B B1 0F E5 FF
0048: 8E 3E 4B 38 E2 86 E1 8A
0056: F7 C8 CA B2 01 76 B6 ED
0064: 9E 2B 97 FD B9 7F 23 B2
0072: 09 02 71 22 94 E3 4B E8
0080: E2 8F FD FF 02 87 83 0B
0088: 32 57 73 91 7F EF 7B 7A
0096: 60 CB 44 A4 B5 CA 13 19
0104: F6 CE D5 EC 2F D5 8A 88
0112: 22 48 14 4E 44 08 18 37
0120: 9D 8D AA 42 9C 88 A4 AB
0128: 44 0D 4B 23 74 AC ED 03
IP包
IP包是网络上传送的与传输线路无关的数据包,也是我们开始需要真正关心的数据。IP包的格式是:
IP包头|IP包数据(我们这里就是UDP数据包)
IP包头,除了我们刚才说的包长度(第2-3字节)以外,还有几个重要的信息是我们所需要关心的:
第12-15和第16-19分别为源和目的IP地址。它用四个字节来代表一个IP地址,把每个字节转换成十进制,就是我们熟悉的IP地址。比如,上面的源IP地址:C0 A8 01 66就是192.168.1.102,这是我局域网的IP地址,所以,这是一个从我的机器上发出的包。目的地址是CA 68 81 FD就是202.104.129.253。从后面我们对QQ数据包的了解我们知道这是一个发往服务器的包,所以我们就获得了一个QQ服务器的IP地址。(注意,并不是全部发出的包都是发往服务器的!)
如果,找到一个原来不知道的服务器,那么是一个很重要的发现。
第0个字节,高4位为IP的版本号,低四位为IP包头的长度。比如说,我们上面的数据包第一个字节为45,它的高4位为4,表明它是我们通常所说的 IPv4协议,低四位为5,表明IP包头的长度为5X4=20字节(头的长度是以四字节为单位的)。这样表明从第20字节开始就是IP包的数据部分,也就是UDP包的内容了。这样我们可以剥离出UDP包:
0000: C2 34 1F 40 00 74 C3 AD
0008: 02 08 16 00 22 00 10 01
0016: 82 5D 90 6F 30 FD 96 3B
0024: B1 0F E5 FF 8E 3E 4B 38
0032: E2 86 E1 8A F7 C8 CA B2
0040: 01 76 B6 ED 9E 2B 97 FD
0048: B9 7F 23 B2 09 02 71 22
0056: 94 E3 4B E8 E2 8F FD FF
0064: 02 87 83 0B 32 57 73 91
0072: 7F EF 7B 7A 60 CB 44 A4
0080: B5 CA 13 19 F6 CE D5 EC
0088: 2F D5 8A 88 22 48 14 4E
0096: 44 08 18 37 9D 8D AA 42
0104: 9C 88 A4 AB 44 0D 4B 23
0112: 74 AC ED 03
UDP包
UDP包是多数即时通讯软件采用的协议。它的格式是:
UDP包头|UDP包数据(这里就是腾讯QQ协议包)
UDP包头是固定8个字节。
第0-1字节是源端口号,第2-3是目的端口号。一般,我们客户端的端口号可以随便选取(有资料说是4000,但是实际发现,新版的QQ已经是随便选取,没有限制了)。从上面的UDP包,我们从以前IP包的信息知道是我们发送出去数据包,所以目的端口号就是服务器所使用的端口号。这里是1F 40,也就是8000号端口,目前还没有发现使用其他端口的,所以,如果发现有服务器使用其他端口,也将是一个很重要的信息。
第4-5字节是UDP包的长度,这不是很重要,但是也可以用它来检验一下我们的剥离过程有没有错误。
我们去除掉头8个字节,剩下的就是QQ协议包了:
0000: 02 08 16 00 22 00 10 01
0008: 82 5D 90 6F 30 FD 96 3B
0016: B1 0F E5 FF 8E 3E 4B 38
0024: E2 86 E1 8A F7 C8 CA B2
0032: 01 76 B6 ED 9E 2B 97 FD
0040: B9 7F 23 B2 09 02 71 22
0048: 94 E3 4B E8 E2 8F FD FF
0056: 02 87 83 0B 32 57 73 91
0064: 7F EF 7B 7A 60 CB 44 A4
0072: B5 CA 13 19 F6 CE D5 EC
0080: 2F D5 8A 88 22 48 14 4E
0088: 44 08 18 37 9D 8D AA 42
0096: 9C 88 A4 AB 44 0D 4B 23
0104: 74 AC ED 03
我们有一个命令行小工具showUDP,可以从tcpdump截取的文件中,直接显示其中UDP包的内容。
QQ协议包
QQ协议包的构成是:
QQ协议包头|QQ命令包|包尾
QQ包头是7个字节:分别的意义是:
第0-0字节:总是02,表明是基本的QQ协议。在新版本的QQ中,我们发现还有使用06和01的,大约的作用似乎是:06是向服务器(和不同QQ使用的服务器不同)请求发送一些作用不明的文件。01是服务器向它进行发送这个文件。目前,我们明白作用的是02协议族。
第1-2字节:发送者的QQ软件版本代码。如果是01 00表示是发自服务器的包。这时候我们检查源IP地址就可以获得服务器的IP。
第3-4字节:QQ指令代码。如果发现有新的指令,将是很重要的信息。
第5-6字节:指令序列号。QQ的指令总是成对出现的,也就是说,一方发出一个命令,将会收到另一方的同样序列号的应答。另外,发送方每条指令的序列号都是上一条指令的加一。有两个方面要注意的是,每一方都维持自己的序列号,也就是说,客户端的当前序列号和服务器的当前序列号是不一致的,当客户端为指令发出方的时候,它使用自己的当前序列号,而服务器作为应答方,在应答的时候使用的接受到的命令的序列号;反之,如果是服务器是指令的发出方,那么它就使用自己的当前序列号,而不用理会客户端上一条指令的序列号。另外一个事情是,由于服务器会同时和多个客户端通信,所以,对每个客户端收到的服务器指令的序列号不是连续的,序列号的连续性不应该作为丢包的判断依据。
另外,通信开始客户端的第一个序列号是随机选取的,但似乎没有发现大过0x00ff的。最后的退出登录数据包总是使用0xffff作为序列号,而且是不会有应答的。
包尾是一个字节,目前发现总是0x03。
由于我们截取的是机器上的全部UDP包,所以我们需要使用这些信息来综合判断我们当前分析的是不是QQ的命令。
这样我们就可以剥离出QQ的命令包数据部分:
0000: 01 82 5D 90 6F 30 FD 96
0008: 3B B1 0F E5 FF 8E 3E 4B
0016: 38 E2 86 E1 8A F7 C8 CA
0024: B2 01 76 B6 ED 9E 2B 97
0032: FD B9 7F 23 B2 09 02 71
0040: 22 94 E3 4B E8 E2 8F FD
0048: FF 02 87 83 0B 32 57 73
0056: 91 7F EF 7B 7A 60 CB 44
0064: A4 B5 CA 13 19 F6 CE D5
0072: EC 2F D5 8A 88 22 48 14
0080: 4E 44 08 18 37 9D 8D AA
0088: 42 9C 88 A4 AB 44 0D 4B
0096: 23 74 AC ED
到这里为止,我们已经可以观察网络上客户端往返的指令的大概情况,而了解QQ协议的大概框架。另外将叙述数据包文件的分析。
然后,你启动VPC,注意先不要登录QQ。
打开终端窗口。输入su命令,在提示里面输入root用户密码,进入root用户。这时候提示符应该是个#号。
以root身份运行终端命令:
tcpdump -w dump.dat -s 0 udp
这个命令的作用是把网络上传输的数据截获下来。
-w dump.dat 意思是把输出存到dump.dat文件下。
-s 0 是指定保存完整的包,如果指定一个非零的数值,那么将会保存这个数值的长度。
udp 是指只保存UDP协议的数据(腾讯文字通讯所采用的协议)。
(你有PC的话,也可以使用windump来截获你PC上的QQ的数据包。windump是windows下的命令行程序,它的使用参数和tcpdump完全一样。你可以在 http://windump.polito.it/ 中下载)。
然后我们启动VPC里面的QQ,执行我们所想要研究的有关操作。完成以后,会到终端窗口,按ctrl-c中断tcpdump的运行。这时,在当前目录下就有dump.dat了。
然后,可以用hexedit打开这个文件,观察一下我们dump的结果。
里面是连接着的数据,是按照“QQ包->UDP包->IP包->链路层封装->tcpdump的文件格式”的层次结构进行封装的。
下面是一个数据片段:
0008: A1 B2 C3 D4 00 02 00 04
0008: 00 00 00 00 00 00 00 00
0016: 00 00 FF FF 00 00 00 01
0024: 3F 44 32 28 00 0C 2D AF
0032: 00 00 00 96 00 00 00 96
0040: 00 06 25 60 F4 C0 00 03
0048: 93 A7 09 38 08 00 45 00
0056: 00 88 8E 53 00 00 80 11
0064: 9D 9D C0 A8 01 66 CA 68
0072: 81 FD C2 34 1F 40 00 74
0080: C3 AD 02 08 16 00 22 00
0088: 10 01 82 5D 90 6F 30 FD
0096: 96 3B B1 0F E5 FF 8E 3E
0104: 4B 38 E2 86 E1 8A F7 C8
0112: CA B2 01 76 B6 ED 9E 2B
0120: 97 FD B9 7F 23 B2 09 02
0128: 71 22 94 E3 4B E8 E2 8F
0136: FD FF 02 87 83 0B 32 57
0144: 73 91 7F EF 7B 7A 60 CB
0152: 44 A4 B5 CA 13 19 F6 CE
0160: D5 EC 2F D5 8A 88 22 48
0168: 14 4E 44 08 18 37 9D 8D
0176: AA 42 9C 88 A4 AB 44 0D
0184: 4B 23 74 AC ED 03 3F 44
0192: 32 29 00 06 D0 EA 00 00
0200: 00 68 00 00 00 68 00 06
0208: 25 60 F4 C0 00 03 93 A7
0216: 09 38 08 00 45 00 00 5A
0224: 8E 54 00 00 80 11 B2 F9
0232: C0 A8 01 66 3D AC F9 8A
0240: C2 35 1F 40 00 46 23 2C
0248: 05 01 00 01 82 5D 90 01
0256: 1F 02 16 08 00 00 00 00
0264: 00 00 00 00 00 00 00 00
0272: 00 00 00 00 01 02 5E FD
0280: 00 01 01 00 00 00 00 42
0288: 62 0B 9F 27 F3 D9 FB 05
0296: C6 54 E3 7F 01 E4 B4 01
0304: 00 00 00 00 04 00 3F 44
0312: 32 29 00 06 F6 48 00 00
0320: 00 B3 00 00 00 B3 01 00
0328: 5E FF FF FA 00 06 25 60
0336: F4 C0 08 00 45 00 00 A1
0344: 00 4C 00 00 04 11 F9 CE
0352: 18 C0 B3 77 EF FF FF FA
0360: 04 09 07 6C 00 8D 91 43
0368: 4D 2D 53 45 41 52
Tcpdump文件格式:
首先我们看到的是最外面的一张包装纸:tcpdump的文件格式。它的格式是这样的(详细的描述可以参考:libpcap-format的资料):
文件头 | 数据包头 | 链路层数据 | 数据包头 |链路层数据| ....
首先,每个文件以一个24字节长的文件头开头,我们需要知道的是最前面的四个字节是:A1 B2 C3 D4,如果不是这个标识,那么就不是tcpdump生成的数据文件(如果是PC上的windump生成的文件,那么则是D4 C3 B2 A1,以表明PC上的endian不同,我们这里不用关心这个区别)。
跳过这24个字节,下面就是以“数据包头|链路层数据”为一组的这样一组组的数据。数据包头不是网络上真正传输的数据,它包含的信息主要是截获这个包的时间等信息。它的长度16个字节。我们关心的是第8-11和9-15字节(我们按编程的习惯,把第一个字节称为第0字节,下同)。前者表明后面的链路层数据包在文件里面的长度,后者表明它的实际长度。两者可能不同是因为可能存在截断的情况。由于我们使用了-s 0参数,所以他们应该是相同的。从数据包头结束,到长度指明的字节数为止,是实际在网络中传输的链路层数据包。然后,就是下一个数据包头。这样,我们就可以逐个把tcpdump文件的封装去掉,获得一个一个实际在网络中传输的数据包了。例如,我们忽略文件头,从第24字节开始的3F 44 32 28 ...就是数据包,数据包的第8-11字节:00 00 00 96就是这个后面数据链路层数据包的长度。也就是说,从40字节开始00 06 25 60...的150(0x96的转换成10进制)个字节就是实际网络传输的链路层数据包。然后,我们在第190(40+150)字节的位置又看到了3F 44 32 29...的下一个数据包头。
我们这样就获得了一个个的链路层数据包。我们上面例子中的第一个是:
0000: 00 06 25 60 F4 C0 00 03
0008: 93 A7 09 38 08 00 45 00
0016: 00 88 8E 53 00 00 80 11
0024: 9D 9D C0 A8 01 66 CA 68
0032: 81 FD C2 34 1F 40 00 74
0040: C3 AD 02 08 16 00 22 00
0048: 10 01 82 5D 90 6F 30 FD
0056: 96 3B B1 0F E5 FF 8E 3E
0064: 4B 38 E2 86 E1 8A F7 C8
0072: CA B2 01 76 B6 ED 9E 2B
0080: 97 FD B9 7F 23 B2 09 02
0088: 71 22 94 E3 4B E8 E2 8F
0096: FD FF 02 87 83 0B 32 57
0104: 73 91 7F EF 7B 7A 60 CB
0112: 44 A4 B5 CA 13 19 F6 CE
0120: D5 EC 2F D5 8A 88 22 48
0128: 14 4E 44 08 18 37 9D 8D
0136: AA 42 9C 88 A4 AB 44 0D
0144: 4B 23 74 AC ED 03
链路层数据包:
下面我们要撕去链路层数据包这个第二层包装纸。链路层数据包格式是和传输的方式有关的:如果我们是在局域网里面共享上网,那么一般是用称为 RFC894以太网协议,少数情况下也会是RFC 1042的802.3协议。如果你用Modem拨号上网,那么可能会是RFC 1055的SLIP协议,如果是用ADSL,那么将会是RFC 1548的PPP协议。
链路层数据对我们来说意义不大,我们要做的是剥去这层包装纸而已。
RFC894/RFC1042/RFC 1548:
这三种协议的形式都是:
包头|IP数据包|(包尾)
对RFC894,包头是14字节;RFC1042,包头是22字节;RFC 1548,包头是5个字节。我们跨过这些字节,就是IP包的数据了。包尾如何并不要紧,因为IP包的内容本身会告诉我们它的长度。
在上面的链路层数据包中,我们跳过14个字节,第14字节以45 00 00 88开始的就是IP包的数据。其它的协议也可以这样处理。
RFC 1055:
IP数据包被封装在一对的0xc0字符中间。但是,由于数据包中间就不能有0xc0字符,所以原来的0xc0字符被其它代替了,我们要把它还原。方法是搜索这个数据包,把0xdb 0xdc转换为0xc0;0xdb 0xdd转换为0xdb。比较麻烦,所以,最后不要使用它来截取数据。
IP包的第2-3字节是它的长度,上面我们看到的第14字节开始的IP包,它的长度就是00 88。也就是136个字节。所以,从14字节开始的136个字节就是IP数据包。这样,我们就剥去了链路层的包装纸,获取了IP包。
我们上面的例子的第一个IP包是:
0000: 45 00 00 88 8E 53 00 00
0008: 80 11 9D 9D C0 A8 01 66
0016: CA 68 81 FD C2 34 1F 40
0024: 00 74 C3 AD 02 08 16 00
0032: 22 00 10 01 82 5D 90 6F
0040: 30 FD 96 3B B1 0F E5 FF
0048: 8E 3E 4B 38 E2 86 E1 8A
0056: F7 C8 CA B2 01 76 B6 ED
0064: 9E 2B 97 FD B9 7F 23 B2
0072: 09 02 71 22 94 E3 4B E8
0080: E2 8F FD FF 02 87 83 0B
0088: 32 57 73 91 7F EF 7B 7A
0096: 60 CB 44 A4 B5 CA 13 19
0104: F6 CE D5 EC 2F D5 8A 88
0112: 22 48 14 4E 44 08 18 37
0120: 9D 8D AA 42 9C 88 A4 AB
0128: 44 0D 4B 23 74 AC ED 03
IP包
IP包是网络上传送的与传输线路无关的数据包,也是我们开始需要真正关心的数据。IP包的格式是:
IP包头|IP包数据(我们这里就是UDP数据包)
IP包头,除了我们刚才说的包长度(第2-3字节)以外,还有几个重要的信息是我们所需要关心的:
第12-15和第16-19分别为源和目的IP地址。它用四个字节来代表一个IP地址,把每个字节转换成十进制,就是我们熟悉的IP地址。比如,上面的源IP地址:C0 A8 01 66就是192.168.1.102,这是我局域网的IP地址,所以,这是一个从我的机器上发出的包。目的地址是CA 68 81 FD就是202.104.129.253。从后面我们对QQ数据包的了解我们知道这是一个发往服务器的包,所以我们就获得了一个QQ服务器的IP地址。(注意,并不是全部发出的包都是发往服务器的!)
如果,找到一个原来不知道的服务器,那么是一个很重要的发现。
第0个字节,高4位为IP的版本号,低四位为IP包头的长度。比如说,我们上面的数据包第一个字节为45,它的高4位为4,表明它是我们通常所说的 IPv4协议,低四位为5,表明IP包头的长度为5X4=20字节(头的长度是以四字节为单位的)。这样表明从第20字节开始就是IP包的数据部分,也就是UDP包的内容了。这样我们可以剥离出UDP包:
0000: C2 34 1F 40 00 74 C3 AD
0008: 02 08 16 00 22 00 10 01
0016: 82 5D 90 6F 30 FD 96 3B
0024: B1 0F E5 FF 8E 3E 4B 38
0032: E2 86 E1 8A F7 C8 CA B2
0040: 01 76 B6 ED 9E 2B 97 FD
0048: B9 7F 23 B2 09 02 71 22
0056: 94 E3 4B E8 E2 8F FD FF
0064: 02 87 83 0B 32 57 73 91
0072: 7F EF 7B 7A 60 CB 44 A4
0080: B5 CA 13 19 F6 CE D5 EC
0088: 2F D5 8A 88 22 48 14 4E
0096: 44 08 18 37 9D 8D AA 42
0104: 9C 88 A4 AB 44 0D 4B 23
0112: 74 AC ED 03
UDP包
UDP包是多数即时通讯软件采用的协议。它的格式是:
UDP包头|UDP包数据(这里就是腾讯QQ协议包)
UDP包头是固定8个字节。
第0-1字节是源端口号,第2-3是目的端口号。一般,我们客户端的端口号可以随便选取(有资料说是4000,但是实际发现,新版的QQ已经是随便选取,没有限制了)。从上面的UDP包,我们从以前IP包的信息知道是我们发送出去数据包,所以目的端口号就是服务器所使用的端口号。这里是1F 40,也就是8000号端口,目前还没有发现使用其他端口的,所以,如果发现有服务器使用其他端口,也将是一个很重要的信息。
第4-5字节是UDP包的长度,这不是很重要,但是也可以用它来检验一下我们的剥离过程有没有错误。
我们去除掉头8个字节,剩下的就是QQ协议包了:
0000: 02 08 16 00 22 00 10 01
0008: 82 5D 90 6F 30 FD 96 3B
0016: B1 0F E5 FF 8E 3E 4B 38
0024: E2 86 E1 8A F7 C8 CA B2
0032: 01 76 B6 ED 9E 2B 97 FD
0040: B9 7F 23 B2 09 02 71 22
0048: 94 E3 4B E8 E2 8F FD FF
0056: 02 87 83 0B 32 57 73 91
0064: 7F EF 7B 7A 60 CB 44 A4
0072: B5 CA 13 19 F6 CE D5 EC
0080: 2F D5 8A 88 22 48 14 4E
0088: 44 08 18 37 9D 8D AA 42
0096: 9C 88 A4 AB 44 0D 4B 23
0104: 74 AC ED 03
我们有一个命令行小工具showUDP,可以从tcpdump截取的文件中,直接显示其中UDP包的内容。
QQ协议包
QQ协议包的构成是:
QQ协议包头|QQ命令包|包尾
QQ包头是7个字节:分别的意义是:
第0-0字节:总是02,表明是基本的QQ协议。在新版本的QQ中,我们发现还有使用06和01的,大约的作用似乎是:06是向服务器(和不同QQ使用的服务器不同)请求发送一些作用不明的文件。01是服务器向它进行发送这个文件。目前,我们明白作用的是02协议族。
第1-2字节:发送者的QQ软件版本代码。如果是01 00表示是发自服务器的包。这时候我们检查源IP地址就可以获得服务器的IP。
第3-4字节:QQ指令代码。如果发现有新的指令,将是很重要的信息。
第5-6字节:指令序列号。QQ的指令总是成对出现的,也就是说,一方发出一个命令,将会收到另一方的同样序列号的应答。另外,发送方每条指令的序列号都是上一条指令的加一。有两个方面要注意的是,每一方都维持自己的序列号,也就是说,客户端的当前序列号和服务器的当前序列号是不一致的,当客户端为指令发出方的时候,它使用自己的当前序列号,而服务器作为应答方,在应答的时候使用的接受到的命令的序列号;反之,如果是服务器是指令的发出方,那么它就使用自己的当前序列号,而不用理会客户端上一条指令的序列号。另外一个事情是,由于服务器会同时和多个客户端通信,所以,对每个客户端收到的服务器指令的序列号不是连续的,序列号的连续性不应该作为丢包的判断依据。
另外,通信开始客户端的第一个序列号是随机选取的,但似乎没有发现大过0x00ff的。最后的退出登录数据包总是使用0xffff作为序列号,而且是不会有应答的。
包尾是一个字节,目前发现总是0x03。
由于我们截取的是机器上的全部UDP包,所以我们需要使用这些信息来综合判断我们当前分析的是不是QQ的命令。
这样我们就可以剥离出QQ的命令包数据部分:
0000: 01 82 5D 90 6F 30 FD 96
0008: 3B B1 0F E5 FF 8E 3E 4B
0016: 38 E2 86 E1 8A F7 C8 CA
0024: B2 01 76 B6 ED 9E 2B 97
0032: FD B9 7F 23 B2 09 02 71
0040: 22 94 E3 4B E8 E2 8F FD
0048: FF 02 87 83 0B 32 57 73
0056: 91 7F EF 7B 7A 60 CB 44
0064: A4 B5 CA 13 19 F6 CE D5
0072: EC 2F D5 8A 88 22 48 14
0080: 4E 44 08 18 37 9D 8D AA
0088: 42 9C 88 A4 AB 44 0D 4B
0096: 23 74 AC ED
到这里为止,我们已经可以观察网络上客户端往返的指令的大概情况,而了解QQ协议的大概框架。另外将叙述数据包文件的分析。
发表评论
-
TEA算法的VB实现代码的使用说明
2008-12-30 11:28 1938自从公开了TEA算法的VB代码之后一直有人追问我如何调用这两个 ... -
TEA算法的VB实现代码
2008-12-30 11:02 1648前些日子不少人都要挂QQ,有客户需求就自然有人去研究,所以不少 ... -
QQ通讯协议
2008-12-30 10:56 4197协议说明: 协议由报文 ... -
hoxede的QQ填充算法和TEA 加解密的python实现
2008-12-30 10:31 2904""" The MIT Lic ... -
如何从 Visual Basic 中调用 GetNetworkParams / GetAdapter
2008-12-30 09:52 17091. 启动一个新的 Visual Basic 标准 EX ... -
VB调用GetAdaptersInfo 的正确方法
2008-12-30 09:51 2729网上的教程没有一个能在多网卡或多IP下用的,总是在 Cop ... -
VB做的EXE文件设参数
2008-12-29 12:26 1200这个其实很简单 在 Private Sub Form_L ... -
VB常用字符串函数
2008-12-29 12:26 14901. ASC(X),Chr(X):转换字 ... -
VB常用函数
2008-12-29 12:25 23071. Time 返回系统时钟的当前时间。 Date 返回 ... -
VB使用*.res资源文件
2008-12-29 12:23 1673你一定也常常因苦于无法组织自己程序中大量的picture,而头 ... -
在不同的模式下实现定时关闭计算机
2008-12-29 12:20 873Option Explicit Const SM_CLEANB ... -
强制关闭指定QQ号
2008-12-29 12:19 1331'添加 Text1 Command1 ... -
VB读取武林外传内存地址
2008-12-29 12:18 2114一 模块代码 复制内容到剪贴板 代码: Option Expl ... -
怎么编程把用户名,密码提交到网页上的登录页?
2008-12-29 12:06 1466首先在程序中加入Webbrowser控件并加入引用 Micro ... -
在XP/2K 任务管理器的进程列表中隐藏当前进程
2008-12-29 12:05 1257新建一个模块,把以下代码复制进去,然后在load中调用即可实现 ... -
用VB制作IE工具条自定义按钮
2008-12-29 12:04 1202Private Sub UserControl_Resize( ... -
Webbrowser(Internet 控件)属性方法事件一览表
2008-12-29 11:56 4808想找个Webbrowser控件的详细使用手册,网上找了好久,都 ... -
使用vbs下载文件
2008-12-29 11:52 1552使用vbs下载文件 iLocal=LCase(Wscript. ... -
如何用VB制作半透明窗体?
2008-12-29 11:51 1703函数SetLayeredWindowAttributes ... -
vb api 控制 任务栏 桌面 托盘。。
2008-12-29 11:45 2103VB无疑是最先进的编程 ...
相关推荐
实验一截获IP数据包并加以分析 1、实验目的: 要求学生掌握Socket编程中原始套接字的技术
本文将深入探讨API Hook实现数据包截获的相关知识点,包括API Hook的基本原理、实现方式以及如何在指定进程中应用。 API Hook,简单来说,就是一种技术手段,通过在目标函数调用前后插入自定义的代码,来改变原有...
一定时间内的,目的IP为本机的IP数据包的截获,最后得到IP数据包数量。
### 局域网中利用聚生网管与科来软件截获QQ号的方法 #### 一、背景介绍 在局域网环境下,有时出于管理需求,网络管理员需要对内部网络中的用户活动进行监控,比如记录用户的上网行为、聊天记录等。在这样的背景下...
1. **协议结构**:QQ协议通常基于TCP/IP协议栈构建,使用自定义的数据包格式,包含头部信息、消息体和可能的加密部分。头部信息可能包括消息类型、长度等元数据,消息体则承载实际的通信内容。 2. **身份验证**:...
程序结合易语言脚本语言...QQ校友截获的数据包 GET /login?ptlang=2052&undefined=undefined&u=123456789&p=699FCE0AE62E1E2FC1DD20E8E4A141F&verifycode=!ML9&aid=15000901&u1=http://passport.pengyou.com/index.php?...
7. **安全与隐私保护**:为了保护用户数据的安全,软件通常会采用SSL/TLS等加密技术,对传输的数据进行加密,防止被第三方截获。 8. **多线程与并发处理**:为了保证用户体验,软件通常使用多线程技术处理并发的...
局域网QQ的实现基于TCP/IP协议栈,TCP(传输控制协议)负责确保数据的可靠传输,而IP(因特网协议)则负责数据包的路由。在局域网环境中,数据交换通常通过UDP(用户数据报协议)和TCP这两种传输层协议进行。 2. *...
(3)QQ 文件传输过程分析:通过分析QQ文件传输过程,我们可以了解数据包收发的整个流程。 (4)分析 HTTP 代理工作过程:HTTP 代理是指在客户端和服务器之间的代理服务器。通过分析HTTP代理工作过程,我们可以了解...
- **定义**: 利用具有UDP监听功能的防火墙(如天网)来截获对方IP地址的一种方法。 - **操作流程**: - 打开天网防火墙的UDP监听功能。 - 查看自己使用的QQ服务器地址。 - 排除服务器地址,通过监听获取对方IP...
这需要解析和构造符合QQ协议的数据包,通常包含消息内容、发送者和接收者的QQ号码等信息。 3. **错误处理**:程序需要有适当的错误处理机制,例如网络中断、登录失败、消息发送失败等情况,确保程序的健壮性。 4. ...
实验报告“网络信息安全实验报告2_B18030825殷祥1”主要探讨了使用Wireshark工具在Windows环境下捕获TCP协议数据包的过程,并通过实践检验了网络通信的安全性,尤其是电子邮件和在线购物平台的数据加密情况。...
网络嗅探是一种网络数据捕获技术,它通过在数据链路层截获和分析网络传输的数据包,以便进行网络监控、数据分析和安全审计等目的。该文档提到了多种工具和方法,以及与网络嗅探相关的概念和技术细节。以下是对文档中...
抓包(Packet Sniffing),是指在网络中截获并记录计算机网络上传送的数据包的过程。通常使用的工具有Wireshark等。通过抓包,可以详细地了解网络中数据传输的情况,这对于理解网络协议、排查网络故障等方面非常有...
一旦UDP数据包被截获,KV2004会自动解析出对方的IP地址。在设置过程中,需注意选择监听所有端口范围(0到65535),同时关闭其他可能干扰的网络连接,以确保准确捕获到目标IP地址。 #### 方法三:专业IP查询工具 ...
可以用来抓取浏览器、QQ、MSN等网络程序通信的原始数据包,对分析进程的网络通信很方便! HOU网络抓包主 v1.1e + 对查看数据区加入Ctrl+A全选,方便复制 + 查找数据时可忽略大小写 + 可在“截获”中,右键...
封包加密就是在数据包发送前对数据进行加密处理,确保即使数据包在传输过程中被截获,也无法被未经授权的人解密和理解。这一过程通常包括三个主要步骤:加密、传输和解密。 1. **加密**:在发送端,数据通过加密...
- **TNS网络协议-hacking实现SQL数据流截获**:这份资料可能探讨了如何通过拦截TNS通信来监控或篡改SQL查询,对数据库安全有重要启示。 - **Oracle tns数据包和oracle-数据传输协议文本**:这些文件可能是实际的TNS...
现在木马间谍程序层出不穷,有偷取您的上网帐号、银行帐号、游戏帐号、邮箱帐号的,也有QQ尾巴病毒一样疯狂发消息的,还有狂发带病毒Email的,还有锁住IE强制访问一些色情站点的,等等。 经过分析我们发现90%的木马...