四、各连接模块说明:
1 ISO连接模块:
在客户端与服务器的网络套接口建立之后,需要首先建立RDP协议底层连接,得到连接确认后才能正常通信。具体实现如下:
1) 连接过程说明:
初始连接时,在网络套接口TCP连接建立之后中,客户端首先进行连接请求,当收到连接确认后表示网络连接层连接建立,随后开始传送RDP数据。
2) 连接请求通信数据:
内容
|
层内数据长度
|
RDP包类型
|
未知1
|
未知2
|
标志
|
其它
|
字节数
|
1
|
1
|
2
|
2
|
1
|
不定
|
值
|
从下一字节开始计算
|
0xd0或0xe0
|
0x0000
|
另见
|
0x00
|
另见
|
3) RDP包类型说明:
0xe0:客户端连接请求
0xd0:服务器确认连接
4) 未知数据2说明:
0x0000:客户端请求连接的值
0x1234:服务器确认请求的值
5) 其它数据说明:
win2003客户端在请求时附带了如下字符—“Cookie: mstshash=Administrator0x0d0x0e”,目前不知其意。其中Administrator为自动登录名,当其长度超过12字节时,只保留前12字节,其它字符都固定不变。
2 协议信息初始模块:
当基本的RDP连接建立后,需要进行客户端与服务器的系统环境、RDP连接环境的信息交流与连接确认。
2-1) 发送包结构:
内容
|
字节数
|
值
|
ISO数据层及以下
|
XX
|
XX
|
协议信息初始发送标志
|
2
|
0x7f65
|
其后数据长度
|
3
|
0x82 0xlength
|
第一部分未知数据
|
7
|
04 00 04 00 01 01 ff
|
第二部分未知数据
|
XX
|
三组协议参数
|
第三部分未知数据
|
XX
|
四种连接参数
|
2-1-1) 第一部分未知数据结构:
内容
|
字节数
|
值
|
Calling domain
|
2
|
0x0400
|
Called domain
|
2
|
0x0400
|
未知数据
|
2
|
0x0101
|
标志
|
1
|
0xff
|
2-1-2) 第二部分未知数据结构:
内容
|
字节数
|
值
|
协议适合参数
|
2+4+7*(2+参数值占字节数)
|
标志,长度,8个参数值
|
协议最小参数
|
2+4+7*(2+参数值占字节数)
|
标志,长度,8个参数值
|
协议最大参数
|
2+4+7*(2+参数值占字节数)
|
标志,长度,8个参数值
|
说明:3组参数标志都是0x30,8个参数值的标志都是0x20
含义
|
适合值
|
最小值
|
最大值
|
虚拟通道数
|
0x22=34
|
0x01
|
0xffff
|
用户数
|
0x02
|
0x01
|
0xfc17=64535
|
Token值
|
0x00
|
0x01
|
0xffff
|
优先数(priorities)
|
0x01
|
0x01
|
0x01
|
遍及数(throughput)
|
0x00
|
0x00
|
0x00
|
顶点数(height)
|
0x01
|
0x01
|
0x01
|
网络逻辑数据包长度
|
0xffff
|
0x0420=1056
|
0xffff=65535
|
版本号
|
0x02
|
0x02
|
0x02
|
2-1-3) 第三部分未知数据结构:
内容
|
字节数
|
值
|
本部分标志、数据长度
|
4
|
0x04 0x82 0xlength1
|
未知数据1
|
4
|
00 05 00 14 7c 00 01
|
余下的数据长度
|
2
|
0x8000|length2
|
未知数据2
|
8
|
00 08 00 10 00 01 c0 00
|
未知数据3
|
4
|
44 75 63 61 –“Duca”
|
4组数据
|
XX
|
各功能模块连接信息
|
2-1-3-1:基本信息
内容
|
字节数
|
值(反字节存储)
|
标志
|
2
|
0xc001
|
长度
|
2
|
这一组数据的长度
|
Licence版本
|
2
|
1,4,5;lincence标志升级
|
未知数据1
|
2
|
0x0008
|
窗口宽度、高度
|
4
|
宽度,高度
|
未知数据2
|
4
|
0xca01,0xaa03
|
Keylayout
|
4
|
0x00000409
|
客户端系统组件数
|
4
|
419,2195,2462
|
客户端机器名
|
32
|
2字节存储1个字符
|
未知数据3
|
12
|
0x04,0x00,0x0c各四个字节
|
未知数据4
|
64
|
都是0
|
未知数据5
|
8
|
01 ca 01 00 00 00 00 00
|
图形颜色位(最大值)
|
2
|
24,16,15,8
|
未知数据6(疑最小位)
|
2
|
07 00
|
未知数据7
|
4
|
01 00 00 00
|
基本信息返回值多少且固定,认为在具体连接时有更多返回信息。加密信息需要取回加密级别与密钥;通道信息则返回基本图形信息的通道号和其他虚拟通道号,需要另行申请。
2-2-1-1) 基本信息
内容
|
字节数
|
值(字节反存)
|
标志
|
2
|
0xc001
|
本组信息长度
|
2
|
0x0008(固定)
|
未知数据1
|
2
|
0x0004
|
未知数据2
|
2
|
0x0008
|
2-2-1-2) 通道信息
内容
|
字节数
|
值(字节反存)
|
标志
|
2
|
0xc003
|
本组信息长度
|
2
|
XX
|
需要单独开辟的通道数
|
2
|
若无需申请则不存在
|
通道号组
|
通道数*2
|
2个字节存放一个通道号
|
空闲字节
|
2
|
0x0000
|
2-2-1-3) 加密信息
内容
|
字节数
|
值
|
标志
|
2
|
0xc002
|
本组信息长度
|
2
|
XX
|
加密位长度
|
4
|
1->40位,2->128位
|
加密级别
|
4
|
1->低,2->中,3->高
|
服务器随机数长度
|
4
|
目前都是32字节
|
RSA信息长度
|
4
|
从随机数结束开始
|
服务器端随机数
|
32
|
XX
|
RSA信息
|
XX
|
XX
|
密钥信息的类型
|
4
|
1->RDP4或0x80000002->X.509
|
2-2-1-3-1) RDP4类型密钥
内容
|
字节数
|
值
|
未知数据1
|
8
|
01 00 00 00 01 00 00 00
|
公钥标志
|
2
|
0x0006
|
长度
|
2
|
length公钥信息
|
RSA1标志
|
4
|
52 53 41 31 --“RSA1”
|
公钥模数+衬垫长度
|
4
|
48 00 00 00-> =64+8
|
未知数据2
|
8
|
00 02 00 00 3f 00 00 00
|
公钥指数(exponent)
|
4
|
01 00 01 00
|
公钥模数值(modulu)
|
64
|
XX
|
公钥衬垫值(pad)
|
8
|
00 00 00 00 00 00 00 00
|
公钥签名标志,长度
|
4
|
0x0008 length(=0x48)
|
签名模数值
|
64
|
XX
|
签名衬垫值
|
8
|
00 00 00 00 00 00 00 00
|
2-2-1-3-1-2) 公钥信息数字签名—X509类型密钥
内容
|
字节数
|
值
|
证书个数
|
4
|
不少于2个
|
无效证书
|
XX
|
若证书大于2个,都 被忽略,无效
|
CA证书
|
XX
|
XX
|
服务器证书
|
XX
|
XX
|
Padding值
|
16
|
全是0
|
对于win2003操作系统,当授权组件被更改时,此处的密钥变为X509类型。对于客户端,只提取服务器证书部分的相关信息,以得到服务器随机数。由于对于密钥的处理是采用通用的加密算法与标准,因此在此不予深入的讨论。
3 通道申请模块
对于RDP连接,各种功能数据都是通过单独的虚拟通道传输的。初始连接后,在进一步的信息通信之前,需要开辟相应的通道。
1) 过程说明
客户端首先发送一个建立连接独立空间请求,再发送一个用户绑定请求,若服务器同意,将发送用户绑定确认,且含有需要申请的虚拟通道总数totalchannel。随后客户端申请虚拟通道。虚拟通道号从1001+2=1003开始到1001+totalchannel结束,每次申请都应返回一个申请结果。
2) 建立连接独立空间请求结构:
内容
|
ISO数据层以下
|
请求标示
|
高度值
|
间距
|
字节数
|
XX
|
1
|
2
|
2
|
值
|
XX
|
0x04
|
0x0001
|
0x0001
|
3) 用户绑定请求结构:
内容
|
ISO数据层以下
|
请求标示
|
字节数
|
XX
|
1
|
值
|
XX
|
0x28
|
4) 用户绑定确认结构:
内容
|
ISO数据层以下
|
请求标志
|
虚拟通道总数
|
字节数
|
XX
|
2
|
2
|
值
|
XX
|
0x2e00
|
totalchannel
|
5) 申请虚拟通道号结构
内容
|
ISO数据层以下
|
申请标志
|
虚拟通道总数
|
虚拟通道号
|
字节数
|
XX
|
1
|
2
|
2
|
值
|
XX
|
0x38
|
totalchannel
|
Num,
|
6) 通道申请确认结:
内容
|
ISO数据层以下
|
确认标志
|
通道总数
|
申请通道
|
申请通道
|
字节数
|
XX
|
2
|
2
|
2
|
2
|
值
|
XX
|
0x3e00
|
totall
|
num
|
num
|
此博文原地址为:http://blog.chinaunix.net/u/2244/showart_2154206.html
分享到:
相关推荐
### RDP协议详细解析 #### 一、前言 RDP(Remote Desktop Protocol)协议是微软为Windows系统设计的一种远程桌面通信协议,旨在提供一种安全的远程访问方式,让用户能够远程控制服务器或另一台计算机。从Windows ...
本文将详细解析文档中的关键知识点,包括RDP协议的背景介绍、更新内容以及这些变化的原因。 #### 二、RDP协议简介 RDP协议是一种面向连接的数据传输协议,旨在提供一种可靠的端到端数据传输服务。它通过一系列机制...
**二、RDP协议结构解析** #### 1. TPKT层(Transport Layer Protocol) RDP协议在其传输过程中采用了TPKT(Transport Layer Protocol)作为其传输层协议之一。TPKT是一种用于定义网络传输层协议的数据包格式,主要...
### RDP协议官方文档知识点解析 #### 一、概述 **RDP协议(Remote Desktop Protocol)** 是由微软开发的一种专用于远程桌面连接的技术标准。它允许用户通过网络连接到另一台计算机上,并以图形界面的方式操作这台...
#### 二、RDP协议解析 ##### 2.1 RDP协议简介 远程桌面协议(Remote Desktop Protocol,简称RDP)是由微软公司开发的一种专有的网络通信协议,用于提供远程访问功能。RDP允许用户通过网络控制另一台计算机,从而...
开源项目FreeRDP是实现RDP协议的一个重要实现,它提供了一个跨平台的远程桌面客户端,支持多种操作系统,包括Windows、Linux、macOS等。 FreeRDP源码解析: 1. **项目结构**: FreeRDP的源码结构通常包含多个模块...
结合提供的文档,"RDP解析"可能详细讲解了上述各部分的工作原理和交互流程。通过阅读这些文档,你可以深入了解RDP如何处理数据包,如何进行安全通信,以及如何优化远程桌面体验。虽然RDP协议分析可能涉及的技术细节...
RDP协议支持多种可选通道,如剪贴板、音频、打印等。在FreeRDP中,这些通道由独立的模块实现,每个模块负责特定的功能。在连接过程中,客户端会根据配置决定哪些通道需要开启,并调用相应的初始化函数来建立这些...
1. RDP协议:FreeRDP实现了微软的远程桌面协议,这是一种用于远程桌面访问的标准,支持多种功能,如音频播放、打印、文件传输等。RDP协议在不断演进,FreeRDP需要跟进行业标准,确保与最新版本的服务器兼容。 2. ...
FreeRDP支持RDP协议的安全层,包括TLS和NLA(网络级身份验证)。这些安全措施确保了数据传输的隐私和完整性。 ### 8. 多平台支持 FreeRDP的跨平台特性使其成为移动设备和嵌入式系统的理想选择。例如,可以在...
另一方面,没有安全的开源RDP协议实现。 最后,我想构建一个高度安全,跨平台和高度可定制的客户端。 安装 要将rdp-rs用作项目中的库,请将以下内容添加到Cargo.toml : [dependencies] rdp-rs = "0.1.0" 您可以...
RDP协议由多个子组件组成,如输入、输出、会话管理等,这些都可能在这个文件中找到。 4. **orders.c**:RDP订单(Orders)是RDP中用于描述图形操作的一种编码方式,比如绘制文本、线条、矩形等。这个文件应该实现了...
1. **协议理解与解析**:深入理解RDP协议的工作原理是开发的基础。这包括但不限于如何建立连接、数据传输方式等。 2. **安全机制**:RDP框架的安全性至关重要。开发过程中需要考虑加密算法的选择、认证机制的设计等...
RDP(Remote Desktop Protocol)是微软提供的一种远程桌面连接协议,允许用户通过网络访问和控制远程计算机。在处理RDP文件时,有时我们需要在其中设置密码以便安全地进行远程访问。RDP文件实际上是一个文本文件,...
在C++和C#中实现RDP客户端功能涉及多个关键知识点,包括网络通信、协议解析和图形界面设计。 1. **网络通信基础**:RDP客户端首先需要与远程服务器建立TCP连接。这涉及到套接字编程,理解TCP/IP协议栈的工作原理,...
3. **协议解析**:RDP协议有自己的数据结构和报文格式,源码会展示如何解析和构建这些报文,以便正确地与远程桌面服务进行交互。 4. **事件驱动编程**:易语言支持事件驱动编程模型,源码中可能包含事件的定义和...
3. **RDP协议**:理解RDP的工作原理,包括连接流程、认证机制以及.RDP文件的结构和配置选项。 4. **文件操作**:在VC++中读写文件,特别是.RDP文件,需要知道如何解析和编辑这些文件的格式。 5. **安全性**:确保...
同时,它还处理用户的输入事件,如键盘、鼠标操作,将这些事件编码成RDP协议数据包,然后发送回远程服务器。 在源码中,开发者可以找到以下关键模块: 1. 连接管理:建立和维护RDP连接,包括身份验证、会话初始化...
对于非开发者的用户信息,如果是在寻找关于Remote Desktop连接的常见问题解答,可以参考微软提供的“Remote Desktop Connection: frequently asked questions”文档,这将提供更面向用户的指导。 总的来说,RDS和...
综上所述,基于Linux的RDP客户端设计是一个综合性的技术挑战,涉及到网络协议、系统编程、跨平台兼容性以及协议解析等多个领域的知识。这样的项目不仅有助于扩展Linux的功能,也为研究和改进RDP协议提供了实验平台。