關於RDP協議的分析(一) - Linux論壇 - 計世網論壇 - Powered by Discuz!

chief1985發表於2008-10-09

導讀:

關於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連線



本文轉自
http://bbs.ccw.com.cn/viewthread.php?tid=761244

相關文章