亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 13003 | 回復(fù): 4
打印 上一主題 下一主題

wireshark源碼分析問(wèn)題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-04-02 12:27 |只看該作者 |倒序?yàn)g覽
這幾天在看wireshark(ethereal)源代碼?丛创a的主要興趣點(diǎn)是它的分析模塊(dissect)。分析之后他的數(shù)據(jù)存在哪兒,怎么打印的(-V參數(shù))。我想把分析后的數(shù)據(jù),提取出來(lái),存在自己定義的數(shù)據(jù)結(jié)構(gòu)里面,或者按我自己的格式寫(xiě)入文本中。

看了幾天,對(duì)一些數(shù)據(jù)結(jié)構(gòu),似懂非懂,一些流程也是似懂非懂?赡苡捎诮(jīng)驗(yàn)不足的原因,搞來(lái)搞去就在幾個(gè)函數(shù),結(jié)構(gòu)體里面打轉(zhuǎn)。好幾次以為找到切入點(diǎn),發(fā)現(xiàn)又回來(lái)原來(lái)的起點(diǎn)。
這兩天看暈了。有點(diǎn)打擊,水平太差勁了。。呵呵。先這邊問(wèn)問(wèn),看看有沒(méi)有熟悉的朋友。指點(diǎn)一下。先謝謝了。


這樣問(wèn)問(wèn)題可能太細(xì)了。感覺(jué)也不大合適。
1.        我應(yīng)該如何來(lái)看代碼?如何找到突破點(diǎn)?
2.        有wireshark有了解的朋友,說(shuō)說(shuō)你們關(guān)于源碼剖析的體會(huì)。
3.        說(shuō)什么都可以,朋友覺(jué)得對(duì)我有用,有啟發(fā)就好。千萬(wàn)別 “我頂,UP啊”。呵呵

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-04-02 13:15 |只看該作者
我覺(jué)得重要的是看
pcap庫(kù)

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-04-02 16:31 |只看該作者
本帖最后由 peidright 于 2010-04-02 16:36 編輯

樓上說(shuō)得對(duì)!。
看源代碼之前,問(wèn)下你自己,看代碼的目的是什么?

對(duì)于 wireshark 來(lái)說(shuō),你是想學(xué)他寫(xiě)界面? 還是抓包? 還是業(yè)務(wù)邏輯?

界面的話(huà),wireshark 還行
抓包的話(huà),應(yīng)該看pcap庫(kù)
業(yè)務(wù)邏輯的話(huà)。不應(yīng)該看wireshark,看tcpdump.

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-01-03 08:59 |只看該作者
看下啊,

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-01-03 10:37 |只看該作者
看看這個(gè)也許對(duì)你有幫助

添加一個(gè)基礎(chǔ)的RDP解析器
下面我們將循序漸進(jìn)地設(shè)計(jì)一個(gè)基礎(chǔ)的RDP解析器。它依次包含如下構(gòu)成要素:

         包類(lèi)型字段(占用8比特位,可能的值為:1,初始;2,終結(jié);3,數(shù)據(jù));
         標(biāo)志集字段(占用8比特位:0x01,開(kāi)始包;0x02,結(jié)束包;0x04先包);
         序列號(hào)字段(占用16比特位);
1.      創(chuàng)建解析器
首先您需要選擇解析器的類(lèi)型:內(nèi)置型(包含在主程序中)或插件型。 插件是容易編寫(xiě)的,先做一個(gè)插件型解析器吧。
例1. 解析器初始設(shè)定.
           
            

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <epan/packet.h>
#include <epan/prefs.h>

/* forward reference*/
void proto_register_rdp();
void proto_reg_handoff_rdp();
static void dissect_rdp(tvbuff_t *tvb,packet_info *pinfo,proto_tree *tree);

static int proto_rdp=-1;

static dissector_handle_t rdp_handle;
static gint ett_rdp = -1;

define TCP_PORT_RDP 3389

void proto_register_rdp(void)
{
    proto_rdp=proto_register_protocol( "RDP Protocol", "RDP", "rdp");
}

