【wireshark】插件開發(一):概述


1. 概述

wireshark提供了靈活的插件機制,使用戶可以方便地擴展wireshark的功能。插件的功能主要包括,但不限於協議解析器。

可以使用Lua或C語言來編寫Wireshark插件,下表對比了這兩種方式,綠色背景代表占優的一方。

對比項目 C插件 Lua插件
開發難度 容易,只需要了解Lua語言
開發語言 難以掌握的C 輕巧方便的Lua
開發環境 C編譯器、第三方庫、復雜的環境搭建等等 文本編輯器即可
代碼量
可測試性 方便
插件執行速度 非常快 較慢
可調用的已有功能代碼 所有 僅一部分
部署方式 與主程序一起編譯,或插件目錄 插件目錄

2. 待分析的杜撰協議

假定我們要分析一個私有協議Foo,這個協議使用UDP端口9877傳輸數據,其報文格式如下表所示,括號內為字節數:

type (1)

1 - 初始化

2 - 終止

3 - 數據

flag (1)

…….1 正常

……1. 擁塞

…..1..  優先

seqNo (2)

包序號

ipAddr (4)

IP地址

Data

不定長數據

產生此協議報文的C++程序如下(for VC++ on Windows)

// TODO:代碼待修改


#include <WinSock2.h> #include <stdio.h> #include <time.h> #pragma comment(lib, "ws2_32.lib") #define UDP_PORT_FOO 9877 struct proto_foo { UINT8 type; UINT8 flags; UINT16 seqno; UINT32 ipaddr; }; int main(int argc, char** argv) { int ret; SOCKET sockfd; SOCKADDR_IN addr; proto_foo data; INT16 seq = 1; WORD dwVersion = MAKEWORD(2, 2); WSAData wsaData; WSAStartup(dwVersion, &wsaData); sockfd = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(UDP_PORT_FOO); if(argc < 2) { printf("will send to 220.181.57.217\n"); addr.sin_addr.s_addr = inet_addr("220.181.57.217"); } else addr.sin_addr.s_addr = inet_addr(argv[1]); data.ipaddr = 0x04030201; for(;;) { srand((unsigned int)time(NULL)); data.type = rand() % 3 + 1; data.flags = rand() % 4 + 1; if(data.flags == 3) data.flags = 4; data.seqno = htons(seq++); ret = sendto(sockfd, (const char*)&data, sizeof(proto_foo), 0, (SOCKADDR*)&addr, sizeof(addr)); if(SOCKET_ERROR == ret) { printf("sendto error\n"); break; } Sleep(1000); } closesocket(sockfd); WSACleanup(); return 0; }

編譯並運行以上程序,並用wireshark抓包保存,之后要使用這個pcap文件來測試編寫的foo解析插件。

下面將要兩種方式實現foo協議的解析插件,結合這個實例介紹這兩種插件的開發方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM