开篇
上文絮叨了一下emule客户端再ED2K网络大概是如何运作的,
笔者将第一步连接ED2K网络分成2部分
上半部分对于客户端登录ED2K网络进行过程概述,并抓包,分析报文含义
下半部分将实现的部分代码进行比较对照提供参考
准备工作
工具:wireShark抓包,eMule电骡
1)下载电骡后进入服务器->连接,因为这个连接是并行向多个服务器发送登录请求,所以先确保有一个服务器可以连接上,再断开连接右击这个服务器,指定其进行连接,不然服务器IP要换来换去的,抓包很麻烦
2)准备好后对着wireshark过滤好服务器的ip再次连接即可成功抓包
当然报文分析得等一会,先说些前置知识,分为建立连接的过程、本文用到的报文的类型介绍
1)建立连接的过程
当客户端试图建立客户端-服务器 TCP 连接时,它会并行地向几个服务器发送相关请求,然而, 当与其中一个服务器首先完成登录程序之后,将会排他地放弃向其他服务器发出的请求.
连接建立的过程有如下几种情况:
1.HighID 连接 – 服务器向申请连接的客户端授予一个 HighID.
2.LowID 连接 – 服务器向申请连接的客户端授予一个 LowID.
3.拒绝会话 – 服务器拒绝客户端请求.
当然,还存在一些其他的具体情况,如服务器停机或不可连接的情况等.
比如为HighID建立连接的过程,在这种情况下,客户端建立一个到服 务器的 TCP 连接并向服务器发出登录(login)请求.之后,服务器建立另一个到该客户端的 TCP 连接,同时,服务器会发起一个由此客户端参与的客户端-客户端握手会话,并由此判断该客户 端是否具有接受由其他 eMule 客户端发起的连接的能力.再次之后,服务器将关闭这个会话连 接,传送一个改变ID报文,以此完成客户端-服务器登录.
根据前文emule学习与分析<一>,可以知道客户端和服务器建立的是TCP连接,那么简单来说成功的登录就是以下四个步骤(此处忽略HIGHID,因为我没有条件测试公网IP)
1)客户端发起和服务器的TCP连接并建立成功
2)客户端发送一条登录报文
3)服务器会发起一个由此客户端参与的客户端-客户端握手会话 //这个过程我没捕捉到
4)服务器回复一条授予ID(ID更改)报文
2.报文的类型介绍
解析报文时,首先我们必须知道emule报文的一些通用知识
1.在 eMule 协议中用到的所有报文都以小尾(低位在前面)形式出现,
2.所有报文都包含一个 6 字节报文头,其结构由一下几个内容构成
-协议 – 1字节,表示客户端使用的协议 - 0xE3 表示使用 eDonkey 协议 ,0xC5 表示使用 eMule 协议.
-大小 – 4 字节的报文大小描述(不包含报文头),
-类型 – 1字节 – 记录一个独一无二的报文 ID.
先不去纠结每一个字段具体的含义,后面也会讲,拿到实际的报文比对着看也可以一下子理解很多
1)登录报文如下图所示
用户Hash是什么?
eMule 支持一个鼓励上传的信用体系,当一个用户向其他客户端上传的文件量越大,它就会在 其他客户端的等待队列中享有更高的优先级别和更快的上升速度.
用户ID是一组由随机 连接数字组成的 128 位(16 字节)GUID.其中,第 6 位和第 15 位是固定的,分别为 14 和 111. 与客户端 ID 只在和特定服务器的连接会话生命周期中有效不同,用户 ID(也叫做用户 Hash) 是独一无二的,它在每次的会话中都保持不变.因为用户 ID 在整个信用体系中扮演重要角色, 这也成了驱使一些所谓的”黑客”冒名替代信誉等级高的用户ID的原因.因此,eMule使用了一 种加密机制来防止用户欺骗和冒名替代.这个加密机制的实现依赖于一种给予RSA公钥加密 系统的挑战-应答机制.
用户Hash如何产生?
计算方法我不知道,用户HASH是在电驴每一次安装(覆盖安装不算)后自动随机生成,与电脑硬件无关,只要你不删除config目录再进行安装就不会变 via百度知道
2)服务器报文如下图所示
这里注意服务器报文是可以由多报文组成,这一点后面会看到
3)ID更改报文如下图所示
开始
先捕捉一次完整的emule登录过程,本文以ed2k://|server|212.83.184.152|7111|/服务器为例
这里不讲TCP知识了,只需要知道len代表报文字节数
1)抓包
如图可知前三个报文是三次握手,三次握手后客户端发送了一个86字节的登录报文,收到了服务器的91字节和232字节的响应
2)解析登录报文
拉近来看,登录报文是这么一坨十六进制文本(蓝色),看右边(对应的ASCII值)我们发现有一串英文能看懂,那是什么意思接着看就行
根据格式整理一番后得到下图,其实登录报文就是把emule客户端的一些信息发送过去了而已。
当然你可能还会问标签行怎么解释?有什么用?我暂时还没找到答案,猜测格式相似的那部分是一些带有标志含义的东西,但我一看到解释就会更新在本文中
3)解析响应报文
先是91字节的报文,可以看到除了报文头以外,大部分都是ASCII值
解析如下,其实就是友情提示我们没拿到HIGHID
再是第二个232巨型报文(猜都猜到内含多个报文)
乍一眼没有能看懂的部分
解析如下,可能和之前说的登录过程有出入,但其实问题不大
到这里我们可以整理一下具体发生的事件
1、与EMULE服务器建立了一个TCP连接
2、客户端发送了一个请求登录报文
3、服务器回了一个服务器报文
4、服务器回了一个包含三个报文的数据包(内含服务器状态报文、ID更改报文、经过压缩的服务器报文<内容就是版本服务器版本信息等等>)
注意:上述有些和资料有出入,比如在资料上说,服务器状态报文和服务器版本信息时在交换报文阶段(也就是登录后的阶段)发生的,但事实上,在登录完成时服务器就顺带发送了这两个报文。这一点我的理解是不同的服务端处理不同,我也遇到过ID更改报文和第一个服务器报文一起发送过来的,所以主要还是关注报文的信息,有些顺序上的问题不必计较
至此客户端已经登录上了ED2K网络
登录过程的抓包与报文分析结束,相关的java代码将在本文的下半部分进行对照分析
结束
留几个自己没搞定的重要问题:
1、每个标签的值是怎么什么意思?
2、如何捕捉到服务器会发起的客户端-客户端握手会话?
参考资料
eMule协议指南.pdf