現(xiàn)在來(lái)逐一分析這段代碼。首先我們有一些常規(guī)的包含文件,最好依慣例在文件開(kāi)始包含進(jìn)來(lái)。隨后是一些函數(shù)的前置聲明,我們稍后定義它們。
接下來(lái)我們定義了一個(gè)整型變量"proto_rdp"用于記錄我們的協(xié)議注冊(cè)信息。它被初始化為"-1",當(dāng)解析器注冊(cè)到主程序中后,其值便會(huì)得到更新。這樣做可保證我們方便地判斷是否已經(jīng)做了初始工作。將所有不打算對(duì)外輸出的全局變量和函數(shù)聲明為"static"是一個(gè)良好的習(xí)慣,因?yàn)檫@可以保證命名空間不被污染。通常這是容易做到的,除非您的解析器非常龐大以致跨越多個(gè)文件。
之后的模塊變量"TCP_PORT_RDP"則包含了協(xié)議使用的TCP端口號(hào),我們會(huì)對(duì)通過(guò)該端口的數(shù)據(jù)流進(jìn)行解析。
緊隨其后的是解析器句柄"rdp_handle",我們稍后對(duì)它進(jìn)行初始化。
至此我們已經(jīng)擁有了和主程序交互的基本元素,接下來(lái)最好再把那些預(yù)聲明的函數(shù)定義一下,就從注冊(cè)函數(shù)"proto_register_rdp"開(kāi)始吧。
首先調(diào)用函數(shù)"proto_register_protocol"注冊(cè)協(xié)議。我們能夠給協(xié)議起3個(gè)名字以適用不同的地方。全名和短名用在諸如"首選項(xiàng)(Preferences)"和"已激活協(xié)議(Enabled protocols)"對(duì)話(huà)框以及記錄中已生成的域名列表內(nèi)?s略名則用于過(guò)濾器。
下面我們需要一個(gè)切換函數(shù)。
例2. 解析器切換.

void proto_reg_handoff_rdp(void)
{
    static gboolean initialized=FALSE;

     if(!initialized)
     {
       rdp_handle = create_dissector_handle(dissect_rdp, proto_rdp);
       dissector_add("tcp.port", TCP_PORT_RDP, rdp_handle);
       initialized=TRUE;
     }
}
這段代碼做了什么呢?如果解析器尚未初始化,則對(duì)它進(jìn)行初始化。首先創(chuàng)建解析器。這時(shí)注冊(cè)了了函數(shù)"dissect_rdp"用于完成實(shí)際的解析工作。之后將該解析器與TCP端口號(hào)相關(guān)聯(lián),以使主程序收到該端口的UDP數(shù)據(jù)流時(shí)通知該解析器。
至此我們終于可以寫(xiě)一些解析代碼了。不過(guò)目前我們僅寫(xiě)點(diǎn)兒基本功能占個(gè)位置。

例3.解析

static void dissect_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");
    }
    /* Clear out stuff in the info column */
    if(check_col(pinfo->cinfo,COL_INFO))
    {
        col_clear(pinfo->cinfo,COL_INFO);
    }
}

該函數(shù)用于解析傳遞給它的數(shù)據(jù)包。包數(shù)據(jù)由"tvb"參數(shù)指向的特殊緩沖區(qū)保管,F(xiàn)在我們已深入到協(xié)議的細(xì)節(jié),對(duì)它們您肯定是了若指掌。包信息結(jié)構(gòu)參數(shù)"pinfo"包含了協(xié)議的基本數(shù)據(jù),以供我們更新。參數(shù)"tree"則指明了詳細(xì)解析發(fā)生的地方。
這里我們僅做了保證通過(guò)的少量工作。前兩行檢查UI中"協(xié)議(Protocol)"列是否已顯示。如果該列已存在,就在這兒顯示我們的協(xié)議名稱(chēng)。這樣人們就知道它被識(shí)別出來(lái)了。另外,如果"信息(INFO)"列已顯示,我們就將它的內(nèi)容清除。
至此我們已經(jīng)準(zhǔn)備好一個(gè)可以編譯和安裝的基本解析器。不過(guò)它目前只能識(shí)別和標(biāo)示協(xié)議。
為了編譯解析器并創(chuàng)建插件,還需要在解析器代碼文件"packet-rdp.c"所在目錄下創(chuàng)建一些提供支持的文件:
-          Makefile.am - UNIX/Linux的makefile模板
-          Makefile.common - 包含了插件文件的名稱(chēng)
-          Makefile.nmake - 包含了針對(duì)Windows平臺(tái)的Wireshark插件makefile
-          moduleinfo.h - 包含了插件版本信息
-          moduleinfo.nmake - 包含了針對(duì)Windows平臺(tái)的DLL版本信息
-          packet-rdp.c - 這是您的解析器原代碼文件
-          plugin.rc.in - 包含了針對(duì)Windows平臺(tái)的DLL資源模板
"Makefile.common"和"Makefile.am"文件中涉及到相關(guān)文件和解析器名稱(chēng)的地方一定要修改正確。"moduldeinfo.h"和"moduleinfo.nmake"文件中的版本信息也需要正確填充。一切準(zhǔn)備妥善后就可以將解析器編譯為DLL或共享庫(kù)文件了(使用nmake工具)。在wireshark文件夾下的"plugins"文件夾中,建立"rdp"文件夾。將修改過(guò)的Makefile.common,Makefile.am,moduleinfo.nmake,moduldeinfo.h,Makefile.nmake及packet-rdp.c文件考到"rdp"文件夾下,然后進(jìn)行編譯,rdp插件自動(dòng)生成完整,就可以正常工作了。
1.      解析協(xié)議細(xì)節(jié)
    現(xiàn)在我們已經(jīng)有了一個(gè)可以運(yùn)用的簡(jiǎn)單解析器,讓我們?cè)贋樗睃c(diǎn)兒什么吧。首先想到的應(yīng)該就是標(biāo)示數(shù)據(jù)包的有效信息了。解析器在這方面給我們提供了支持。
