zoukankan      html  css  js  c++  java
  • emule学习与分析<二> 上 建立连接过程分析

    开篇

    上文絮叨了一下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

  • 相关阅读:
    [Knowledge-based AI] {ud409} Lesson 16: 16
    [Knowledge-based AI] {ud409} Lesson 15: 15
    [Knowledge-based AI] {ud409} Lesson 14: 14
    [Knowledge-based AI] {ud409} Lesson 13: 13
    [Knowledge-based AI] {ud409} Lesson 12: 12
    [Knowledge-based AI] {ud409} Lesson 11: 11
    [Knowledge-based AI] {ud409} Lesson 10: 10
    [Knowledge-based AI] {ud409} Lesson 9: 09
    列表,元组,字典
    Django项目导入到pycharm提示错误的解决办法
  • 原文地址:https://www.cnblogs.com/haon/p/11478070.html
Copyright © 2011-2022 走看看