ipv6分組分析器

2021-09-30 05:19:57 字數 4586 閱讀 4001

ipv6分組分析器

開發思路:

本問題的目的是深入了解ipv6分組格式;掌握程式抓包方法。

具體開發思路為:

1.      先顯示出所有網路介面卡的列表,然後讓使用者選擇想在哪個介面卡上截獲資料報。

2.      使用winpcap在使用者所選擇的網路介面卡上進行截獲。

3.      將截獲的資料報的資訊顯示出來

流程:

ipv6_packet_analyzer是程式抓包工具。需要能夠偵聽所有進出本主機的資料報,並過濾出ipv6格式的資料報。對ipv6頭而言,需要顯示版本、下乙個頭或協議型別:tcp或udp、流標籤、載荷長度、跳數限制、源ip位址、目的ip位址。

本軟體是在vc環境下編寫,使用winpcap中定義的標頭檔案和lib檔案為支援,運用winpcap提供的資料報捕獲程式執行核心操作。

ø  本軟體使用的主要模組及其功能如下:

1.網路介面卡選擇及顯示模組

2.抓包和資料報分析執行緒

typedef struct ip_addressip6_address;

typedef struct ip_headerip6_header;

ø  查詢主機上所有的介面卡並顯示

htreeitem root = m_treectrl.insertitem(_t("network adpater"));

if(alldevs==null)//當前已有網絡卡被繫結,顯示該網絡卡資訊

ø  顯示選定網絡卡

htreeitem h=m_treectrl.getselecteditem();

if (m_treectrl.getparentitem(h)==null)

return;

dev=alldevs;

while(strcmp(dev->name,m_treectrl.getitemtext(h))!=0)//找到被選中網絡卡

dev=dev->next;

m_listctrl.deleteallitems();

m_listctrl.insertitem(0,"名稱",0);

m_listctrl.insertitem(1,"描述",0);

if(dev!=null){//顯示選中網絡卡內容

if(dev->name!=null){

m_listctrl.setitemtext(0,1,dev->name);

else{

m_listctrl.setitemtext(0,1,"not found");

if(dev->description!=null){

m_listctrl.setitemtext(1,1,dev->description);

else{

m_listctrl.setitemtext(1,1,"沒有找到");

ø  開啟指定的介面卡

htreeitem h=this->m_treectrl.getselecteditem();

this->dev=this->alldevs;

while(strcmp(this->dev->name,this->m_treectrl.getitemtext(h))!=0)//找到被選中網絡卡

this->dev=this->dev->next;

if ( (adhandle= pcap_open(this->dev->name, 

65536,     

pcap_openflag_promiscuous,       

1000,    

null,     

errbuf    

) ) == null)

afxmessagebox("網絡卡開啟失敗!");

return -1;

ø  捕包並進行包資訊分析

ip6_header *i6h;

int res=-1;

struct pcap_pkthdr * header;

const unsigned char * pkt_data;

this->packetno=0;

while(!this->isstop&&(res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){

if(res == 0)

//超時時間到

continue;

i6h = (ip6_header *) (pkt_data +14);

u_int ve = (i6h->ver_traffic) & 0xf0;

u_int traffic=i6h->ver_traffic&0xf+(i6h->traffic_flow&0xf0)*8;//通訊流類別

u_int flowlabel = (i6h->traffic_flow & 0xf) * 32 * 1024 + ntohs(i6h->flow);//流標籤

cstring spacketno,sve,straffic,sflowlabel,spayloadlen,shoplimit;

char temp[100];

itoa(this->packetno,temp,10);

spacketno=temp;

ltoa(flowlabel,temp,10);

sflowlabel = temp;

ltoa(traffic,temp,10);

straffic = temp;

ltoa(ve,temp,10);

sve = temp;

itoa(ntohs(i6h->payloadlen),temp,10);

spayloadlen = temp;

itoa(i6h->hoplim,temp,10);

shoplimit = temp;

cstring nhtype;

switch(i6h->nexthead)

case 6: nhtype="tcp";break;

case 17: nhtype="udp"; break;

case 43: nhtype="routing";break;

case 44: nhtype="fragment";break;

case 58: nhtype="icmp6";break;

default : nhtype ="type unknown";

cstring srcip,desip;

//列印ip位址

for (int i=0;i<8;i++)

itoa(ntohs(i6h->saddr.byte[i]),temp,16);

srcip += temp;

if(i<7)

srcip +=":";

for (int j=0;j<8;j++)

itoa(ntohs(i6h->daddr.byte[i]),temp,16);

desip += temp;

if(j<7)

desip += ":";

this->m_listctrlip.insertitem(this->packetno,spacketno);

this->m_listctrlip.setitemtext(this->packetno,1,sve);

this->m_listctrlip.setitemtext(this->packetno,2,straffic);

this->m_listctrlip.setitemtext(this->packetno,3,sflowlabel);

this->m_listctrlip.setitemtext(this->packetno,4,spayloadlen);

this->m_listctrlip.setitemtext(this->packetno,5,nhtype);

this->m_listctrlip.setitemtext(this->packetno,6,shoplimit);

this->m_listctrlip.setitemtext(this->packetno,7,srcip);

this->m_listctrlip.setitemtext(this->packetno,8,desip);  

this->packetno++;

this->isstop=false;

注:此執行緒函式通過對isstop的值的判斷來確定是否終止。

關鍵問題:

1.      採用何種方法進行捕包

2.      如何對ipv6的包進行資料分析

解決方法:

1.      採用winpcap中函式實現抓包。包括查詢裝置,開啟裝置,抓包等。通過本專案學會了如何使用這一系列的庫函式。

2.      定義了ipv6的資料報頭以及ip位址的結構體,通過找到資料報頭的指針對包頭的資訊進行分析。

進一步的改進:

增加了gui圖形介面,主要通過樹形控制項顯示裝置列表,通過列表控制項顯示選定網絡卡資訊,通過另乙個列表控制項顯示ipv6包的詳細資訊。在圖形化介面中應注意執行緒的呼叫。本軟體未進行統計資訊的顯示,可進一步改進。

IPv6的組播位址

ipv6的組播位址通常是為ipv6的組播服務,而ipv6通訊的核心大量的使用了組播,ipv6不再使用廣播,這與ipv4的通訊不同,然而要理解ipv6的組播,首先需要明白三個關鍵點 第一 任何節點都能夠成為乙個多播組成員也叫做組播組成員 第二 源節點可以傳送資料報到多播組 第三 在乙個多播組的節點都能...

基於ipv6資料報分析

一 拓撲圖 二 配置 其他路由器與r1配置相同 位址不同 三 ping通測試 r2pingr1成功 r4pingr2成功 三.抓包分析 128返回請求報文 icmpv6層收到乙個 echo request 報文後,可能會通知高層的程序。129返回應答報文 icmpv6層必須將回送應答報文通知那個產生...

房卡麻將分析之」IPV6 改造

前一段一是太忙,二是太忙,三還是太忙,不過實放說,肚子裡的素材也的確需要沉澱一下了。先上百科 ipv6是internet protocol version 6的縮寫,其中internet protocol譯為 網際網路協議 ipv6是ietf 網際網路工程任務組,internet engineeri...