首先要做的事情是創(chuàng)建一個(gè)子樹(shù)以容納我們的解析結(jié)果。這會(huì)使協(xié)議的細(xì)節(jié)顯示得井井有條,F(xiàn)在解析器在兩種情況下被調(diào)用:其一,用于獲得數(shù)據(jù)包的概要信息;其二,用于獲得數(shù)據(jù)包的詳細(xì)信息。這兩種情況可以通過(guò)樹(shù)指針參數(shù)"tree"來(lái)進(jìn)行區(qū)分。如果樹(shù)指針為NULL,我們只需要提供概要信息;反之,我們就需要拆解協(xié)議完成細(xì)節(jié)的顯示了;诖耍屛覀儊(lái)增強(qiáng)這個(gè)解析器吧。
例4
static void dissect_rdp(tvbuff_t *tvb,packet_info *pinfo,proto_tree *tree)
{
    proto_item *ti=NULLV;
    if(check_col(pinfo->cinfo,COL_PROTOCOL))
    {
       col_set_str(pinfo->cinfo,COL_PROTOCOL,"RDP");
    }
    /* Clear out stuff in the info column */
    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);}
    }


這里我們?yōu)榻馕鎏砑右粋(gè)子樹(shù)。它將用于保管協(xié)議的細(xì)節(jié),僅在必要時(shí)顯示這些內(nèi)容。
我們還要標(biāo)識(shí)被協(xié)議占據(jù)的數(shù)據(jù)區(qū)域。在我們的這種情況下,協(xié)議占據(jù)了傳入數(shù)據(jù)的全部,因?yàn)槲覀兗僭O(shè)協(xié)議沒(méi)有封裝其它內(nèi)容。因此,我們用"proto_tree_add_item"函數(shù)添加新的樹(shù)結(jié)點(diǎn),將它添加到傳入的協(xié)議樹(shù)"tree"中,用協(xié)議句柄"proto_rdp"標(biāo)識(shí)它,用傳入的緩沖區(qū)"tvb"作為數(shù)據(jù),并將有效數(shù)據(jù)范圍的起點(diǎn)設(shè)為"0",長(zhǎng)度設(shè)為"-1"(表示緩沖區(qū)內(nèi)的全部數(shù)據(jù))。至于最后的參數(shù)"FALSE",我們暫且忽略。
做了這個(gè)更改之后,在包明細(xì)面板區(qū)中應(yīng)該會(huì)出現(xiàn)一個(gè)針對(duì)該協(xié)議的標(biāo)簽;選擇該標(biāo)簽后,在包字節(jié)面板區(qū)中包的剩余內(nèi)容就會(huì)高亮顯示。
現(xiàn)在進(jìn)入下一步,添加一些協(xié)議解析功能。在這一步我們需要構(gòu)建一組幫助解析的表結(jié)構(gòu)。這需要對(duì)"proto_register_rdp"函數(shù)做些修改。首先定義一組靜態(tài)數(shù)組。
例5     定義數(shù)據(jù)結(jié)構(gòu)
static hf_register_info hf[]=
{
     {
           &hf_rdp_version,
           {
                "TPKT Header:Version",
                "rdp.version",
                FT_UINT8,
                BASE_DEC,
                NULL,
                0x0,
                "Version, only version 3 is defined",
                HFILL
           }
      },
}


接下來(lái),在協(xié)議注冊(cè)代碼之后,我們對(duì)這些數(shù)組進(jìn)行注冊(cè)。
例6     注冊(cè)數(shù)據(jù)結(jié)構(gòu)
proto_register_field_array(proto_rdp, hf, array_length(hf));

proto_register_subtree_array(ett, array_length(ett));

例7     解析器全局?jǐn)?shù)據(jù)結(jié)構(gòu)
static int hf_rdp_version     = -1;
static gint ett_rdp           = -1;

