导读:

关于RDP协议的分析(一)
关于RDP协议的分析和研究
                                        -------------- leadgenius

写这个一是便于学习,再就是与网友们共同讨论,有一些我也不确定的,只是我的理解,希望看到这篇文章的人进行指正,并给我来信谢谢。再一就是这里只有有关4.0版本的内容,希望有高手补充5.1/5.2的协议文档。

RDP是微软终端服务应用的协议,服务端基于win2000/winNT。协议基于T.128(T.120协议族)提供多通道通信。在客户端支持多种资源缓冲和图片数据的压缩处理。

本文的内容主要是对Rdesktop源代码的分析,应用rdp4.0协议,可与win2000/winNT通信,也可与win2003(rdp5.1)通信,但不具备rdp5.1协议的特性。

协议通过TCP/IP进行数据传输,在实际数据前进行了ISO/MCS/SEC三层的包装,ISO/MCS两层为多点并发式通信提供了可靠的传输保障,SEC层提供对RDP详细数据的加解密处理。各层在数据的前端加有一段数据头,用于对数据、传输的控制。具体的数据控制由STREAM类型的结构体管理(这种方法很灵活、易懂,可作为网络编程者的参考),不同的数据头由不同的结构成员管理,层次清晰。

RDP协议将终端虚拟环境中的设备映射为不同的数据包,将对设备的输入输出(I/O)重定向到网络句柄中,不同设备的数据按不同格式组织成为小的数据包,并将多个小数据包封装成为一个大的数据包通过网络一次性发出,对方将网络解收的数据进行分解成为小包并按设备数据的类型进行不同的处理。

另一个值得注意的是使用了T.128协议族的ASN.1 BER(基本编码规则)。我记得网上有一篇文章提到中国的程序员很多,可是会网络编程的不多,懂得基本编码规则的就少之又少。其实基本编码规则很简单,可以到网上查询一些有关T.128&T.129的文章来看一下,很有用的。有时间我会协议篇关于此的贴子。

如果有想学网络编程的朋友,可以看一下RDESKTOP这个软件的代码,能学到不少的东西。

一、    网络包控制结构(STREAM定义于 prase.h :2  typedef struct stream *)
结构用于对收到的TCP包的数据进行初期分解,按照不同的协议逐步将包中的RDP数据分离出来,为RDP数据的进一步分解做准备。

typedef struct stream
{
       unsigned char *p;
       unsigned char *end;
                unsigned char *data;
                unsigned int size;

/* Offsets of various headers */
        unsigned char *iso_hdr;
        unsigned char *mcs_hdr;
        unsigned char *sec_hdr;
        unsigned char *rdp_hdr;

} *STREAM;

结构包含:
    p指针:临时指针变量,用于计算定位。
    data指针:TCP/IP数据的起始位置,是申请的一段内存,只当数据尺寸大于size时,进行realloc增大,不缩小。
    size指针:TCP/IP数据的尺寸大小
    end指针:TCP/IP数据的结束位置
                                                    //以上是tcp数据管理变量
    iso_hdr指针:TCP/IP数据包中iso协议控制头的位置
    mcs_hdr指针:TCP/IP数据包中mcs协议控制头的位置
    sec_hdr指针:TCP/IP数据包中sec协议控制头的位置
    rdp_hdr指针:TCP/IP数据包中rdp协议控制头的位置

主要结构只创建一遍(in & out),结构数据及缓冲由tcp.c模块维护。

ISO控制头:7字节
    MCS控制头:8字节
    SEC控制头:0(如果已经获得许可证—通信协定)、4(未获许可)
或12(进行加密时)字节

由SEC头控制的数据段即是RDP的主要数据,一般进行了加密。

二、    TCP
负责维护与服务器的连接和数据。

一下STREAM结构的成员负责维护TCP数据:
p指针:临时指针变量,用于计算定位。
data指针:TCP/IP数据的起始位置,是申请的一段内存,只当数据尺寸大于size时,进行realloc增大,不缩小。
size指针:TCP/IP数据的尺寸大小
end指针:TCP/IP数据的结束位置

p指针的作用:
    在控制结构中,对于确定的发送数据和接收数据,其他各指针的含义和内容相对固定,而对于包中要计算、改动和提交到下一层处理的具体数据的定位工作就要靠p指针来完成。
    在prase.h中定义了大量的关于使用p指针的运算用于对协议头段的处理,并且在各层协议处理模块中使用p指针定位、区分处理过和未处理的数据。

Tcp_init():初始out结构的数据缓冲和data、size、end、p变量
Tcp_connect():建立网络连接并创建输入和输出数据控制结构(in & out)、网络句柄sock
Tcp_disconnect():关闭网络句柄sock
Tcp_send():发送TCP数据(out控制)到sock
Tcp_recv():接受定长TCP数据由sock到in,维护in结构缓冲,并调整in.tcp管理变量

三、    ISO
TCP传输之上,基于ISO头的定义,我在这里将简单的数据传输协定分为控制和数据两种,由PDU头段数据区分,主要是Type2。

Type1:控制PDU,长11字节,用于连接控制
    1字节:协议版本号 = 3
    2字节:保留
    3-4字节:包长度(由第一字节到包结束)
        5字节:数据偏移 = 6(ISO头段结束的下一位距本字节的偏移量)
    6字节:包类型 = ISO_PDU_CR = 0xE0(连接请求)
