SQL SERVER
通訊協定包格式
AUTHOR: bluestn
VERSION: 1.0
背景說明:本通訊協定包格式為非官方公布的協議,微軟並沒有公布SQL SERVER 的TCP/IP的通訊協定包格式,而是為了擴充SQL SERVER應用所進行的通過包分析工具分析得到的,其完整性和可靠性值得進一步的完善。
包頭格式:SQL SERVER採用命令/響應的方式進行通訊。無論命令/響應包,其基本的包頭格式如下: struct t_SQLServerTcpPackageHead{ WORD wCmdID; // 二位元組的包命令ID WORD wPackageLen; // 整個包的長度 DWORD dwUnknown; // 未知四位位元組的欄位};
wCmdID
有以下幾種類型:0x 0112 : 串連請求包0x0104 : 響應包0x0110 : ODBC方式的登入包(採用加密驗證方式)0x0002 : OLEDB方式的登入包(採用明碼驗證方式)0x0101: 發送資料庫查詢指令包0x0102: 未知0x0000: 對應0x0002方式,在OLEDB方式登陸包發出後由伺服器響應
wPackageLen
按照網路位元組順序來發送,共兩個位元組,也就是說最大的SQLSERVER 通訊協定包為65535位元組。
幾個特定命令類型包的格式
ODBC方式的登入包(採用加密驗證方式)命令ID為:0x0110 從第2C位元組開始,指示了包中所包含的串連參數所需要的各個欄位在包中的位移值+欄位長度資訊。如果其中的位移值相對於包頭第0位元組來計算,需要進行修正,加上8。其中明文欄位部分都是採用Unicode編碼方式。從第2C位元組開始,依次指定了如下欄位:1、 用戶端主機名稱2、 登入所使用的使用者名稱3、 登入使用的加密密碼4、 登入使用的代理名5、 未知6、 登入使用的應用程式名稱7、 未知8、 未知
OLEDB方式的登入包(採用明碼驗證方式)命令ID為:0x0002 從第8位元組開始,用ANSI方式編碼,依次是:1、 主機名稱(最長30個位元組),不足30個位元組用0x00補足30位,接下去一位表示本欄位的長度(不包括補零部分)。2、 登入所使用的使用者名稱(最長30個位元組),不足30個位元組用0x00補足30位,接下去一位表示本欄位的長度(不包括補零部分)。3、 登入使用的未加密密碼(最長30個位元組),不足30個位元組用0x00補足30位,接下去一位表示本欄位的長度(不包括補零部分)。4、 未知5、 登入使用的代理名(最長63個位元組),不足63個位元組用0x00補足63位,接下去一位表示本欄位的長度(不包括補零部分)。
OLEDB方式的響應包命令ID為: 0x0104。訊息體採用ANSI方式編碼。對於登入響應錯誤資訊包,格式如下: 從第8位元組開始依次欄位為;1、 未知(1位元組)2、 訊息長度(2位元組),從本欄位開始。3、 錯誤編號4、 錯誤層級+狀態(4位元組)5、 訊息長度(2位元組),僅僅包括訊息檔案資訊的長度。6、 訊息資訊(ANSI編碼的文本),以 00 00 00 00 結尾。7、 固定的FD 02 00 00 00 00 00 00
ODBC方式的響應包命令ID為: 0x0104。訊息體採用UNICODE方式編碼。對於登入響應錯誤資訊包,格式如下:
從第8位元組開始依次欄位為;1、 未知(1位元組)2、 訊息長度(2位元組),從本欄位開始。3、 錯誤編號4、 錯誤層級+狀態(4位元組)5、 訊息長度(2位元組),僅僅包括訊息檔案資訊的長度(指UNICODE字串的長度)。6、 訊息資訊(ANSI編碼的文本),以 00 00 00 00 結尾。7、 固定的FD 02 00 00 00 00 00 00