現(xiàn)在我們就可以對(duì)協(xié)議細(xì)節(jié)的顯示做一番改善了。
例 8 解析器開(kāi)始數(shù)據(jù)解析


static void dissect_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); //get version
        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;
        }
     }
}

我們提取出協(xié)議的第一部分。數(shù)據(jù)包的首字節(jié)定義了rdp協(xié)議的包類(lèi)型。
函數(shù)"proto_item_add_subtree"的調(diào)用在協(xié)議樹(shù)中添加了一個(gè)子樹(shù),我們就在這里進(jìn)行細(xì)節(jié)解析。子樹(shù)的展開(kāi)受控于變量"ett_rdp"。當(dāng)您在協(xié)議間切換時(shí),由它記錄子樹(shù)是否展開(kāi)。正像您從下面的函數(shù)調(diào)用中看到的那樣,隨后的所有解析都會(huì)添加到該子樹(shù)中。函數(shù)"proto_tree_add_item"用于為子樹(shù)"rdp_tree"添加項(xiàng),這次調(diào)用使用變量"hf_rdp_version"控制項(xiàng)格式。PDU(協(xié)議數(shù)據(jù)單元)類(lèi)型是一個(gè)單字節(jié)數(shù)據(jù),位于數(shù)據(jù)包的首字節(jié),我們將有效數(shù)據(jù)范圍的起點(diǎn)設(shè)為"0",長(zhǎng)度設(shè)為"1"。我們假設(shè)它依照網(wǎng)絡(luò)字節(jié)順序,所以將最后一個(gè)參數(shù)設(shè)為"FALSE"("TRUE"表示"little endian","FALSE"表示"big endian")。盡管對(duì)于單字節(jié)數(shù)據(jù)無(wú)所謂字節(jié)順序,但我們最好還是保持指定字節(jié)順序的良好習(xí)慣。
如果詳細(xì)查看靜態(tài)數(shù)組中"hf_rdp_pdu_type"的聲明,我們能夠獲悉定義的明細(xì)。
-          hf_rdp_version:節(jié)點(diǎn)索引。
-          TPKT Header:Version:項(xiàng)標(biāo)示。
-          rdp.version:過(guò)濾字符串。我們可以在過(guò)濾框中輸入諸如"rdp.version=1"的結(jié)構(gòu)。
-          FT_UNIT8:指定該項(xiàng)數(shù)據(jù)是一個(gè)8比特位的無(wú)符號(hào)整型。這和我們之前調(diào)用函數(shù)時(shí)設(shè)置的一字節(jié)有效數(shù)據(jù)是相一致的。
-          BASE_DEC:針對(duì)整型數(shù)據(jù),指定將其作為十進(jìn)制數(shù)顯示。當(dāng)然視具體情況也可以設(shè)置為"BASE_HEX"(十六進(jìn)制)和"BASE_OCT"(八進(jìn)制),以使數(shù)據(jù)更易辨識(shí)。
至于結(jié)構(gòu)中余下的部分我們暫且忽略。
如果您現(xiàn)在安裝并試用這個(gè)插件,就會(huì)發(fā)現(xiàn)一些有用的東西了。
接下來(lái)讓我們完成這個(gè)簡(jiǎn)單協(xié)議的tpkt頭部的解析工作吧。我們需要再添加一些hf數(shù)組成員和程序調(diào)用。

例 9  

//添加到文件開(kāi)始的某個(gè)地方做全局變量
static int hf_rdp_reserved    = -1;
static int hf_rdp_length      = -1;
//添加到"proto_register_rdp"函數(shù)中的"hf"數(shù)組中,作為數(shù)組的成員

  {
   &hf_rdp_reserved,
   {
    "TPKT Header:Reserved",
    "rdp.reserved",                                          //添加到"dissect_rdp"函數(shù)中,實(shí)現(xiàn)數(shù)據(jù)包的解析
    FT_UINT8,
    BASE_DEC,
    NULL,
    0x0,
    "Reserved, should be 0", HFILL
   }
  },

{
   &hf_rdp_length,
   {
    "TPKT Header:Length",
    "rdp.length",
    FT_UINT16,
    BASE_DEC,
    NULL,
    0x0,
    "Length of data unit, including this header", HFILL
   }
  },
//添加到"dissect_rdp"函數(shù)中,實(shí)現(xiàn)數(shù)據(jù)包的解析
/* 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;

我們引入了一個(gè)新的變量"offset"以記錄數(shù)據(jù)包解析的位置。將這些額外的代碼塊放入合適的位置,整個(gè)協(xié)議就可以得到全面的解析。這樣TPKT頭部的信息就添加到解析代碼中,若要再添加其他解析字段,需要根據(jù)具體情況,將字段與判斷條件一同添加。   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP