五、各功能模块说明:
任务标志说明:适用于所有非图形通道数据。
00 00 00 00
|
01 00 00 00
|
02 00 00 00
|
03 00 00 00
|
00 00 03 00
|
传输中
|
传输开始
|
传输结束
|
传输控制
|
传输反馈
|
1 licence身份谁模块:
在加密、解密验证通过以后,服务器发送licence信息进行系统的身份认证。身份证认证的加密、解密系统也是用RSA/RC4体系,但是与网络通信中的加密、解密系统分开的。licence认证中的密钥是临时的、单独的。
1-1) 连接过程说明:服务器端首先发送demand包,内容是随机数和一些系统相关的字符信息;客户端需要回复requset包,内容是随机数、空闲值、主机名、用户名;服务器再发送authreq包,内容包括token值和signature值;客户端需要回复authresq包,内容包括token值、hwid值和signature值。服务器通过后会发送result包,表明licence认证通过。
1-2) demand包:r
内容
|
字节数
|
值
|
加密层
|
4
|
80 02 86 00
|
Licence标志
|
1
|
01,表示demand,licence认证要求
|
版本
|
1
|
4.0->02,5.x->03
|
本层长度
|
2
|
86 00
|
服务器随机数
|
32
|
XX
|
未知数据1
|
4
|
02 00 05 00
|
公司信息长度
|
4
|
2c 00 00 00
|
公司信息
|
0x2c
|
“Microsoft Corporation 0”,2字节表示1字符
|
未知2长度
|
4
|
08 00 00 00
|
未知数据2
|
8
|
41 00 30 00 32 00 00 00,“A02 0x0”
|
未知数据3
|
8
|
0d 00 04 00 01 00 00 00
|
未知数据4
|
8
|
5c f5 00 00 01 00 00 00
|
未知数据5
|
4
|
0e 00 0e 00
|
网址信息
|
0x0e
|
“Microsoft.com0”,1字节表示1字符
|
1-3) request包:s
内容
|
字节数
|
值
|
加密层
|
4
|
80 00 00 00
|
Licence标志
|
1
|
13,表示request,licence认证要求回复
|
版本
|
1
|
4.0->02,5.x->03
|
本层长度
|
2
|
8a 00
|
未知数据1
|
8
|
01 00 00 00 00 00 01 ff
|
客户端随机数
|
32
|
全是0值
|
(mod+pad)长度
|
4
|
48 00 00 00
|
Modulus值
|
64
|
全是0值
|
Padding值
|
8
|
全是0值
|
用户标志
|
2
|
0f 00
|
用户名长度
|
2
|
XX
|
用户名
|
长度值
|
1字节表示1字符,例“YYY”
|
主机标志
|
2
|
10 00
|
主机名长度
|
2
|
XX
|
主机名
|
长度值
|
1字节表示1字符,例“YYY”
|
1-4) authreq包:r
内容
|
字节数
|
值
|
加密层
|
4
|
80 02 26 00
|
Licence标志
|
1
|
02,表示authreq,licence认证密钥
|
版本
|
1
|
4.0->02,5.x->03
|
本层长度
|
2
|
26 00
|
未知数据1
|
6
|
46 53 f9 65 f1 7b
|
Token长度
|
2
|
0a 00
|
Token值
|
0x0a
|
XX,10字节
|
Signature值
|
0x10
|
XX,16字节
|
1-5) authreq包:s
内容
|
字节数
|
值
|
加密层
|
4
|
80 00 00 00
|
Licence标志
|
1
|
15,表示authreq,licence认证密钥
|
版本
|
1
|
4.0->02,5.x->03
|
本层长度
|
2
|
3a 00
|
标志
|
2
|
01 00
|
Token长度
|
2
|
0a 00
|
Token值
|
0x0a
|
XX,10字节
|
标志
|
2
|
01 00
|
Hwid长度
|
2
|
14 00
|
Hwid值
|
0x14
|
XX,20字节
|
Signature值
|
0x10
|
XX,16字节
|
1-6) result包:r 不处理
内容
|
字节数
|
值
|
加密层
|
4
|
80 02 10 00
|
Licence标志
|
1
|
ff,表示result,licence认证密钥
|
版本
|
1
|
4.0->02,5.x->03
|
本层长度
|
2
|
10 00
|
未知数据1
|
4
|
07 00 00 00
|
未知数据2
|
4
|
02 00 00 00
|
未知数据3
|
4
|
04 00 00 00
|
2 加密解密模块:
在初始模块中对网络通信连接中所设定的加密信息提交给服务器。而RDP协议实现的加密形式是RSA/RC4。
当取得初始的加密、解密密钥(在发送初始连接信息后得到的),在初始连接结束后,客户端需要发送系统登录的初始信息,用以验证客户端加密、解密 的正确性。此后经过licence认证,通过认证后,所有的加密数据都经加密解密层处理。同时,密钥需要保存,因为加密数据包需要连续的正确加密或解密才能得到正确的数据。
3 图形处理模块
在图形处理中,客户端将所有的事件转换为固定格式的网络数据发送到服务器,服务器将处理的结果以图片形式发回服务器。在图形处理模块内部又分了较多的层次,叙述下面:
3-1) 第一级层次
内容
|
字节数
|
值
|
层内数据长度
|
2
|
XX
|
第一级类型标记
|
2
|
17 00 代表具体数据,0000时跳过后4字节
|
基本通道号
|
2
|
ea 03,固定
|
基本通道号
|
2
|
ea 03,固定(share?)
|
未知数据1
|
2
|
01 00
|
网络包顺序号
|
2
|
XX
|
此后数据长度
|
2
|
XX
|
具体数据类型
|
1
|
见说明
|
数据压缩类型
|
1
|
00 不压缩
|
数据压缩长度
|
2
|
00
|
具体数据类型说明:
值
|
含义说明
|
2
|
图形更新
|
27
|
鼠标指针操作
|
34
|
响铃
|
38
|
登录信息
|
47
|
断开重连提示
|
3-2) 图形更新:前2字节是更新的类型
值
|
含义说明
|
0
|
画图命令
|
1
|
位图
|
2
|
调色板
|
3
|
同步,锁定
|
3-2-1) 画图命令:其后是若干组画图命令
内容
|
字节数
|
值
|
未知数据1
|
2
|
XX
|
画图命令组数
|
2
|
XX
|
未知数据2
|
2
|
XX
|
每组画图命令
|
XX
|
|
说明:对于每一组命令,他们都取相应的系统状态,根据具体的情况进行处理。特别说明的是,颜色值是固定的3字节,根据深度值取相应的就可以。
3-2-2) 位图:前2字节是图片的数量。其后是图片数据,取出后画图片。
每一张图片的结构:
内容
|
字节数
|
值
|
图片水平左坐标
|
2
|
XX
|
图片垂直上坐标
|
2
|
XX
|
图片水平右坐标
|
2
|
XX
|
图片垂直下坐标
|
2
|
XX
|
图片水平点数
|
2
|
XX
|
图片垂直点数
|
2
|
XX
|
图片点深度值
|
2
|
XX
|
图片压缩标志
|
2
|
00 表示不压缩
|
压缩数据长度
|
2
|
XX
|
压缩数据段内容段据2-1
|
XX
|
XX
|
压缩数据段内容:compress & 0x400 为真时size=压缩数据长度,其后只有数据
内容
|
字节数
|
值
|
未知数据1
|
2
|
XX
|
压缩数据长度
|
2
|
XX
|
行长度
|
2
|
XX
|
final_size
|
2
|
XX
|
压缩数据内容
|
XX
|
XX
|
3-2-3) 调色板:用服务器传过来调色板代替系统的调色板。当256色时才有
内容
|
字节数
|
值
|
未知数据1
|
2
|
XX
|
颜色组数
|
2
|
一般是256,即00 001
|
未知数据2
|
2
|
XX
|
调色颜色值
|
3倍
|
每组值3字节,分别为红绿蓝色值
|
3-3) 鼠标指针操作
内容
|
字节数
|
值
|
操作类型
|
2
|
见说明
|
空位
|
2
|
XX
|
鼠标指针操作类型说明:
值
|
含义说明
|
1
|
取初始值
|
3
|
移动
|
6
|
新状态
|
7
|
缓存
|
3-3-1) 鼠标指针操作取初始值处理:当是00 00时设鼠标为不可见状态。
3-3-2) 鼠标指针操作移动处理:将鼠标移动到指定位置
内容
|
字节数
|
值
|
鼠标移动目标水平位置
|
2
|
X值
|
鼠标移动目标垂直位置
|
2
|
Y值
|
3-3-3) 鼠标指针操作新状态处理:创建新状态到鼠标状态缓存,并设置状态。
内容
|
字节数
|
值
|
鼠标缓存号
|
2
|
新的鼠标状态缓存号
|
水平位置
|
2
|
X值
|
垂直位置
|
2
|
Y值
|
宽度
|
2
|
XX
|
高度
|
2
|
XX
|
掩码长度
|
2
|
XX
|
数据长度
|
2
|
XX
|
掩码值
|
掩码长度
|
XX
|
数据值
|
数据长度
|
XX
|
3-3-4) 鼠标指针操作缓存处理:设置鼠标为系统已存的状态号的状态。
内容
|
字节数
|
值
|
鼠标缓存号
|
2
|
已存在的鼠标状态缓存号
|
3-4) 响铃:直接系统响铃发声处理
3-5) 登录信息:忽略,跳过
3-6) 断开重连提示:忽略,跳过
4打印数据模块
RDP协议提供本地打印机映射到服务器功能。在用户通过终端连接服务器并映射本地打印机后,可在远程主机上使用本地的打印机。客户端需要将本地打印机的型号传送给服务器,只有当前的服务器含有此打印机型号驱动时,打印机才会映射成功,在通道建立之后,对于打印机映射还需要信息交互确认。
服务器把需要打印的数据发送到打印机所在的网络连接终端,通过单独的虚拟通道传送到客户端,由客户端负责打印数据的处理。在终端连接初始建立时,需要发送映射本地打印机的请求,服务器接受映射后,客户端应申请相应的虚拟通道以进行打印数据的相关操作。将要打印的数据在网络传输中,是以PRN格式存放的。在用本地映射的打印机进行打印工作时,需要对打印机进行相应的连接,打印数据以PRN的形式从服务器发送到客户端,客户端只要把他们直接输出到打印机端口即可打印。对于打印的数据及其网络协议本身的控制信息需要客户端能够正确的分离、操作。
4-1) 本地设备操作说明:设备的每一个任务操作,服务器都会发送请求,当任务操作结束时,需要客户端正确回复确认。对于设备的每一次具体任务,都需要首先创建任务,当得到确定的答复以后才可能继续任务。任务创建后执行具体的内容。设备的功能操作又分读、写和控制;对于每一种功能操作,任务数据分开始、传输中和结束三种。需要顺序传送。每一小段数据传输结束后需要回复确认。当任务结束后,需要回复确认。
4-2) 任务请求通用结构:
内容
|
字节数
|
值
|
层内数据长和标志
|
8
|
XX
|
任务标志
|
4
|
见说明
|
ASCII信息
|
4
|
IRDr
|
设备标识
|
4
|
01 00 00 00 ---打印机设备
|
设备号
|
4
|
00 00 00 00 ---创建时为空值
|
赋予的ID号
|
4
|
01 00 00 00
|
设备操作主类型
|
4
|
见说明
|
设备操作次类型
|
4
|
00 00 00 00 ---打印机为空值
|
输出操作数据长度
|
4
|
XX
|
输入操作数据长度
|
4
|
00 00 00 00 ---打印机为空值
|
请求标志
|
4
|
00 00 00 00
|
未知数据1
|
20
|
XX
|
具体操作数据
|
XX
|
XX
|
设备操作主类型说明:
00 00 00 00
|
02 00 00 00
|
03 00 00 00
|
04 00 00 00
|
0e 00 00 00
|
创建操作
|
结束操作
|
读操作
|
写操作
|
控制操作
|
4-3) 各请求说明:对于“传输中”任务和“传输结束”任务,在任务标志后直接是“具体操作数据”,无其他数据;对于“传输控制”任务,无“具体操作数据”。
4-4) 任务确认通用结构
内容
|
字节数
|
值
|
层内数据长和标志
|
8
|
15 00 00 00
|
任务标志
|
4
|
00 00 03 00
|
ASCII信息
|
4
|
ICDr
|
设备标识
|
4
|
01 00 00 00 ---打印机设备
|
赋予的ID号
|
4
|
01 00 00 00
|
操作结果
|
4
|
见说明
|
接收操作数据长度
|
4
|
打印机是“输出操作数据长度”
|
回复数据
|
4
|
00,打印机为空值
|
操作结果说明:
00 00 00 00
|
0d 00 00 00
|
10 00 00 c0
|
22 00 00 c0
|
操作成功
|
无效参数
|
无效设备请求
|
存取拒绝
|
5 声音回放模块
RDP协议是提供声音回放功能。声音数据通过单独的虚拟通道传送,在初始连接时需要申请声音回放模式,当服务器接受声音回放模式后,应申请相应的虚拟通道以传送声音。
为在本地播放声音,服务器会对本地的声卡设置情况和状态进行询问,当得到合适的答复后,服务器才确认声音数据能够正常回放。关于声卡的确认在终端登录前完成。
声音数据是以wave格式传送过来的,当终端在使用过程中有声音回放请求时,服务器便将声音数据以wave格式映射到网络连接中,在客户端通过声音虚拟通道正确分离声音数据后,将其直接输出到声卡,即可实现声音回放。对声卡的设置,声音数据的属性调整等都通过网络映射到本地,需要终端程序能够正确的分离、响应。
5-1) 网络实现说明:服务器将声音数据分段发送处理。当有一段声音数据需要传送时,服务器首先发送接收通知,然后是具体的声音数据,数据包中有顺序传送标志:开始,进行,结束。数据接收通知中包含声音数据的格式,标签,索引等信息。在一段数据结束时,需要接收数据处理完毕的反馈信息。
5-2) 数据接收通知结构:
内容
|
字节数
|
值
|
层内数据长
|
4
|
10 00 00 00
|
标志
|
4
|
03 00 00 00
|
操作标志
|
1
|
02 表示准备接收
|
声音数据网络标志
|
1
|
20
|
数据长度
|
2
|
本段声音数据的长度
|
声音数据片标记
|
2
|
XX
|
声音数据格式
|
2
|
09 00
|
声音数据段索引
|
1
|
00到ff间循环
|
未知数据1
|
1
|
Fe
|
未知数据2
|
2
|
8b 00
|
未知数据3
|
4
|
各不相同
|
5-3) 声音数据接收反馈结构:
内容
|
字节数
|
值
|
层内数据长
|
4
|
08 00 00 00
|
标志
|
4
|
03 00 00 00
|
操作标志
|
2
|
05 00 表示接收反馈
|
其后数据长度
|
2
|
04 00
|
空位
|
2
|
00 00
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
### 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)** 是由微软开发的一种专用于远程桌面连接的技术标准。它允许用户通过网络连接到另一台计算机上,并以图形界面的方式操作这台...
### NC环境中的RDP协议解析 #### 一、NC环境基础介绍 ##### 1.1 基本概念与工作原理 网络计算机(Network Computer,简称NC),是一种依赖网络提供大部分资源来运行的终端计算机。它摒弃了传统PC中的硬盘、软盘...
开源项目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协议由多个子组件组成,如输入、输出、会话管理等,这些都可能在这个文件中找到。 4. **orders.c**:RDP订单(Orders)是RDP中用于描述图形操作的一种编码方式,比如绘制文本、线条、矩形等。这个文件应该实现了...
另一方面,没有安全的开源RDP协议实现。 最后,我想构建一个高度安全,跨平台和高度可定制的客户端。 安装 要将rdp-rs用作项目中的库,请将以下内容添加到Cargo.toml : [dependencies] rdp-rs = "0.1.0" 您可以...
1. **协议理解与解析**:深入理解RDP协议的工作原理是开发的基础。这包括但不限于如何建立连接、数据传输方式等。 2. **安全机制**:RDP框架的安全性至关重要。开发过程中需要考虑加密算法的选择、认证机制的设计等...
在C++和C#中实现RDP客户端功能涉及多个关键知识点,包括网络通信、协议解析和图形界面设计。 1. **网络通信基础**:RDP客户端首先需要与远程服务器建立TCP连接。这涉及到套接字编程,理解TCP/IP协议栈的工作原理,...
RDP(Remote Desktop Protocol)是微软提供的一种远程桌面连接协议,允许用户通过网络访问和控制远程计算机。在处理RDP文件时,有时我们需要在其中设置密码以便安全地进行远程访问。RDP文件实际上是一个文本文件,...
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协议提供了实验平台。