Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1856738
  • 博文数量: 473
  • 博客积分: 13997
  • 博客等级: 上将
  • 技术积分: 5953
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 11:52
文章分类

全部博文(473)

文章存档

2014年(8)

2013年(38)

2012年(95)

2011年(181)

2010年(151)

分类: LINUX

2011-06-04 00:53:55

前言

概述

同络层次

各连接模块说明

各功能模块说明

rdpwin结构、数据流说明

总结

一、前言

windowsNT开始提供终端服务,它是微软买来的网络协议技术(Citrix),服务器端要安装、配置,客户端要连接程序。终端服务使任何一台有权限的终端机,用已知的账号登录服务器,可以使用账号内的资源,包括软件,硬件资源;同时,在协议升级后,客户端连接后可以使用本地的资源,包括本地打印机、声音本地回放,本地磁盘资源和本地硬件接口。所有的计算都在服务器端进行,客户端只需要处理网络连接、接收数据、界面显示和设备数据输出。

目前,关于RDP服务的linux客户端程序有winconnectlinrdprdesktop,前两个没有源码,但redsktop已经由原来的个人开发后公开代码演变成现在的项目组开发。由于项目的跨平台开发需要,我们在开始时进行过单独的协议破解工作,破解后,我们的程序在原来的RDP4.0基础上扩展到5.1,实现了16位颜色,声音本地回放, 映射本地打印机。对于当前的终端机,这些功能完全满足需要,因此其他功能暂不便破解实现。为防患RDP协议的升级而影响我们破解而得的终端程序的功能性,需要对RDP协议的变化进行跟踪,对et-rdesktop进行优化、完善。鉴于当前的工作安排,将跟踪redsktop项目的进展,以提炼功能为我所用和完善现有程序。

二、概述

1 版本功能说明:

RDP协议在终端服务推出后已有四个版本,4.05.05.15.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

0x03eb0x03ee

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
不定
从下一字节开始计算
0xd00xe0
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组参数标志都是0x308个参数值的标志都是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
145lincence标志升级
未知数据1
2
0x0008
窗口宽度、高度
4
宽度,高度
未知数据2
4
0xca010xaa03
Keylayout
4
0x00000409
客户端系统组件数
4
41921952462
客户端机器名
32
2字节存储1个字符
未知数据3
12
0x040x000x0c各四个字节
未知数据4
64
都是0
未知数据5
8
01 ca 01 00 00 00 00 00
图形颜色位(最大值)
2
2416158
未知数据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->RDP40x80000002->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 00r->RDP”,s->MSTSC
参数信息
2
r->0b 00s->0d
空位
2
3000
详细各组参数
组数
内容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 00OS major type
系统次类型
2
03 00OS minor type
协议版本号
2
02 00protocol 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) 位图缓存(bitmap cache->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) 颜色缓存(color cache->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
阅读(873) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~