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

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

            看看我寫的核心部分---》3次握手 加上一個消息發(fā)送 (測試用的是以前自己寫TCP聊天程序,自己可以寫一個TCP聊天程序,不想寫的話就用www.baidu.com來練習也可以)。
            自己裝B的用C++ 類封裝一下協(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     /* 獲取本地機器設備列表 */
             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個字節(jié))
             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     //開始構建數(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     //設置以太網(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     //設置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     //設置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)在構建數(shù)據(jù)包
            125     tcpData.MakePacket();
            126 
            127 
            128     tcpData.GetPacket(Data,65535);
            129     int nLen = tcpData.GetTotalSize();
            130 
            131     //構建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     //構建以太網(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ā)送握手數(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     //設置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     //設置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     //通過捕獲數(shù)據(jù)包得到對方發(fā)過來的數(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("序號:%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 不進行設置沒有影響,據(jù)我的測試。
            205             tcpData.SetACKSerial(Ser);
            206             tcpData.CIPProtocol::SetID(257);
            207 
            208             break;
            209         }
            210 
            211     }
            212 
            213 
            214     //現(xiàn)在構建數(shù)據(jù)包
            215     tcpData.MakePacket();
            216 
            217     tcpData.GetPacket(Data,65535);
            218     nLen = tcpData.GetTotalSize();
            219 
            220     //構建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     //構建以太網(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ā)送握手數(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     //開始發(fā)送TCP 數(shù)據(jù)。
            245 
            246     CTCPProtocol tcpData1;
            247     tcpData1.CBaseNetProtol::SetMac(SrcMac,DesMac);
            248     tcpData1.CBaseNetProtol::SetProtocol(0x800);
            249 
            250     //設置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ù)的長度
            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 數(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ù)我的測試。
            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 數(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     //構建以太網(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     /* 不再需要設備列表了,釋放它 */
            301     puts("發(fā)送完畢");
            302     getchar();
            303     pcap_freealldevs(alldevs);
            304     return 0;
            305 }
            306 
            如果你有虛擬網(wǎng)卡,你還是關掉,因為我默認調用第一張網(wǎng)卡,不然就會出現(xiàn)問題。 我本來只是為了測試而已,代碼就隨便了寫了。 本想寫一個帶界面發(fā)送數(shù)據(jù)包的程序,發(fā)現(xiàn)沒有那么多精力做這個事情,不像以前在學校了。
            代碼工程:/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)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品一区二区三区不卡| 精品久久久久久亚洲精品| 国产精品久久久天天影视香蕉| 成人国内精品久久久久影院| 国产精品免费久久| 久久久亚洲AV波多野结衣| 久久午夜羞羞影院免费观看| 国产精品久久久99| 人妻无码精品久久亚瑟影视| av无码久久久久久不卡网站| 99久久精品免费| 人人狠狠综合久久88成人| 精品久久久久久无码人妻蜜桃| 伊色综合久久之综合久久| 狠狠色丁香婷综合久久| 人人妻久久人人澡人人爽人人精品| 久久久久亚洲AV无码专区体验| 精品久久久久久国产牛牛app| 亚洲一级Av无码毛片久久精品| 精品免费久久久久久久| 性做久久久久久久久久久| 2021久久国自产拍精品| 少妇久久久久久被弄到高潮| 久久亚洲私人国产精品vA | 日本精品久久久久中文字幕| 中文字幕无码av激情不卡久久| 久久中文娱乐网| 久久精品a亚洲国产v高清不卡| 欧美粉嫩小泬久久久久久久 | 亚洲精品无码久久不卡| 久久综合久久久| 999久久久免费精品国产| 久久久久久精品免费看SSS| 久久夜色撩人精品国产| 色综合久久综精品| 久久91综合国产91久久精品| 无码精品久久久久久人妻中字| 伊人久久久AV老熟妇色| 久久人妻少妇嫩草AV蜜桃| 久久久久亚洲AV无码专区首JN| 性高朝久久久久久久久久|