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...