成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

wireshark添加一個基礎的RDP解析器的方法

安全 數據安全
網絡管理員使用Wireshark來檢測網絡問題,網絡安全工程師使用Wireshark來檢查資訊安全相關問題,開發者使用Wireshark來為新的通訊協定除錯,下面我們給大家介紹有關wireshark添加一個基礎的RDP解析器的方法,希望對大家有所幫助。

添加一個基礎的RDP解析器

下面我們將循序漸進地設計一個基礎的RDP解析器。它依次包含如下構成要素:

包類型字段(占用8比特位,可能的值為:1,初始;2,終結;3,數據);

標志集字段(占用8比特位:0x01,開始包;0x02,結束包;0x04先包);

序列號字段(占用16比特位);

1.創建解析器

首先您需要選擇解析器的類型:內置型(包含在主程序中)或插件型。插件是容易編寫的,先做一個插件型解析器吧。

例1.解析器初始設定.

\#ifdefHAVE_CONFIG_H

\#include"config.h"

\#endif

\#include<epan/packet.h>

\#include<epan/prefs.h>

/\*forwardreference*/

voidproto_register_rdp();

voidproto_reg_handoff_rdp();

staticvoiddissect_rdp(tvbuff_t\*tvb,packet_info\*pinfo,proto_tree\*tree);

staticintproto_rdp=-1;

staticdissector_handle_trdp_handle;

staticgintett_rdp=\-1;

\#defineTCP_PORT_RDP3389

voidproto_register_rdp(void)

{proto_rdp=proto_register_protocol(

"RDPProtocol",

"RDP",

"rdp"

);

}

現在來逐一分析這段代碼。首先我們有一些常規的包含文件,最好依慣例在文件開始包含進來。隨后是一些函數的前置聲明,我們稍后定義它們。

接下來我們定義了一個整型變量"proto_rdp"用于記錄我們的協議注冊信息。它被初始化為"-1",當解析器注冊到主程序中后,其值便會得到更新。這樣做可保證我們方便地判斷是否已經做了初始工作。將所有不打算對外輸出的全局變量和函數聲明為"static"是一個良好的習慣,因為這可以保證命名空間不被污染。通常這是容易做到的,除非您的解析器非常龐大以致跨越多個文件。

之后的模塊變量"TCP_PORT_RDP"則包含了協議使用的TCP端口號,我們會對通過該端口的數據流進行解析。

緊隨其后的是解析器句柄"rdp_handle",我們稍后對它進行初始化。

至此我們已經擁有了和主程序交互的基本元素,接下來最好再把那些預聲明的函數定義一下,就從注冊函數"proto_register_rdp"開始吧。

首先調用函數"proto_register_protocol"注冊協議。我們能夠給協議起3個名字以適用不同的地方。全名和短名用在諸如"首選項(Preferences)"和"已激活協議(Enabledprotocols)"對話框以及記錄中已生成的域名列表內。縮略名則用于過濾器。

下面我們需要一個切換函數。

例2.解析器切換.

voidproto_reg_handoff_rdp(void)

{

staticgbooleaninitialized=FALSE;

if(!initialized)

{

rdp_handle=create_dissector_handle(dissect_rdp,proto_rdp);

dissector_add("tcp.port",TCP_PORT_RDP,rdp_handle);

initialized=TRUE;

}

}

這段代碼做了什么呢?如果解析器尚未初始化,則對它進行初始化。首先創建解析器。這時注冊了了函數"dissect_rdp"用于完成實際的解析工作。之后將該解析器與TCP端口號相關聯,以使主程序收到該端口的UDP數據流時通知該解析器。

至此我們終于可以寫一些解析代碼了。不過目前我們僅寫點兒基本功能占個位置。

例3.解析

staticvoiddissect_rdp(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree)

