關於RDP協議的分析(一) - Linux論壇 - 計世網論壇 - Powered by Discuz!
導讀:
關於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連線
-------------- 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連線
相關文章
- Discuz!論壇搭建
- Linux伺服器---論壇discuzLinux伺服器
- discuz論壇 模板修改
- Discuz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 論壇搬家記錄
- Discuz!! 論壇搬家記錄
- 如何安裝discuz論壇,discuz安裝步驟
- 關於實現論壇的回覆評論
- 雲虛擬主機搭建Discuz論壇示例
- 計算機網路 王道論壇1計算機網路
- 計算機網路 王道論壇2計算機網路
- 【Microsoft Azure 的1024種玩法】三.基於Azure雲平臺構建Discuz論壇ROS
- 可以發外鏈的論壇,哪些論壇可以發外鏈?
- 基於函式計算一鍵部署簡易論壇函式
- 程式設計交流論壇成立程式設計
- php E58論壇_有哪些比較不錯的論壇原始碼的網站?PHP原始碼網站
- 基於SSM的校園論壇網站系統畢業設計論文【範文】SSM網站
- 一長篇論述CSocket,CAsyncSocket 的論壇文章(轉)
- 【修羅論壇】xiuno論壇新增登錄檔單項流程
- 聚焦 突破 協作,高博醫學論壇-華南造血幹細胞移植論壇成功舉辦
- 在LNMP環境下搭建Discuz論壇,開啟https,全站綠鎖LNMPHTTP
- java 論壇模組設計方案Java
- 論壇升級公告
- 論壇幫助文件
- 畢業論文(基於jsp的論壇開發)(含原始檔)JS
- Nginx網站服務LNMP搭建論壇Nginx網站LNMP
- 分享一個小清新的論壇原始碼原始碼
- 記一次 .NET 某券商論壇系統 卡死分析
- 各種技術論壇
- Kyligence秋季線上論壇
- 從零構建 Laravel 論壇一:序言Laravel
- 簡單的BBS論壇 資料庫設計資料庫
- 記一次 .NET 某資訊論壇 CPU爆高分析
- Discuz!論壇進行環境檢測時提示不支援fsockopen和pfsockopen函式函式
- 用全站 CDN 部署 Discourse 論壇
- Java爬取先知論壇文章Java
- 華北門戶帶論壇
- 自寫簡單英文論壇!
- 論壇預告|WAIC 2024騰訊論壇,邀你共話AI,智創未來AI
- “遊戲基地論壇”等網站被掛馬遊戲網站