关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!
生活随笔
收集整理的這篇文章主要介紹了
关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
導(dǎo)讀:
關(guān)于RDP協(xié)議的分析(一)
?
關(guān)于RDP協(xié)議的分析和研究? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? -------------- leadgenius
? ? 寫這個(gè)一是便于學(xué)習(xí),再就是與網(wǎng)友們共同討論,有一些我也不確定的,只是我的理解,希望看到這篇文章的人進(jìn)行指正,并給我來信謝謝。再一就是這里只有有關(guān)4.0版本的內(nèi)容,希望有高手補(bǔ)充5.1/5.2的協(xié)議文檔。
RDP是微軟終端服務(wù)應(yīng)用的協(xié)議,服務(wù)端基于win2000/winNT。協(xié)議基于T.128(T.120協(xié)議族)提供多通道通信。在客戶端支持多種資源緩沖和圖片數(shù)據(jù)的壓縮處理。
本文的內(nèi)容主要是對Rdesktop源代碼的分析,應(yīng)用rdp4.0協(xié)議,可與win2000/winNT通信,也可與win2003(rdp5.1)通信,但不具備rdp5.1協(xié)議的特性。
協(xié)議通過TCP/IP進(jìn)行數(shù)據(jù)傳輸,在實(shí)際數(shù)據(jù)前進(jìn)行了ISO/MCS/SEC三層的包裝,ISO/MCS兩層為多點(diǎn)并發(fā)式通信提供了可靠的傳輸保障,SEC層提供對RDP詳細(xì)數(shù)據(jù)的加解密處理。各層在數(shù)據(jù)的前端加有一段數(shù)據(jù)頭,用于對數(shù)據(jù)、傳輸?shù)目刂啤>唧w的數(shù)據(jù)控制由STREAM類型的結(jié)構(gòu)體管理(這種方法很靈活、易懂,可作為網(wǎng)絡(luò)編程者的參考),不同的數(shù)據(jù)頭由不同的結(jié)構(gòu)成員管理,層次清晰。
RDP協(xié)議將終端虛擬環(huán)境中的設(shè)備映射為不同的數(shù)據(jù)包,將對設(shè)備的輸入輸出(I/O)重定向到網(wǎng)絡(luò)句柄中,不同設(shè)備的數(shù)據(jù)按不同格式組織成為小的數(shù)據(jù)包,并將多個(gè)小數(shù)據(jù)包封裝成為一個(gè)大的數(shù)據(jù)包通過網(wǎng)絡(luò)一次性發(fā)出,對方將網(wǎng)絡(luò)解收的數(shù)據(jù)進(jìn)行分解成為小包并按設(shè)備數(shù)據(jù)的類型進(jìn)行不同的處理。
? ? 另一個(gè)值得注意的是使用了T.128協(xié)議族的ASN.1 BER(基本編碼規(guī)則)。我記得網(wǎng)上有一篇文章提到中國的程序員很多,可是會(huì)網(wǎng)絡(luò)編程的不多,懂得基本編碼規(guī)則的就少之又少。其實(shí)基本編碼規(guī)則很簡單,可以到網(wǎng)上查詢一些有關(guān)T.128&T.129的文章來看一下,很有用的。有時(shí)間我會(huì)協(xié)議篇關(guān)于此的貼子。
? ? 如果有想學(xué)網(wǎng)絡(luò)編程的朋友,可以看一下RDESKTOP這個(gè)軟件的代碼,能學(xué)到不少的東西。
一、? ? 網(wǎng)絡(luò)包控制結(jié)構(gòu)(STREAM定義于 prase.h :2??typedef struct stream *)
結(jié)構(gòu)用于對收到的TCP包的數(shù)據(jù)進(jìn)行初期分解,按照不同的協(xié)議逐步將包中的RDP數(shù)據(jù)分離出來,為RDP數(shù)據(jù)的進(jìn)一步分解做準(zhǔn)備。
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;
結(jié)構(gòu)包含:
? ? p指針:臨時(shí)指針變量,用于計(jì)算定位。
? ? data指針:TCP/IP數(shù)據(jù)的起始位置,是申請的一段內(nèi)存,只當(dāng)數(shù)據(jù)尺寸大于size時(shí),進(jìn)行realloc增大,不縮小。
? ? size指針:TCP/IP數(shù)據(jù)的尺寸大小
? ? end指針:TCP/IP數(shù)據(jù)的結(jié)束位置
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //以上是tcp數(shù)據(jù)管理變量
? ? iso_hdr指針:TCP/IP數(shù)據(jù)包中iso協(xié)議控制頭的位置
? ? mcs_hdr指針:TCP/IP數(shù)據(jù)包中mcs協(xié)議控制頭的位置
? ? sec_hdr指針:TCP/IP數(shù)據(jù)包中sec協(xié)議控制頭的位置
? ? rdp_hdr指針:TCP/IP數(shù)據(jù)包中rdp協(xié)議控制頭的位置
? ? 主要結(jié)構(gòu)只創(chuàng)建一遍(in & out),結(jié)構(gòu)數(shù)據(jù)及緩沖由tcp.c模塊維護(hù)。
? ? ISO控制頭:7字節(jié)
? ? MCS控制頭:8字節(jié)
? ? SEC控制頭:0(如果已經(jīng)獲得許可證—通信協(xié)定)、4(未獲許可)
或12(進(jìn)行加密時(shí))字節(jié)
? ? 由SEC頭控制的數(shù)據(jù)段即是RDP的主要數(shù)據(jù),一般進(jìn)行了加密。
二、? ? TCP
負(fù)責(zé)維護(hù)與服務(wù)器的連接和數(shù)據(jù)。
? ? 一下STREAM結(jié)構(gòu)的成員負(fù)責(zé)維護(hù)TCP數(shù)據(jù):
p指針:臨時(shí)指針變量,用于計(jì)算定位。
data指針:TCP/IP數(shù)據(jù)的起始位置,是申請的一段內(nèi)存,只當(dāng)數(shù)據(jù)尺寸大于size時(shí),進(jìn)行realloc增大,不縮小。
size指針:TCP/IP數(shù)據(jù)的尺寸大小
end指針:TCP/IP數(shù)據(jù)的結(jié)束位置
p指針的作用:
? ? 在控制結(jié)構(gòu)中,對于確定的發(fā)送數(shù)據(jù)和接收數(shù)據(jù),其他各指針的含義和內(nèi)容相對固定,而對于包中要計(jì)算、改動(dòng)和提交到下一層處理的具體數(shù)據(jù)的定位工作就要靠p指針來完成。
? ? 在prase.h中定義了大量的關(guān)于使用p指針的運(yùn)算用于對協(xié)議頭段的處理,并且在各層協(xié)議處理模塊中使用p指針定位、區(qū)分處理過和未處理的數(shù)據(jù)。
Tcp_init():初始o(jì)ut結(jié)構(gòu)的數(shù)據(jù)緩沖和data、size、end、p變量
Tcp_connect():建立網(wǎng)絡(luò)連接并創(chuàng)建輸入和輸出數(shù)據(jù)控制結(jié)構(gòu)(in & out)、網(wǎng)絡(luò)句柄sock
Tcp_disconnect():關(guān)閉網(wǎng)絡(luò)句柄sock
Tcp_send():發(fā)送TCP數(shù)據(jù)(out控制)到sock
Tcp_recv():接受定長TCP數(shù)據(jù)由sock到in,維護(hù)in結(jié)構(gòu)緩沖,并調(diào)整in.tcp管理變量
三、? ? ISO
TCP傳輸之上,基于ISO頭的定義,我在這里將簡單的數(shù)據(jù)傳輸協(xié)定分為控制和數(shù)據(jù)兩種,由PDU頭段數(shù)據(jù)區(qū)分,主要是Type2。
Type1:控制PDU,長11字節(jié),用于連接控制
? ? 1字節(jié):協(xié)議版本號(hào) = 3
? ? 2字節(jié):保留
? ? 3-4字節(jié):包長度(由第一字節(jié)到包結(jié)束)
? ?? ???5字節(jié):數(shù)據(jù)偏移 = 6(ISO頭段結(jié)束的下一位距本字節(jié)的偏移量)
? ? 6字節(jié):包類型 = ISO_PDU_CR = 0xE0(連接請求)
ISO_PDU_CC = 0xD0(連接建立)
ISO_PDU_DR = 0x80(中斷請求)
ISO_PDU_ER = 0x70(錯(cuò)誤)
? ?? ???7-8字節(jié):dst_ref = 0(忽略)
? ? 9-10字節(jié):src_ref = 0(忽略)
11字節(jié):class = 0(忽略)
? ? Type2:數(shù)據(jù)PDU,長度 = 數(shù)據(jù)長度 + 7字節(jié),用于數(shù)據(jù)傳輸
? ? 1字節(jié):協(xié)議版本號(hào) = 3
? ? 2字節(jié):保留
? ? 3-4字節(jié):包長度(由第一字節(jié)到包結(jié)束)
? ?? ???5字節(jié):數(shù)據(jù)偏移 =2(ISO頭段結(jié)束的下一位距本字節(jié)的偏移量)
? ?? ???6字節(jié):包類型 = ISO_PDU_DT = 0xF0(數(shù)據(jù)傳送)
? ?? ???7字節(jié):eot = 0x80
? ?? ???ISO數(shù)據(jù)開始
? ? Iso_init():初始o(jì)ut控制結(jié)構(gòu),預(yù)留ISO頭段空間,并將iso_hdr指向頭段位置
? ? Iso_send_msg():發(fā)送一個(gè)單一的控制消息數(shù)據(jù)包
? ? Iso_recv_msg():接收數(shù)據(jù)的頭段,分析包類型調(diào)整in結(jié)構(gòu)指向數(shù)據(jù)位置,并傳回包類型
? ? Iso_send():填充ISO頭段,并發(fā)送數(shù)據(jù)
? ? Iso_recv():接收ISO數(shù)據(jù)包,去處頭段,調(diào)整in結(jié)構(gòu)指向數(shù)據(jù)位置
? ? Iso_connect():建立ISO連接
? ? Iso_disconnect():中斷ISO連接
本文轉(zhuǎn)自
http://bbs.ccw.com.cn/viewthread.php?tid=761244
總結(jié)
以上是生活随笔為你收集整理的关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android蓝牙开发常见问题
- 下一篇: linux 其他常用命令