• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 25,  comments - 36,  trackbacks - 0
            看過(guò)很多網(wǎng)絡(luò)書(shū)籍 和 編程書(shū)籍,突然發(fā)現(xiàn)自己從來(lái)沒(méi)有實(shí)現(xiàn)模擬TCP三次握手。
            就連steven也只是用抓包程序說(shuō)明一下。
            我一直覺(jué)得實(shí)踐只檢驗(yàn)真理的唯一標(biāo)準(zhǔn),如是就開(kāi)始自己試驗(yàn)。
            我開(kāi)始準(zhǔn)備用原始套接字來(lái)解決這個(gè)問(wèn)題,但是微軟已經(jīng)在xp(含XP)以后就不在支持發(fā)送原始TCP。(貌似網(wǎng)上有人反匯編,找到過(guò)濾的代碼。)
            心里一下就被打入谷底了。
            不過(guò)突然想貌似可以用驅(qū)動(dòng)發(fā)送數(shù)據(jù)包,而且我以前用winpcap寫(xiě)過(guò)一個(gè)ARP攻擊軟件,所以發(fā)送數(shù)據(jù)包的問(wèn)題解決了。
            但接踵過(guò)來(lái)問(wèn)題又來(lái)了,我用winpcap發(fā)送數(shù)據(jù)包,應(yīng)用層沒(méi)有對(duì)應(yīng)的程序,所以windows系統(tǒng)會(huì)自動(dòng)發(fā)送RST來(lái)終結(jié)我的鏈接。
            鏈接都終止我握個(gè)屁的手啊。

            瞬間心碎了,但哥沒(méi)有放棄。又想起哥自學(xué)過(guò)驅(qū)動(dòng)開(kāi)發(fā),了解過(guò)網(wǎng)絡(luò)驅(qū)動(dòng)攔截,想起了NDIS 中間層數(shù)據(jù)包過(guò)濾。
            我直接簡(jiǎn)單修改那個(gè)代碼 實(shí)現(xiàn)我攔截RST 。 老子攔截了你,你就發(fā)吧。
            這些準(zhǔn)備工作完成了。

            看看我寫(xiě)的核心部分---》3次握手 加上一個(gè)消息發(fā)送 (測(cè)試用的是以前自己寫(xiě)TCP聊天程序,自己可以寫(xiě)一個(gè)TCP聊天程序,不想寫(xiě)的話(huà)就用www.baidu.com來(lái)練習(xí)也可以)。
            自己裝B的用C++ 類(lèi)封裝一下協(xié)議。
              1 #include "stdafx.h"
              2 
              3 #define HAVE_REMOTE
              4 
              5 #pragma comment(lib,"wpcap.lib")
              6 #pragma comment(lib,"ws2_32.lib")
              7 #include <pcap.h>
              8 #include "PacketType.h"
              9 #include "TCPProtocol.h"
             10 
             11 USHORT checksum(USHORT *buffer, int size) 
             12 { 
             13     unsigned long cksum=0; 
             14     while(size >1) 
             15     { 
             16         cksum+=*buffer++; 
             17         size -=sizeof(USHORT); 
             18     } 
             19     if(size ) 
             20     { 
             21         cksum += *(UCHAR*)buffer; 
             22     } 
             23 
             24     cksum = (cksum >> 16) + (cksum & 0xffff); 
             25     cksum += (cksum >>16); 
             26     return (USHORT)(~cksum); 
             27 } 
             28 
             29 int _tmain(int argc, _TCHAR* argv[])
             30 {
             31     pcap_if_t *alldevs;
             32     pcap_if_t *d;
             33     int i=0;
             34     char errbuf[PCAP_ERRBUF_SIZE];
             35     char szSendBuf[60]={0}; 
             36 
             37     u_long Ser;
             38 
             39     /* 獲取本地機(jī)器設(shè)備列表 */
             40     if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, 
             41 
             42         errbuf) == -1)
             43     {
             44         fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
             45         exit(1);
             46     }
             47 
             48     /* 打印列表 */
             49     for(d= alldevs; d != NULL; d= d->next)
             50     {
             51         printf("%d. %s", ++i, d->name);
             52         if (d->description)
             53             printf(" (%s)\n", d->description);
             54         else
             55             printf(" (No description available)\n");
             56     }
             57 
             58     if (i == 0)
             59     {
             60         printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
             61         return 0;
             62     }
             63 
             64 
             65     pcap_t *fp;
             66     pcap_if_t *NIC = alldevs;
             67     puts("----------------------");
             68     puts(NIC->name);
             69 
             70     if ( (fp= pcap_open(NIC->name,            // 設(shè)備名
             71         65536,                // 要捕獲的部分 (只捕獲前100個(gè)字節(jié))
             72         PCAP_OPENFLAG_PROMISCUOUS,  // 混雜模式
             73         1000,               // 讀超時(shí)時(shí)間
             74         NULL,               // 遠(yuǎn)程機(jī)器驗(yàn)證
             75         errbuf              // 錯(cuò)誤緩沖
             76         ) ) == NULL)
             77     {
             78         fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n",NIC->name);
             79         getchar();
             80         return 0;
             81     }
             82 
             83     //開(kāi)始構(gòu)建數(shù)據(jù)包
             84     BYTE* Packet = NULL;
             85 
             86 
             87     BYTE Data[65535];
             88 
             89     char buf[1024] = {0};
             90     sprintf(buf,"192.168.1.%d",i);
             91 
             92 
             93     CTCPProtocol tcpData;
             94 
             95     //設(shè)置以太網(wǎng)數(shù)據(jù)包
             96     BYTE SrcMac[6] = {0x00,0x26,0x82,0xAC,0x81,0x06};
             97     //BYTE SrcMac[6] = {0xc8,0x0a,0xa9,0xc5,0x8e,0xa0};
             98     //BYTE DesMac[6] = {0xbc,0xd1,0x77,0x85,0xea,0x44};
             99     BYTE DesMac[6] = {0x70,0xf1,0xa1,0xa1,0xe6,0x26};
            100     //BYTE DesMac[6] = {0x0,0x21,0x27,0x8b,0x01,0x20};
            101     tcpData.CBaseNetProtol::SetMac(SrcMac,DesMac);
            102     tcpData.CBaseNetProtol::SetProtocol(0x800);
            103 
            104     //設(shè)置IP數(shù)據(jù)包
            105     tcpData.CIPProtocol::SetHlen(sizeof(IPHEADER));
            106     tcpData.CIPProtocol::SetVer(4);
            107     tcpData.CIPProtocol::SetIPTolLen(sizeof(IPHEADER)+sizeof(TCPHEADER));
            108     tcpData.CIPProtocol::SetID(256);
            109     tcpData.CIPProtocol::SetFlagAndFrag(0,0);
            110     tcpData.CIPProtocol::SetTTl(64);
            111     tcpData.CIPProtocol::SetProtocol(6);
            112     tcpData.CIPProtocol::SetIP("192.168.12.2","192.168.12.1");   //220.181.163.22
            113 
            114     //設(shè)置TCP 數(shù)據(jù)包
            115     tcpData.SetPort(6654,6666);
            116     tcpData.SetSerial(256);
            117     tcpData.SetACKSerial(0);
            118     tcpData.SetTCPHeardLen(sizeof(TCPHEADER));
            119     tcpData.SetFlag(2);
            120     tcpData.SetWindowSize(16384);
            121     tcpData.SetURP(0);
            122 
            123 
            124     //現(xiàn)在構(gòu)建數(shù)據(jù)包
            125     tcpData.MakePacket();
            126 
            127 
            128     tcpData.GetPacket(Data,65535);
            129     int nLen = tcpData.GetTotalSize();
            130 
            131     //構(gòu)建ip 數(shù)據(jù)包
            132     tcpData.CIPProtocol::SetData(Data,nLen);
            133     tcpData.CIPProtocol::MakePacket();
            134 
            135     tcpData.CIPProtocol::GetPacket(Data,65535);
            136     nLen = tcpData.CIPProtocol::GetTotalSize();
            137 
            138     //構(gòu)建以太網(wǎng)數(shù)據(jù)包
            139     tcpData.CBaseNetProtol::SetData(Data,nLen);
            140     tcpData.CBaseNetProtol::MakePacket();
            141     tcpData.CBaseNetProtol::GetPacket(Data,65535);
            142     nLen = tcpData.CBaseNetProtol::GetPacketSize();
            143 
            144     //發(fā)送握手?jǐn)?shù)據(jù)包1.
            145     /* 發(fā)送數(shù)據(jù)包 */
            146     if (pcap_sendpacket(fp, (const UCHAR*)Data,nLen /* size */) != 0)
            147     {
            148         fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));
            149         getchar();
            150         return 0;
            151     }
            152 
            153 
            154 
            155     tcpData.CBaseNetProtol::SetMac(SrcMac,DesMac);
            156     tcpData.CBaseNetProtol::SetProtocol(0x800);
            157 
            158     //設(shè)置IP數(shù)據(jù)包
            159     tcpData.CIPProtocol::SetHlen(sizeof(IPHEADER));
            160     tcpData.CIPProtocol::SetVer(4);
            161     tcpData.CIPProtocol::SetIPTolLen(sizeof(IPHEADER)+sizeof(TCPHEADER));
            162     tcpData.CIPProtocol::SetID(256);
            163     tcpData.CIPProtocol::SetFlagAndFrag(0,0);
            164     tcpData.CIPProtocol::SetTTl(64);
            165     tcpData.CIPProtocol::SetProtocol(6);
            166     tcpData.CIPProtocol::SetIP("192.168.12.2","192.168.12.1");   //220.181.163.22
            167 
            168     //設(shè)置TCP 數(shù)據(jù)包
            169     tcpData.SetPort(6654,6666);
            170     tcpData.SetSerial(256);
            171     tcpData.SetACKSerial(0);
            172     tcpData.SetTCPHeardLen(sizeof(TCPHEADER));
            173     tcpData.SetFlag(2);
            174     tcpData.SetWindowSize(16384);
            175     tcpData.SetURP(0);
            176 
            177 
            178     //通過(guò)捕獲數(shù)據(jù)包得到對(duì)方發(fā)過(guò)來(lái)的數(shù)據(jù)包,然后再添加數(shù)據(jù)包
            179 
            180     struct pcap_pkthdr *header;
            181     const u_char *pkt_data;
            182 
            183     int res = 0;
            184     while(res = pcap_next_ex( fp, &header, &pkt_data))
            185     {
            186         IPHEADER *ip = (IPHEADER*)(pkt_data + 14);
            187         in_addr addr;
            188         addr.S_un.S_addr = ip->destIP;
            189         TCPHEADER* tcp = (TCPHEADER*)(pkt_data + 14 + 20);
            190         if(strcmp("192.168.12.2",inet_ntoa(addr)) == 0)
            191         {
            192             puts("--------------------------------------------");
            193             printf("%s\n",inet_ntoa(addr));
            194             printf("端口:%d~~~~~~~~%d\n",ntohs(tcp->th_dport),ntohs(tcp->th_sport));
            195             printf("序號(hào):%u ACK:%u",ntohl(tcp->th_seq),ntohl(tcp->th_ack));
            196             puts("--------------------------------------------");
            197 
            198             //getchar();
            199 
            200 
            201 
            202             Ser = ntohl(tcp->th_seq) + 1;            //進(jìn)行第二次握手
            203             tcpData.SetFlag(0x10);            //重新設(shè)置
            204             tcpData.SetSerial(257);                        //IP的ID 不進(jìn)行設(shè)置沒(méi)有影響,據(jù)我的測(cè)試。
            205             tcpData.SetACKSerial(Ser);
            206             tcpData.CIPProtocol::SetID(257);
            207 
            208             break;
            209         }
            210 
            211     }
            212 
            213 
            214     //現(xiàn)在構(gòu)建數(shù)據(jù)包
            215     tcpData.MakePacket();
            216 
            217     tcpData.GetPacket(Data,65535);
            218     nLen = tcpData.GetTotalSize();
            219 
            220     //構(gòu)建ip 數(shù)據(jù)包
            221     tcpData.CIPProtocol::SetData(Data,nLen);
            222     tcpData.CIPProtocol::MakePacket();
            223 
            224     tcpData.CIPProtocol::GetPacket(Data,65535);
            225     nLen = tcpData.CIPProtocol::GetTotalSize();
            226 
            227     //構(gòu)建以太網(wǎng)數(shù)據(jù)包
            228     tcpData.CBaseNetProtol::SetData(Data,nLen);
            229     tcpData.CBaseNetProtol::MakePacket();
            230     tcpData.CBaseNetProtol::GetPacket(Data,65535);
            231     nLen = tcpData.CBaseNetProtol::GetPacketSize();
            232 
            233     //發(fā)送握手?jǐn)?shù)據(jù)包1.
            234     /* 發(fā)送數(shù)據(jù)包 */
            235     if (pcap_sendpacket(fp, (const UCHAR*)Data,nLen /* size */) != 0)
            236     {
            237         fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));
            238         getchar();
            239         return 0;
            240     }
            241 
            242     //////////////////////////////////////////////////////////////////////////
            243 
            244     //開(kāi)始發(fā)送TCP 數(shù)據(jù)。
            245 
            246     CTCPProtocol tcpData1;
            247     tcpData1.CBaseNetProtol::SetMac(SrcMac,DesMac);
            248     tcpData1.CBaseNetProtol::SetProtocol(0x800);
            249 
            250     //設(shè)置IP數(shù)據(jù)包
            251     tcpData1.CIPProtocol::SetHlen(sizeof(IPHEADER));
            252     tcpData1.CIPProtocol::SetVer(4);
            253     tcpData1.CIPProtocol::SetIPTolLen(sizeof(IPHEADER)+sizeof(TCPHEADER)+8);        //增加數(shù)據(jù)的長(zhǎng)度
            254     tcpData1.CIPProtocol::SetFlagAndFrag(0,0);
            255     tcpData1.CIPProtocol::SetTTl(64);
            256     tcpData1.CIPProtocol::SetProtocol(6);
            257     tcpData1.CIPProtocol::SetIP("192.168.12.2","192.168.12.1");   //220.181.163.22
            258 
            259     //設(shè)置TCP 數(shù)據(jù)包
            260     tcpData1.SetPort(6654,6666);
            261     tcpData1.SetTCPHeardLen(sizeof(TCPHEADER));
            262     tcpData1.SetWindowSize(16384);
            263     tcpData1.SetURP(0);
            264 
            265 
            266     tcpData.CIPProtocol::SetID(257);
            267     tcpData1.SetSerial(257);                        //IP的ID 不進(jìn)行設(shè)置沒(méi)有影響,據(jù)我的測(cè)試。
            268     tcpData1.SetACKSerial(Ser);
            269     tcpData1.SetFlag(0x18);
            270     char  hello[] = "aaaaaaaa";
            271     tcpData1.SetData((BYTE*)hello,strlen(hello));
            272     tcpData1.MakePacket();
            273 
            274     tcpData1.GetPacket(Data,65535);
            275     nLen = tcpData1.GetTotalSize();
            276 
            277     //構(gòu)建ip 數(shù)據(jù)包
            278     tcpData1.CIPProtocol::SetData(Data,nLen);
            279     tcpData1.CIPProtocol::MakePacket();
            280 
            281     tcpData1.CIPProtocol::GetPacket(Data,65535);
            282     nLen = tcpData1.CIPProtocol::GetTotalSize();
            283 
            284     //構(gòu)建以太網(wǎng)數(shù)據(jù)包
            285     tcpData1.CBaseNetProtol::SetData(Data,nLen);
            286     tcpData1.CBaseNetProtol::MakePacket();
            287     tcpData1.CBaseNetProtol::GetPacket(Data,65535);
            288     nLen = tcpData1.CBaseNetProtol::GetPacketSize();
            289 
            290     /* 發(fā)送數(shù)據(jù)包 */
            291     if (pcap_sendpacket(fp, (const UCHAR*)Data,nLen /* size */) != 0)
            292     {
            293         fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(fp));
            294         getchar();
            295         return 0;
            296     }
            297 
            298 
            299 
            300     /* 不再需要設(shè)備列表了,釋放它 */
            301     puts("發(fā)送完畢");
            302     getchar();
            303     pcap_freealldevs(alldevs);
            304     return 0;
            305 }
            306 
            如果你有虛擬網(wǎng)卡,你還是關(guān)掉,因?yàn)槲夷J(rèn)調(diào)用第一張網(wǎng)卡,不然就會(huì)出現(xiàn)問(wèn)題。 我本來(lái)只是為了測(cè)試而已,代碼就隨便了寫(xiě)了。 本想寫(xiě)一個(gè)帶界面發(fā)送數(shù)據(jù)包的程序,發(fā)現(xiàn)沒(méi)有那么多精力做這個(gè)事情,不像以前在學(xué)校了。
            代碼工程:/Files/xvsdf100/Sygate.zip
            驅(qū)動(dòng): 
            /Files/xvsdf100/InStall.zip
            posted on 2013-06-25 17:11 小魚(yú)兒 閱讀(1598) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2013年5月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(4)

            隨筆檔案(25)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            伊人久久精品无码av一区| 99久久99久久精品国产片| 国产成人精品久久亚洲高清不卡| 国产成年无码久久久久毛片| 久久伊人中文无码| 亚洲国产另类久久久精品小说| 亚洲国产精品久久66| 麻豆国内精品久久久久久| 久久精品国产亚洲AV大全| 午夜精品久久久久久影视777| 久久A级毛片免费观看| 久久久久国产精品三级网| 久久精品成人国产午夜| 亚洲精品国产自在久久| 国产精品成人久久久久久久| 精品久久久久久国产| 日韩欧美亚洲综合久久影院Ds| 精品蜜臀久久久久99网站| 久久久国产精华液| 久久综合久久综合亚洲| 一本一道久久精品综合| 久久久久亚洲精品天堂| 热久久视久久精品18| 国产成人无码精品久久久免费 | 久久亚洲国产成人精品性色| 精品伊人久久大线蕉色首页| 国内精品免费久久影院| 精品国产一区二区三区久久蜜臀| 成人久久免费网站| 2021久久精品免费观看| 久久亚洲日韩精品一区二区三区| 午夜精品久久影院蜜桃| 亚洲性久久久影院| 久久亚洲av无码精品浪潮| 久久久受www免费人成| 国产ww久久久久久久久久| 国产免费久久久久久无码| 久久香蕉国产线看观看乱码| 久久久久无码精品| 久久影院久久香蕉国产线看观看| 欧美无乱码久久久免费午夜一区二区三区中文字幕 |