{

if(check_col(pinfo->cinfo,COL_PROTOCOL))

{

col_set_str(pinfo->cinfo,COL_PROTOCOL,"RDP");

}

/*Clearoutstuffintheinfocolumn*/

if(check_col(pinfo->cinfo,COL_INFO))

{

col_clear(pinfo->cinfo,COL_INFO);

}

}

該函數用于解析傳遞給它的數據包。包數據由"tvb"參數指向的特殊緩沖區保管。現在我們已深入到協議的細節,對它們您肯定是了若指掌。包信息結構參數"pinfo"包含了協議的基本數據,以供我們更新。參數"tree"則指明了詳細解析發生的地方。

這里我們僅做了保證通過的少量工作。前兩行檢查UI中"協議(Protocol)"列是否已顯示。如果該列已存在,就在這兒顯示我們的協議名稱。這樣人們就知道它被識別出來了。另外,如果"信息(INFO)"列已顯示,我們就將它的內容清除。

至此我們已經準備好一個可以編譯和安裝的基本解析器。不過它目前只能識別和標示協議。

為了編譯解析器并創建插件,還需要在解析器代碼文件"packet-rdp.c"所在目錄下創建一些提供支持的文件:

-Makefile.am-UNIX/Linux的makefile模板

-Makefile.common-包含了插件文件的名稱

-Makefile.nmake-包含了針對Windows平臺的Wireshark插件makefile

-moduleinfo.h-包含了插件版本信息

-moduleinfo.nmake-包含了針對Windows平臺的DLL版本信息

-packet-rdp.c-這是您的解析器原代碼文件

-plugin.rc.in-包含了針對Windows平臺的DLL資源模板

"Makefile.common"和"Makefile.am"文件中涉及到相關文件和解析器名稱的地方一定要修改正確。"moduldeinfo.h"和"moduleinfo.nmake"文件中的版本信息也需要正確填充。一切準備妥善后就可以將解析器編譯為DLL或共享庫文件了(使用nmake工具)。在wireshark文件夾下的"plugins"文件夾中,建立"rdp"文件夾。將修改過的Makefile.common,Makefile.am,moduleinfo.nmake,moduldeinfo.h,Makefile.nmake及packet-rdp.c文件考到"rdp"文件夾下,然后進行編譯,rdp插件自動生成完整,就可以正常工作了。

1.解析協議細節

現在我們已經有了一個可以運用的簡單解析器,讓我們再為它添點兒什么吧。首先想到的應該就是標示數據包的有效信息了。解析器在這方面給我們提供了支持。

首先要做的事情是創建一個子樹以容納我們的解析結果。這會使協議的細節顯示得井井有條。現在解析器在兩種情況下被調用:其一,用于獲得數據包的概要信息;其二,用于獲得數據包的詳細信息。這兩種情況可以通過樹指針參數"tree"來進行區分。如果樹指針為NULL,我們只需要提供概要信息;反之,我們就需要拆解協議完成細節的顯示了。基于此,讓我們來增強這個解析器吧。

例4

staticvoiddissect_rdp(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree)

{

proto_item*ti=NULL;

if(check_col(pinfo->cinfo,COL_PROTOCOL))

{

col_set_str(pinfo->cinfo,COL_PROTOCOL,"RDP");

}

/*Clearoutstuffintheinfocolumn*/

if(check_col(pinfo->cinfo,COL_INFO))

{

col_clear(pinfo->cinfo,COL_INFO);

}

if(tree)

{ti=proto_tree_add_item(tree,proto_rdp,tvb,offset,-1,FALSE);}

}

這里我們為解析添加一個子樹。它將用于保管協議的細節,僅在必要時顯示這些內容。

我們還要標識被協議占據的數據區域。在我們的這種情況下,協議占據了傳入數據的全部,因為我們假設協議沒有封裝其它內容。因此,我們用"proto_tree_add_item"函數添加新的樹結點,將它添加到傳入的協議樹"tree"中,用協議句柄"proto_rdp"標識它,用傳入的緩沖區"tvb"作為數據,并將有效數據范圍的起點設為"0",長度設為"-1"(表示緩沖區內的全部數據)。至于最后的參數"FALSE",我們暫且忽略。