ISO_PDU_CC = 0xD0(连接建立)
ISO_PDU_DR = 0x80(中断请求)
ISO_PDU_ER = 0x70(错误)
        7-8字节:dst_ref = 0(忽略)
    9-10字节:src_ref = 0(忽略)
11字节:class = 0(忽略)

Type2:数据PDU,长度 = 数据长度 + 7字节,用于数据传输
    1字节:协议版本号 = 3
    2字节:保留
    3-4字节:包长度(由第一字节到包结束)
        5字节:数据偏移 =2(ISO头段结束的下一位距本字节的偏移量)
        6字节:包类型 = ISO_PDU_DT = 0xF0(数据传送)
        7字节:eot = 0x80
        ISO数据开始

Iso_init():初始out控制结构,预留ISO头段空间,并将iso_hdr指向头段位置
    Iso_send_msg():发送一个单一的控制消息数据包
    Iso_recv_msg():接收数据的头段,分析包类型调整in结构指向数据位置,并传回包类型
    Iso_send():填充ISO头段,并发送数据
    Iso_recv():接收ISO数据包,去处头段,调整in结构指向数据位置
    Iso_connect():建立ISO连接
    Iso_disconnect():中断ISO连接

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chief1985/archive/2008/10/09/3045424.aspx

关于RDP协议的分析(一)相关推荐

  1. 关于RDP协议的分析 附上RDP 协议初步分析.pdf文件

    关于RDP协议的分析和研究                                         -------------- leadgenius 写这个一是便于学习,再就是与网友们共同讨 ...

  2. 关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!

    导读: 关于RDP协议的分析(一) 关于RDP协议的分析和研究                                         -------------- leadgenius 写这 ...

  3. RDP 协议应用分析

    RDP 协议应用结构分析 基于 RDP 的应用一般应该包括三个部分:终端服务器.用户界面传输协议和客户端.其中用户界面传输协议允许客户机连接到终端服务器获取服务器上正在运行的应用程序的信息.客户端的显 ...

  4. rdesktop架构解析(RDP协议分析)

    转载自: http://blog.csdn.net/songbohr/article/details/5309650 本文立足于rdesktop的架构层次进行解析,算是抛砖引玉,国内对RDP协议深入解 ...

  5. Windows RDP协议 Fuzzing 漏洞挖掘研究

    基本介绍 本文描述了我在Fuzzing Windows RDP 客户端和服务端方面所做的一些尝试和挑战,以及Crsahs分析. Microsoft 的远程桌面协议 (RDP) 持续受到安全社区的关注. ...

  6. RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接

    今天在用terminal远程连接服务器时,总是连接不上,后来直接到服务器上查看,在事件里查看到错误日志:RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接. RDP,即远程桌面协 ...

  7. RDP协议简介与通讯数据加密等级及设置说明

    RDP协议简介  RDP是一个多层多虚通道通讯协议,它在一个TCP连接中虚拟出若干个通道,分别进行各种信息的传输.  各个层次数据包说明:  RDP层:RDP客户端任何的用户操作,都将形成RDP数据包 ...

  8. RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连

    今天在访问远程桌面的时候提示RDP 的 "DATA ENCRYPTION" 协议组件在协议流中检测到一个错误并且中断了客户机,于是参考了下面的文章设置了一下,一般是由于访问量过大或 ...

  9. 死磕RDP协议,从截图和爆破说起

    0x01 概述 RDP(远程桌面协议)可以说是 Windows 下面使用最为广泛的协议了,RDP 之于 Windows,就跟 SSH 之于 Linux 一样,只要是做协议分析以及网络安全研究,必然绕不 ...

最新文章

  1. WiresShark 使用方法
  2. android android:process=,关于android:Android-appprocess的使用
  3. arXiv热文解读 | 不懂Photoshop如何P图?交给深度学习吧
  4. 08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
  5. ES6新特性之map和reduce方法的使用
  6. 知乎上-翻车的笔记本
  7. raft算法与paxos算法相比有什么优势,使用场景有什么差异?
  8. “我不是个优秀的 Web 开发人员,我只是擅长搜索谷歌”
  9. mooc-IDEA 应用快捷键自动创建测试类--010
  10. 读msdn文档----五种提高SQL性能的方法
  11. 软件测试-测试用例的经典例子
  12. Struts2面试题大集合
  13. 武汉大学计算机学院夏桂松,武汉大学电子信息学院导师介绍:何楚
  14. java8新特性 函数式编程 Lamda
  15. As Giants Step In, Asustek Defends A Tiny PC
  16. 一年的网络学习经历小结
  17. 美团外卖订单小票打印规范
  18. 深入学习理论:VC维(VC dimensions)
  19. 中国视频监控市场进入高清时代
  20. 写给科研人:身体健康和好的心态缺一不可

热门文章

  1. Motion-based Detection and Tracking in 3D LiDAR Scans
  2. 工具篇:Git与Github+GitLib常用操作(不定期持续更新)
  3. 百草味爆发性增长的秘密:5%靠营销,95%靠产品
  4. 字典排序什么意思_字典序排序
  5. sklearn的分层抽样
  6. 云时代,有必要了解的华为云计算解决方案
  7. ps -aux | grep 用法详解
  8. JAVA和Python HmacSHA1 算法计算API签名的实现
  9. 对撞机_纪中3074_暴力?
  10. linux .trash,linux下trash代替rm