开篇

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

转载于:https://www.cnblogs.com/haon/p/11478070.html

emule学习与分析二 上 建立连接过程分析相关推荐

  1. Windows 8 Directx 开发学习笔记(二)建立模型及初始化设备

    上一篇中介绍的DirectxApp类给整个应用搭建了一个框架,而这篇文章涉及的CubeRenderer类则是负责填充框架,呈现实际内容:一个旋转的彩色立方体.CubeRenderer类中的方法通过名称 ...

  2. MongoDB学习之(二)java连接

    上一章完了下mongodb的安装和IDE工具,现在开始使用java进行连接. 第一步:使用jar包, 这里需要三个包,具体为啥我也不清楚,反正因为报错,我就按照官方文档一个个的都下载了. 链接:htt ...

  3. ASP.NET 与数据库知识点(二)建立连接

    1:连接字符串是什么? 字符串,一组被格式化的键值对,数据源在哪里,数据库名,提供什么样访问信任级别,其他相关信息. 格式:一组元素组成,一个元素–键值对,各个元素之间:隔开 2:SqlServer连 ...

  4. 微信小程序学习记录(二)MQTT连接阿里云

    准备 微信小程序开发工具 MQTT.js库:https://unpkg.com/mqtt@2.18.8/dist/mqtt.min.js点开链接,右击页面内容另存到电脑. 开始 将MQTT.js复制到 ...

  5. TCP建立连接和断开连接流程

    [转]http://blog.csdn.net/gamekit/article/details/53888674 一.基本描述 TCP协议为提供面向连接的服务,需要先建立连接,然后才可以通信,通信结束 ...

  6. zookeeper学习(二)之java客户端API建立连接

    大家都知道,zookeeper作为一个分布式服务框架,用来解决分布式数据不一致的问题,今天来看看的提供的java语言的API,下面是zookeeper 3.4.1的文档地址,百度的apihttp:// ...

  7. 在左表或右表的连接字段上建立索引对左、内连接的查询效率的优化情况分析

    -- 1.建表 drop table if exists dept_tbl;create table dept_tbl (rcrd_id int unsigned primary key auto_i ...

  8. 多层高速PCB设计学习笔记(二)基本设计原则及EMC分析

    系列文章目录 多层高速PCB设计学习(一)初探基本知识(附单层设计补充) 多层高速PCB设计学习笔记(二)基本设计原则及EMC分析 多层高速PCB设计学习笔记(三) GND的种类及PCB中GND布线实 ...

  9. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  10. tcp要点学习-建立连接断开连接

    原文:http://www.cppblog.com/kevinlynx/archive/2008/05/14/49825.html 关于TCP的连接建立,断开的讲解,理论的核心内容基本提及,比较通俗. ...

最新文章

  1. 曲线数学NURBS之bezier曲线
  2. Android应用程序进程启动过程的源代码分析(1)
  3. 亿级流量压力来袭,你的网站会被击垮吗?(下篇)
  4. VBA【遍历每个工作表并将工作表表名赋予B2单元格】
  5. 得力助手 消防员的 消防机器人_消防机器人:消防员的“得力助手”(科技大观)...
  6. python-day2~3
  7. CSS 元素超出部分滚动, 并隐藏滚动条
  8. python中递归函数写法_《Python入门08》你知道Python递归函数怎么写吗~~
  9. antd如何获取表单的值_JavaScript多个表单序列化获取值
  10. php disable-ipv6,強迫 PHP Curl 使用 IPv4 , 忽略 IPv6
  11. linux基础,文件目录管理,PATH,cp,mv,cat
  12. 编程工具使用-Procexp
  13. 苦禅箜mm让我帮她做的作业
  14. javaScript系列 [06]-javaScript和this
  15. u盘重装系统详细教程
  16. 强化学习中的backups
  17. Intel 计划在Linux kernel中引入 User Interrupts,效率是eventfd的10倍
  18. 2021年,我们还需要入门深度学习吗?
  19. 200821-阿里云服务器ECS学生使用经验小节(非CS折腾了大半天)
  20. 幻影坦克制作流程和步骤

热门文章

  1. Galaxy Fold上市时间推延 屏幕瑕疵是主因
  2. Linux基本命令之seq
  3. Mac 安装 valet
  4. MySQL的my.cnf详细配置说明
  5. hibernate 调用存储过程
  6. 判断目标主机和自己是否是一个子网的方法
  7. Apache Lucene 3.x推荐教程
  8. HDU-2161 Primes
  9. eclipse运行java程序出现多个问题:内部错误IOConsole Updater
  10. 待看内容 20160823