做了這個更改之后,在包明細面板區中應該會出現一個針對該協議的標簽;選擇該標簽后,在包字節面板區中包的剩余內容就會高亮顯示。

現在進入下一步,添加一些協議解析功能。在這一步我們需要構建一組幫助解析的表結構。這需要對"proto_register_rdp"函數做些修改。首先定義一組靜態數組。

例5定義數據結構

statichf_register_infohf[]=

{

{

&hf_rdp_version,

{

"TPKTHeader:Version",

"rdp.version",

FT_UINT8,

BASE_DEC,

NULL,

0x0,

"Version,onlyversion3isdefined",HFILL

}

},

}

接下來,在協議注冊代碼之后,我們對這些數組進行注冊。

例6注冊數據結構

proto_register_field_array(proto_rdp,hf,array_length(hf));

proto_register_subtree_array(ett,array_length(ett));

例7解析器全局數據結構

staticinthf_rdp_version=-1;

staticgintett_rdp=-1;

現在我們就可以對協議細節的顯示做一番改善了。

例8解析器開始數據解析

staticvoiddissect_rdp(tvbuff_t*tvb,packet_info*pinfo,proto_tree*tree)

{

proto_item*ti=NULL;

proto_tree*rdp_tree=NULL;

if(tree)

{

version=tvb_get_guint8(tvb,offset);//getversion

if(version==3)

{

ti=proto_tree_add_item(tree,proto_rdp,tvb,offset,-1,FALSE);

rdp_tree=proto_item_add_subtree(ti,ett_rdp);

/*Version*/

proto_tree_add_item(rdp_tree,hf_rdp_version,tvb,offset,1,FALSE);

offset+=1;

}

}

}

我們提取出協議的第一部分。數據包的首字節定義了rdp協議的包類型。

函數"proto_item_add_subtree"的調用在協議樹中添加了一個子樹,我們就在這里進行細節解析。子樹的展開受控于變量"ett_rdp"。當您在協議間切換時,由它記錄子樹是否展開。正像您從下面的函數調用中看到的那樣,隨后的所有解析都會添加到該子樹中。函數"proto_tree_add_item"用于為子樹"rdp_tree"添加項,這次調用使用變量"hf_rdp_version"控制項格式。PDU(協議數據單元)類型是一個單字節數據,位于數據包的首字節,我們將有效數據范圍的起點設為"0",長度設為"1"。我們假設它依照網絡字節順序,所以將最后一個參數設為"FALSE"("TRUE"表示"littleendian","FALSE"表示"bigendian")。盡管對于單字節數據無所謂字節順序,但我們最好還是保持指定字節順序的良好習慣。

如果詳細查看靜態數組中"hf_rdp_pdu_type"的聲明,我們能夠獲悉定義的明細。

-hf_rdp_version:節點索引。

-TPKTHeader:Version:項標示。

-rdp.version:過濾字符串。我們可以在過濾框中輸入諸如"rdp.version=1"的結構。

-FT_UNIT8:指定該項數據是一個8比特位的無符號整型。這和我們之前調用函數時設置的一字節有效數據是相一致的。

-BASE_DEC:針對整型數據,指定將其作為十進制數顯示。當然視具體情況也可以設置為"BASE_HEX"(十六進制)和"BASE_OCT"(八進制),以使數據更易辨識。

至于結構中余下的部分我們暫且忽略。

如果您現在安裝并試用這個插件,就會發現一些有用的東西了。

接下來讓我們完成這個簡單協議的tpkt頭部的解析工作吧。我們需要再添加一些hf數組成員和程序調用。

例9

//添加到文件開始的某個地方做全局變量

staticinthf_rdp_reserved=-1;

staticinthf_rdp_length=-1;

//添加到"proto_register_rdp"函數中的"hf"數組中,作為數組的成員

