• <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
            看過很多網絡書籍 和 編程書籍,突然發現自己從來沒有實現模擬TCP三次握手。
            就連steven也只是用抓包程序說明一下。
            我一直覺得實踐只檢驗真理的唯一標準,如是就開始自己試驗。
            我開始準備用原始套接字來解決這個問題,但是微軟已經在xp(含XP)以后就不在支持發送原始TCP。(貌似網上有人反匯編,找到過濾的代碼。)
            心里一下就被打入谷底了。
            不過突然想貌似可以用驅動發送數據包,而且我以前用winpcap寫過一個ARP攻擊軟件,所以發送數據包的問題解決了。
            但接踵過來問題又來了,我用winpcap發送數據包,應用層沒有對應的程序,所以windows系統會自動發送RST來終結我的鏈接。
            鏈接都終止我握個屁的手啊。

            瞬間心碎了,但哥沒有放棄。又想起哥自學過驅動開發,了解過網絡驅動攔截,想起了NDIS 中間層數據包過濾。
            我直接簡單修改那個代碼 實現我攔截RST 。 老子攔截了你,你就發吧。
            這些準備工作完成了。

            看看我寫的核心部分---》3次握手 加上一個消息發送 (測試用的是以前自己寫TCP聊天程序,自己可以寫一個TCP聊天程序,不想寫的話就用www.baidu.com來練習也可以)。
            自己裝B的用C++ 類封裝一下協議。
              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     /* 獲取本地機器設備列表 */
             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,            // 設備名
             71         65536,                // 要捕獲的部分 (只捕獲前100個字節)
             72         PCAP_OPENFLAG_PROMISCUOUS,  // 混雜模式
             73         1000,               // 讀超時時間
             74         NULL,               // 遠程機器驗證
             75         errbuf              // 錯誤緩沖
             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     //開始構建數據包
             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     //設置以太網數據包
             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     //設置IP數據包
            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     //設置TCP 數據包
            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     //現在構建數據包
            125     tcpData.MakePacket();
            126 
            127 
            128     tcpData.GetPacket(Data,65535);
            129     int nLen = tcpData.GetTotalSize();
            130 
            131     //構建ip 數據包
            132     tcpData.CIPProtocol::SetData(Data,nLen);
            133     tcpData.CIPProtocol::MakePacket();
            134 
            135     tcpData.CIPProtocol::GetPacket(Data,65535);
            136     nLen = tcpData.CIPProtocol::GetTotalSize();
            137 
            138     //構建以太網數據包
            139     tcpData.CBaseNetProtol::SetData(Data,nLen);
            140     tcpData.CBaseNetProtol::MakePacket();
            141     tcpData.CBaseNetProtol::GetPacket(Data,65535);
            142     nLen = tcpData.CBaseNetProtol::GetPacketSize();
            143 
            144     //發送握手數據包1.
            145     /* 發送數據包 */
            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     //設置IP數據包
            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     //設置TCP 數據包
            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     //通過捕獲數據包得到對方發過來的數據包,然后再添加數據包
            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("序號:%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;            //進行第二次握手
            203             tcpData.SetFlag(0x10);            //重新設置
            204             tcpData.SetSerial(257);                        //IP的ID 不進行設置沒有影響,據我的測試。
            205             tcpData.SetACKSerial(Ser);
            206             tcpData.CIPProtocol::SetID(257);
            207 
            208             break;
            209         }
            210 
            211     }
            212 
            213 
            214     //現在構建數據包
            215     tcpData.MakePacket();
            216 
            217     tcpData.GetPacket(Data,65535);
            218     nLen = tcpData.GetTotalSize();
            219 
            220     //構建ip 數據包
            221     tcpData.CIPProtocol::SetData(Data,nLen);
            222     tcpData.CIPProtocol::MakePacket();
            223 
            224     tcpData.CIPProtocol::GetPacket(Data,65535);
            225     nLen = tcpData.CIPProtocol::GetTotalSize();
            226 
            227     //構建以太網數據包
            228     tcpData.CBaseNetProtol::SetData(Data,nLen);
            229     tcpData.CBaseNetProtol::MakePacket();
            230     tcpData.CBaseNetProtol::GetPacket(Data,65535);
            231     nLen = tcpData.CBaseNetProtol::GetPacketSize();
            232 
            233     //發送握手數據包1.
            234     /* 發送數據包 */
            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     //開始發送TCP 數據。
            245 
            246     CTCPProtocol tcpData1;
            247     tcpData1.CBaseNetProtol::SetMac(SrcMac,DesMac);
            248     tcpData1.CBaseNetProtol::SetProtocol(0x800);
            249 
            250     //設置IP數據包
            251     tcpData1.CIPProtocol::SetHlen(sizeof(IPHEADER));
            252     tcpData1.CIPProtocol::SetVer(4);
            253     tcpData1.CIPProtocol::SetIPTolLen(sizeof(IPHEADER)+sizeof(TCPHEADER)+8);        //增加數據的長度
            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     //設置TCP 數據包
            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 不進行設置沒有影響,據我的測試。
            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     //構建ip 數據包
            278     tcpData1.CIPProtocol::SetData(Data,nLen);
            279     tcpData1.CIPProtocol::MakePacket();
            280 
            281     tcpData1.CIPProtocol::GetPacket(Data,65535);
            282     nLen = tcpData1.CIPProtocol::GetTotalSize();
            283 
            284     //構建以太網數據包
            285     tcpData1.CBaseNetProtol::SetData(Data,nLen);
            286     tcpData1.CBaseNetProtol::MakePacket();
            287     tcpData1.CBaseNetProtol::GetPacket(Data,65535);
            288     nLen = tcpData1.CBaseNetProtol::GetPacketSize();
            289 
            290     /* 發送數據包 */
            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     /* 不再需要設備列表了,釋放它 */
            301     puts("發送完畢");
            302     getchar();
            303     pcap_freealldevs(alldevs);
            304     return 0;
            305 }
            306 
            如果你有虛擬網卡,你還是關掉,因為我默認調用第一張網卡,不然就會出現問題。 我本來只是為了測試而已,代碼就隨便了寫了。 本想寫一個帶界面發送數據包的程序,發現沒有那么多精力做這個事情,不像以前在學校了。
            代碼工程:/Files/xvsdf100/Sygate.zip
            驅動: 
            /Files/xvsdf100/InStall.zip
            posted on 2013-06-25 17:11 小魚兒 閱讀(1584) 評論(0)  編輯 收藏 引用
            <2013年6月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            常用鏈接

            留言簿(4)

            隨筆檔案(25)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产国产成人精品久久| 无遮挡粉嫩小泬久久久久久久| 久久婷婷五月综合色奶水99啪| 狠狠色婷婷综合天天久久丁香| 久久亚洲中文字幕精品一区| 久久亚洲sm情趣捆绑调教| 国产成人无码久久久精品一| 久久久国产亚洲精品| 99久久精品国产一区二区三区| 精产国品久久一二三产区区别| 2020久久精品亚洲热综合一本| 久久综合香蕉国产蜜臀AV| 99久久无码一区人妻| 亚洲精品乱码久久久久久按摩| 久久国产一片免费观看| 88久久精品无码一区二区毛片 | 久久影院午夜理论片无码| 久久国产免费直播| 久久国产精品无码网站| 国产亚洲欧美精品久久久| 亚洲国产精品成人久久蜜臀| 精品久久久久久国产牛牛app | 97久久精品人人澡人人爽| 中文字幕精品久久| 久久综合精品国产一区二区三区 | 国产成人综合久久精品尤物| 狠狠色婷婷综合天天久久丁香 | 亚洲中文字幕无码久久综合网| 久久精品成人| 99久久综合国产精品二区| 久久久无码人妻精品无码| 久久精品国产亚洲AV麻豆网站| 亚洲国产小视频精品久久久三级 | 中文字幕亚洲综合久久2| 性高湖久久久久久久久| 久久综合九色综合网站| 性高湖久久久久久久久AAAAA| 久久久久久精品成人免费图片| 欧美久久久久久精选9999| 99久久综合国产精品二区| 久久久久国产一区二区三区|