一、前言
windows从NT开始提供终端服务,它是微软买来的网络协议技术(Citrix),服务器端要安装、配置,客户端要连接程序。终端服务使任何一台有权限的终端机,用已知的账号登录服务器,可以使用账号内的资源,包括软件,硬件资源;同时,在协议升级后,客户端连接后可以使用本地的资源,包括本地打印机、声音本地回放,本地磁盘资源和本地硬件接口。所有的计算都在服务器端进行,客户端只需要处理网络连接、接收数据、界面显示和设备数据输出。
目前,关于RDP服务的linux客户端程序有winconnect,linrdp,rdesktop,前两个没有源码,但redsktop已经由原来的个人开发后公开代码演变成现在的项目组开发。由于项目的跨平台开发需要,我们在开始时进行过单独的协议破解工作,破解后,我们的程序在原来的RDP4.0基础上扩展到5.1,实现了16位颜色,声音本地回放, 映射本地打印机。对于当前的终端机,这些功能完全满足需要,因此其他功能暂不便破解实现。为防患RDP协议的升级而影响我们破解而得的终端程序的功能性,需要对RDP协议的变化进行跟踪,对et-rdesktop进行优化、完善。鉴于当前的工作安排,将跟踪redsktop项目的进展,以提炼功能为我所用和完善现有程序。
二、概述
1 版本功能说明:
RDP协议在终端服务推出后已有四个版本,4.0、5.0、5.1、5.2。一般来说,版本是根据windows的版本确定的。
从客户端的角度来说,5.X版本间提供的功能差别不是很大,相对于4.0版本,它提供了用户带密码直接登录、客户端驱动器资源映射、客户端音频回放、最高24位色显示和符合FIPS加密级别连接。
另外,从4.0协议开始变提供的客户羰功能有:高、中、低三种数据加密级别,客户端自定义初始登录环境,客户端打印机映射,客户端LPT端口映射,客户端com端口映射,剪贴板映射,客户登录的个性化设置(包括键盘、显示界面大小等)。
2、协议层次说明:
通过破解研究,我们掌握了RDP协议的基本层次结构。基本上,RDP协议的每一层次上都标示出其层内的数据长度值。
对于层次划分,主要是指RDP协议网络功能数据传送时通常都包含的各层次,而对于各层次内所实现的单层次连接等功能将做为单独的模块来进行阐述。
网络连接层:RDP协议建立在TCP/IP协议之上,由于传输的数据量比较大,因此在协议的底层首先定义一层网络连接层。它定义了一个完事的RDP数据逻辑包,以避免由于网络包长度过长而被分割使数据丢失。
ISO数据层:在网络连接层之上是ISO数据层,它表示RDP数据的正常连接通信。
虚拟通道层:在ISO数据层之上,RDP协议定义一个虚拟通道层,用以拆分标示不同虚拟通道的数据,加快客户端处理速度,节省占用网络接口的时间。
加密解密层:在虚拟通道层之上,RDP定义一个数据加密解密层。此层用于对所有的功能数据进行加密、解密处理。
功能数据层:在加密解密层之上是功能数据,画面信息,本地资源转换,声音数据,打印数据等所有的功能数据信息都在此层进行处理。另外,根据数据类型的不同,这些数据都有各自不同层次的分割,他们的内部层次结构将在各个功能模块中进行阐述。
3 其它说明:
本协议解析中所提到的各层次结构都是指RDP功能数据正常传送时的各底层结构,在功能数据传送前的各层次的建立连接过程及其结构、实现都归于模块实现来进行说明。
对于服务器端的各种设置以及个版本间的内部实现差异请看RDP帮助文档,以及rdpwin开发文档。
4 连接过程说明:
1) 客户端连接服务器
2) ISO数据层建立连接
3) 发送初始协议相关信息,接收加密、解密密钥
4) 虚拟通道申请
5) 加密形式发送客户端系统信息,同时验证加密协议
6) 平台软件证书验证
7) 各功能建立连接,各功能数据传输,功能实现
三、网络层次:
1 网络连接层:
在RDP协议网络实现连接中,本层的数据格式是固定的。
内容 |
协议版本号 |
保留 |
此逻辑包长度 |
字节数 |
1 |
1 |
2 |
值 |
当前版本皆是3 |
0 |
逻辑长度,从版本号开始到本包结束 |
2 ISO数据层:
在RDP功能数据网络传输中,本层的数据格式是固定的。
内容 |
单层数据长度 |
ISO包类型 |
标志 |
字节数 |
1 |
1 |
1 |
值 |
2,从下字节开始计算 |
0xf0,表示数据 |
0x80 |
3 虚拟通道层:
虚拟通道层用于在正常的网络连接数据之上,中个虚拟通道的功能数据。此层次的连接另见初始连接模块与通道申请模块,在此只说明正常数据连接时的层次结构。
1) 结构信息:
内容 |
类型 |
虚拟通道个数 |
虚拟通道号 |
标志 |
字节数 |
1 |
2 |
2 |
1 |
值 |
0x64/0x68 |
0x0001 |
0x03eb至0x03ee |
0x70/0xf0 |
2) 类型说明:
0x64:客户端发送数据
0x68:客户端接收数据
3) 用户号说明:
本次连接的用户号,服务器发送的是0x0001;客户端所发送的值是初始连接时请示通道后服务器同意开通的虚拟个数。
4) 虚拟通道号说明:
虚拟通道号是本层次以上所发送的功能数据所在的虚拟通道号,其由初始连接通道申请建立时确定。
5) 标志说明:
客户端发送的标志为0x70;服务器端发送的标志,当功能数据是图像是(由通道号识别),其值为0x70,当功能数据是其它数据时,其值为0xf0。
4 加密解密层:
加密解密层用于对网络连接中所发送、接收的数据进行加密、解密。为保证数据和系统的安全性,对网络数据进行加密传输是比较常用且必然的,RDP协议在此层对实际的功能数据进行加密。
1) 结构信息:
内容 |
单层及层上数据总长度 |
加密标志 |
未知标志 |
数字签名 |
字节数 |
1-2 |
2 |
2 |
8 |
值 |
从下字节开始计算 |
0x0800 |
0x1000/0x0203 |
顺序取得 |
2) 总长度说明:
若长度大于0x7f,则长度以两字节表示,并按位与0x8000。这是由于版本升级赞成的格式不统一,长度不定,当前版本认为长度值不大于0x0fff(4095)因此只用长度值并按位与0x8000实现版本兼容,在版本升级后会以0x8x表示长度值的字节数,其中8表示非1字节,x表示具体的字节个数。
3) 加密标志说明:
RDP协议要求在正常的功能连接实现之前,首先licence认证,其标志为0x8xxx,且其后数据不同于正常功能数据传输式的加密层格式,可以视licence认证为加密解密层的建立连接过程。另外功能数据的加密、解密的密钥是在初始连接时获得的,而加密解密功能的实现由加密、解密模块阐述。
4) 未知标志说明:
服务器端发送过来的未知数据有两种,目前不知其意,客户端在发送数据时将其置为0x0000值。
5) 数字签名说明:
对所有的加密数据在此放置8字节数字签名。其值由RC4会话键值和功能数据经过SHA运算和MD5运算得到。
5 功能数据层:
功能数据是客户端与服务器进行交互的真正数据。他们都有各自固定格式,连接、控制方式,具体情况见各功能模块的说明。
根据当前我们所掌握的信息,RDP协议将图像信息、声音信息、设备信息、剪贴板内容都各自以单一的虚拟通道进行传送,而打印机映射,磁盘映射,端口映射都做为设备信息的内容进行处理。限于当前左上角工作和项目工作的限度,设备信息中只考虑了打印机映射的部分,对于打印机信息与其他的设备相关的信息没有进行有效隔离区分,而本协议说明中相关的连接信息、数据传送都只认为是打印机映射的内容。
四、各连接模块说明:
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 |
4 系统初始连接模块:
当通道申请各部分通过后,开始系统登录的初始连接。从此数据包开始,所以虚拟通道层以上的网络数据都需要加密,详细的加密功能实现请参见加密模块。登录的网络信息结构如下:
内容 |
字节数 |
值(字节反存) |
加密层及以下 |
XX |
XX |
空闲字节 |
4 |
0x00000000 |
自动登录标志 |
4 |
正常:0x33,自动:0x28 |
域名长度 |
2 |
若空为0,有值则乘2 |
用户名长度 |
2 |
若空为0,有值则乘2 |
密码长度 |
2 |
若空为0,有值则乘2 |
登录程序长度 |
2 |
若空为0,有值则乘2 |
登录路径长度 |
2 |
若空为0,有值则乘2 |
域名值 |
域名长度+2 |
2字节反存1字符,最后为2字节为0x0000 |
用户名值 |
用户名长度+2 |
2字节反存1字符,最后为2字节为0x0000 |
密码字符值 |
密码长度+2 |
2字节反存1字符,最后为2字节为0x0000 |
登录程序名称 |
登录程序长度+2 |
2字节反存1字符,最后为2字节为0x0000 |
登录路径值 |
登录路径长度+2 |
2字节反存1字符,最后为2字节为0x0000 |
5 图形连接模块:
在图形数据发送之前,服务器需要对此功能模块验证,验证内容是所有与图形相关的信息,包括鼠标设置、键盘输入、字体类型、画图命令格式、图形显示的各种类型。
根据已破解的信息显示,RDESKTOP原来并没有正确的赋值,因为它的返回值是没有固定的,对于服务器发送来的信息没有处理,而服务器在其关于图形方面的参数设置询问没有得到正确的回答时,则以固定的服务器端的参数进行设置。
5-1) 连接过程说明:服务器端首先发送关于图形方面的基本参数设置,客户端应该对这些设置进行反馈。此后rdesktop的处理是顺序发送同步信息,两个控制信息包,一个输入信息包,两个字体信息包;同时顺序接收一个同步信息包,两控制信息包,一个未知信息包;但redsktop并没有对接2收的信息包进行处理。
5-2)基本参数设2置信息包结构:
内容 |
字节数 |
值(字节反存) |
加密层及以下 |
XX |
XX |
层后数据长度 |
2 |
XX |
数据类型标志 |
2 |
11 00,表示是图形信息连接确认 |
基本通道号 |
2 |
ea 03,固定 |
基本通道号 |
2 |
ea 03,固定(share?) |
未知数据1 |
2 |
01 00 |
ASCII信息长度 |
2 |
XX |
基本参数长度 |
2 |
XX |
ASCII信息 |
长度值+1 |
52 44 50 00,r->“RDP”,s->“MSTSC” |
参数信息 |
2 |
r->0b 00,s->0d |
空位 |
2 |
30或00 |
详细各组参数 |
组数 |
内容XX |
5-3) 详细参数信息组类别:
每个类型的数据前2字节为类型,然后是长度,数据。以接收到优先作例介绍。
类型值 |
说明 |
01r |
通用类型(general) |
02r |
位图类型(bitmap) |
03r |
命令(order) |
04 |
位图缓存(bitmap cache) |
05 |
控制(control) |
07 |
活动(active) |
08r |
指针(pointer) |
09r |
共享(share) |
0ar |
颜色缓存(color cache) |
0c |
未知 |
0dr |
未知 |
0e |
未知 |
10 |
未知 |
12r |
未知 |
14r |
未知 |
16r |
未知 |
40 |
未知 |
00r |
未知 |
5-3-1) 通用类型(general->01)
内容 |
字节数 |
值(字节反存) |
系统主类型 |
2 |
01 00,OS major type |
系统次类型 |
2 |
03 00,OS minor type |
协议版本号 |
2 |
02 00,protocol version |
空数据1 |
2 |
00 00 |
压缩类型 |
2 |
00 00不压缩 |
空数据2 |
2 |
1d 04 |
更新属性 |
2 |
00 00 |
共享属性 |
2 |
00 00 |
压缩级别 |
2 |
00 00 |
空数据3 |
2 |
01 01 |
5-3-2) 位图类型(bitmap->02)
内容 |
字节数 |
值(字节反存) |
最佳颜色深度 |
2 |
协商值 |
1颜色深度 |
2 |
01 00 |
2颜色深度 |
2 |
01 00 |
3颜色深度 |
2 |
01 00 |
桌面宽度 |
2 |
width |
桌面高度 |
2 |
height |
空位1 |
2 |
00 00 |
允许调整大小 |
2 |
01 00 |
位图压缩 |
2 |
01 00 |
未知数据1 |
2 |
00 00 |
未知数据2 |
2 |
01 00 |
空位2 |
2 |
00 00 |
5-3-3) 命令(order->03)
内容 |
字节数 |
值(字节反存) |
Terminal desc1 |
16 |
0值 |
Terminal desc2 |
4 |
10 42 0f 00 |
缓存X间隔 |
2 |
01 00 |
缓存Y间隔 |
2 |
14 00 |
未知数据1 |
2 |
00 00 |
最大命令级别 |
2 |
01 00 |
字体数目 |
2 |
00 00 |
容量标志 |
2 |
22 00 |
命令支持格式 |
32 |
另见 |
文本容量标志 |
2 |
a1 06 |
未知数据2 |
6 |
00 00 40 42 0f 00 |
桌面缓存大小 |
4 |
40 42 0f 00 |
未知数据3 |
4 |
01 00 00 00 |
未知数据4 |
4 |
00 00 00 00 |
命令支持格式说明:共32个标志,只对已知标志进行说明。
字节位置,0-31 |
值含义,1代表支持,0代表不支持 |
0 |
Dest blt |
1 |
Pat blt |
2 |
Screen blt |
3 |
Required for memblt |
8 |
Line1 |
9 |
Line2 |
10 |
Rect |
11 |
Desktop save |
13 |
Memblt |
14 |
Triblt |
22 |
Polyline |
27 |
Text2 |
5-3-4) 位图缓存(bitmapcache->04)
内容 |
字节数 |
值(字节反存) |
未使用数据1 |
24 |
0值 |
Entries |
2 |
58 02 |
Max cell size |
2 |
00 01 |
Entries |
2 |
2c 01 |
Max cell size |
2 |
00 04 |
Entries |
2 |
06 01 |
Max cell size |
2 |
00 10 |
5-3-5) 控制(control->05)
内容 |
字节数 |
值(字节反存) |
Control capability |
2 |
00 00 |
Remote detach |
2 |
00 00 |
Control interest |
2 |
02 00 |
Detach interest |
2 |
02 00 |
5-3-6) 活动(activer->07)
内容 |
字节数 |
值(字节反存) |
Help key |
2 |
00 00 |
Help index key |
2 |
00 00 |
Extended help key |
2 |
00 00 |
Window active |
2 |
00 00 |
5-3-7) 指针(pointer->08)
内容 |
字节数 |
值(字节反存) |
Color pointer |
2 |
01 00 |
Cache size |
2 |
19 00 |
未知数据1 |
2 |
19 00 |
5-3-8) 共享(share->09)
内容 |
字节数 |
值(字节反存) |
基本通道号 |
2 |
ea 03 |
未知数据1 |
2 |
7d e1 |
5-3-9) 颜色缓存(colorcache->0a)
内容 |
字节数 |
值(字节反存) |
缓存大小 |
2 |
06 00 |
未知数据1 |
2 |
7d e1 |
5-3-10) 未知类型->d 收到:
内容 |
字节数 |
值(字节反存) |
未知数据1 |
12 |
35 00 00 00 a1 06 00 00 40 42 0f 00 |
未知数据2 |
12 |
40 42 0f 00 44 e6 0a ba 93 53 19 ba |
未知数据3 |
12 |
08 60 03 e1 6a 05 1a ba 4c e6 0a ba |
未知数据4 |
12 |
4c a4 7d e1 08 a0 7d e1 01 00 00 00 |
未知数据5 |
12 |
08 a4 7d e1 00 00 00 00 44 e6 0a ba |
未知数据6 |
12 |
54 f2 19 ba 08 a0 7d e1 38 e6 0a ba |
未知数据7 |
12 |
00 00 00 00 08 00 0a 00 01 00 19 00 |
5-3-11) 未知类型->12收到:
内容 |
字节数 |
值(字节反存) |
未知数据1 |
2 |
01 00 |
未知数据2 |
2 |
00 00 |
5-3-12) 未知类型->14收到:
内容 |
字节数 |
值(字节反存) |
未知数据1 |
2 |
02 00 |
未知数据2 |
2 |
00 00 |
5-3-13) 未知类型->16收到:
内容 |
字节数 |
值(字节反存) |
未知数据1 |
12 |
01 00 00 00 6e 01 00 00 01 00 00 00 |
未知数据2 |
12 |
d0 07 40 bf 01 b0 83 bf 00 00 00 00 |
未知数据3 |
12 |
a4 e6 0a ba 5c db 4f 80 e6 01 00 00 |
6打印机映射连接模块:
RDP协议当前提供映射5个设备,在我们破解过程中并没有区分出他们的区别,在此视为单一处理。打印机的连接在系统登录前完成,以配置操作系统信息。
6-1) 连接过程说明
包序号 |
接收发送 |
字符 |
含义 |
1 |
R |
InDr |
设备初始连接通知,说明可以连接申请 |
2 |
S |
CCDr |
客户端连接申请 |
3 |
S |
CNDr |
客户端名称注册 |
4 |
R |
SPDr |
服务器提供的设备接口说明 |
5 |
R |
CCDr |
服务器设备申请确认 |
6 |
S |
CPDr |
客户端设备提供的接口说明 |
7 |
S |
DADr |
客户端打印机映射申请 |
8 |
R |
drDr |
服务器打印机设备映射成功确认 |
6-2) 设备初始连接通知:
内容 |
字节数 |
值(字节反存) |
层内数据长度 |
4 |
0x0000000c |
标志 |
4 |
03 00 00 00,表示控制信息 |
ASCII信息 |
4 |
InDr |
未知数据1 |
2 |
01 00,可能是最少个数 |
未知数据2 |
2 |
05 00,可能是最多个数 |
未知数据3 |
2 |
ff ff |
未知数据4 |
ff ff |
6-3) 客户端连接申请:
内容 |
字节数 |
值(字节反存) |
层内数据长度 |
4 |
0x0000000c |
标志 |
4 |
00 00 03 00,表示控制信息 |
ASCII信息 |
4 |
CCDr |
未知数据1 |
2 |
00 01,申请最少个数 |
未知数据2 |
2 |
00 05,申请最多个数 |
未知数据3 |
2 |
ff ff |
6-4) 客户端名称注册:
内容 |
字节数 |
值(字节反存) |
层内数据长度 |
4 |
XX |
标志 |
4 |
00 00 03 00,表示控制信息 |
ASCII信息 |
4 |
CNDr |
未知数据1 |
4 |
41 02或 63 00 |
未知数据2 |
2 |
bf 00 或 72 00 |
未知数据3 |
4 |
00 00 00 00 |
主机名长度 |
4 |
XX,字符2字节存储 |
主机名 |
长度 |
XX |
6-5) 服务器提供的设备接口说明:
内容 |
字节数 |
值(字节反存) |
层内数据长度 |
4 |
XX |
标志 |
4 |
03 00 00 00,表示控制信息 |
ASCII信息 |
4 |
SPDr |
设备个数 |
4 |
05 00 00 00 |
设备1标识 |
2 |
01 00 |
设备1信息长度 |
2 |
28 00,从标识开始计算 |
设备1中未知数据 |
4 |
内容见下表 |
4组设备信息 |
8 |
每组只有标识号变化,1可能表示有效0x 00 08 00 01 00 00 00 |
设备1中未知数据:
01 00 00 00 |
02 00 00 00 |
00 00 00 00 |
01 00 05 00 |
ff ff 00 00 |
00 00 00 00 |
03 00 00 00 |
00 00 00 00 |
00 00 00 00 |
6-6) 服务器设备申请确认:除标志反位存储外,其他都与6-2)中所说相同。
6-7) 客户端设备提供的接口说明:除标志反位存储、ASCII信息和设备1信息中第11字节值是5之外,其他都与6-2中所说相同。
6-8) 客户端打印机映射申请:
内容 |
字节数 |
值(字节反存) |
层内数据长度 |
4 |
XX |
标志 |
4 |
03 00 00 00,表示控制信息 |
ASCII信息 |
4 |
DADr |
设备个数 |
4 |
01 00 00 00 |
设备1标识 |
4 |
01 00 |
设备1句柄 |
4 |
|
设备1 ASCII信息 |
4 |
|
空位 |
4 |
|
此后数据长度 |
4 |
|
未知数据1长度 |
4 |
|
未知数据1 |
0x0a |
|
驱动打印机名长度 |
8 |
|
空位 |
4 |
|
驱动名称 |
XX |
|
打印机名称 |
XX |
6-9) 服务器打印机设备映射成功确认:
内容 |
字节数 |
值(字节反存) |
层内数据长度 |
4 |
XX |
标志 |
4 |
03 00 00 00,表示控制信息 |
ASCII信息 |
4 |
drDr |
设备句柄 |
4 |
01 00 00 00 |
空位 |
4 |
00 00 00 00 |
7 声音处理连接模块:
RDP协议需要单独的虚拟通道传递关于声音的数据。为了能够在本地播放声音,需要进行声音处理模块的连接,但只有要声音回放时才开始连接。连接的内容是:客户端对这些信息进行反馈,以在客户端与服务器之间确定相应的参数。
7-1) 连接过程说明:服务器首先发送一系列的关于声卡的设置参数,以及声音数据的网络格式信息,客户端对本地声卡进行测试并发回可支持的设置参数;服务器得到反馈后再发送测试数据,测试成功则反馈连接成功。
7-2) 声卡设置参数询问结构:
内容 |
字节数 |
值(字节反存) |
层内数据长 |
4 |
XX |
标志 |
4 |
03 00 00 00,表示控制信息 |
声音处理标志 |
1 |
07 表示声卡设置参数询问 |
未知数据1 |
1 |
00 |
此后数据长度 |
2 |
XX |
声音数据标志 |
4 |
07 00 00 00,表示此后是声卡参数 |
声音音量 |
4 |
f0 fa 8b 00 |
声音平衡量 |
4 |
E8 20 f3 77 |
UDP端口? |
2 |
5a ae |
声卡参数组数 |
2 |
XX |
未知数据2 |
1 |
ff |
状态值 |
2 |
05 00 |
未知数据3 |
1 |
76 |
XX组声卡参数 |
XX*18 |
XX |
声卡参数结构:
内容 |
字节数 |
值(字节反存) |
声道数 |
2 |
1或2 |
频率 |
4 |
|
nAvgBttesPerSec |
4 |
|
nBlockAlign |
2 |
|
wBitsPerSample |
2 |
|
cbSize |
2 |
7-3) 声卡设置参数反馈结构:
内容 |
字节数 |
值(字节反存) |
层内数据长 |
4 |
XX |
标志 |
4 |
03 00 00 00,表示控制信息 |
声音处理标志 |
1 |
07 表示声卡设置参数反馈 |
未知数据1 |
1 |
00 |
此后数据长度 |
2 |
XX |
声音数据标志 |
4 |
03 00 00 00,表示此后是声卡参数反馈 |
声音音量 |
4 |
80 4d 80 4d |
声音平衡量 |
4 |
00 00 00 00 |
UDP端口? |
2 |
04 0e? |
声卡参数级数 |
2 |
XX |
未知数据2 |
1 |
00 |
状态值 |
2 |
02 00 |
未知数据3 |
1 |
00 |
XX组声卡参数 |
XX*18 |
XX |
7-2) 声卡测试结构:
内容 |
字节数 |
值(字节反存) |
层内数据长 |
4 |
XX |
标志 |
4 |
03 00 00 00,表示控制信息 |
声音处理标志 |
1 |
06 表示声卡设置参数测试 |
未知数据1 |
1 |
23 |
此后数据长度 |
2 |
XX |
声音数据标志1 |
2 |
16 d4 |
声音数据标志2 |
2 |
00 04 |
测试数据 |
XX |
XX |
7-2) 声卡测试反馈结构:
内容 |
字节数 |
值(字节反存) |
层内数据长 |
4 |
08 00 00 00 |
标志 |
4 |
03 00 00 00 |
操作标志 |
2 |
06 00 表示接收反馈 |
其后数据长度1 |
2 |
04 00 |
声音数据标志1 |
2 |
16 d4 |
声音数据标志2 |
2 |
00 04 |
五、各功能模块说明:
任务标志说明:适用于所有非图形通道数据。
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时设鼠标为不可见状态。
内容 |
字节数 |
值 |
取初始值类型 |
2 |
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 |
声音数据段索引 |
1 |
00到ff之间循环,由通知信息取得 |
未知数据1 |
1 |
fe,由通知信息取得 |
5-3) 声音数据结构:
内容 |
字节数 |
值 |
层内数据长或标志 |
4 |
00 20 00 00 |
数据标志 |
4 |
1为开始,0为继续,2为结束 |
声音数据 |
XX |
XX |
六、rdpwin结构、数据流说明:
七、总结