{

&hf_rdp_reserved,

{

"TPKTHeader:Reserved",

"rdp.reserved",//添加到"dissect_rdp"函數中,實現數據包的解析

FT_UINT8,

BASE_DEC,

NULL,

0x0,

"Reserved,shouldbe0",HFILL

}

},

{

&hf_rdp_length,

{

"TPKTHeader:Length",

"rdp.length",

FT_UINT16,

BASE_DEC,

NULL,

0x0,

"Lengthofdataunit,includingthisheader",HFILL

}

},

//添加到"dissect_rdp"函數中,實現數據包的解析

/*Reserved*/

proto_tree_add_item(rdp_tree,hf_rdp_reserved,tvb,offset,1,FALSE);

offset+=1;

/*length*/

data_len=tvb_get_ntohs(tvb,offset);

proto_tree_add_uint(rdp_tree,hf_rdp_length,tvb,offset,2,data_len);

offset+=2;

我們引入了一個新的變量"offset"以記錄數據包解析的位置。將這些額外的代碼塊放入合適的位置,整個協議就可以得到全面的解析。這樣TPKT頭部的信息就添加到解析代碼中,若要再添加其他解析字段,需要根據具體情況,將字段與判斷條件一同添加。
 

【編輯推薦】

  1. Wireshark表達式使用技巧——IP過濾
  2. 安全新詞解:Wireshark
  3. Wireshark:網絡嗅探工具
  4. 巧妙運用Wireshark嗅探網絡通信
責任編輯:于爽 來源: hi.baidu.com
相關推薦

2022-10-20 11:00:52

SQL解析器

2019-07-05 08:39:39

GoSQL解析器

2017-02-14 10:20:43

Java Class解析器

2015-02-10 14:32:37

XSS漏洞XSS

2022-06-28 08:17:10

JSON性能反射

2014-05-15 09:45:58

Python解析器

2023-12-30 13:33:36

Python解析器JSON

2011-04-01 16:16:27

JavaScript

2023-07-25 14:24:33

元素JSX解析器

2014-05-06 09:27:54

2022-02-14 13:58:32

操作系統JSON格式鴻蒙

2022-11-18 08:32:23

spring參數解析器

2012-11-21 11:48:23

i-NVMM加密密碼

2009-03-19 09:26:05

RSS解析器MagpieRSS

2010-01-07 16:37:04

JSON解析器

2010-03-05 10:14:53

Ubuntu ruby

2009-01-03 14:39:00

ibmdwSpirit

2021-10-03 15:02:50

HTTPNodejs

2023-02-07 06:55:26

Kafka消費消息

2010-02-22 13:38:50

Python解析器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区2区 | 国产精品1区 | 一区二区三区中文字幕 | aaa级片| 美美女高清毛片视频免费观看 | 久久久成人免费视频 | 国产精品久久久久久婷婷天堂 | 亚洲免费在线 | www一级片| 日韩a| 一本大道久久a久久精二百 国产成人免费在线 | 一区二区三区国产好 | 国产精品成人一区二区三区 | 免费国产视频在线观看 | 99re在线视频免费观看 | 亚洲一区二区三区在线视频 | 欧美极品视频在线观看 | 在线观看日本高清二区 | 欧美日韩视频 | av天天澡天天爽天天av | 欧美精品久久久久久久久久 | 三级视频在线观看电影 | 毛片免费在线观看 | 欧美视频一区二区三区 | 欧美精品在线播放 | 亚洲精品福利视频 | 1区2区3区视频| 亚洲一区二区三区观看 | 亚洲免费人成在线视频观看 | 日韩精品一区二区三区中文在线 | 亚洲精品一区二区三区蜜桃久 | 中文字幕乱码视频32 | 久久久久久久一区 | 亚洲综合久久网 | 伊人焦久影院 | 亚洲欧洲国产视频 | 久久国产日本 | 在线观看视频h | 国产精品久久久久9999鸭 | 成人亚洲性情网站www在线观看 | 欧美日韩视频在线第一区 |