¡¡¡¡ÔÚÊý¾Ý°ü²¶»ñ³ÌÐòÖУ¬Í¨¹ýÉèÖÃÍø¿¨¹¤×÷ÓÚ»ìÔÓ״̬£¬¶ÔÍøÂçÁ´Â·½øÐмàÌý²¢ÊÕ¼¯Êý¾Ý°ü£¬´Ó¶ø»ñµÃÊý¾Ý°üÍ·ÐÅÏ¢¡£
¡¡¡¡2¡¢Êý¾Ý°ü²¶»ñÄ£¿éʵÏÖ
¡¡¡¡¸ÃÊý¾Ý°ü²¶»ñ³ÌÐòÓÃCÓïÑÔÀ´±àд£¬³ÌÐòÖÐÓõ½ºÜ¶àLinuxÍøÂç±à³ÌÖеĺ¯Êý¡£
¡¡¡¡£¨1£©ÉèÖÃÍøÂç½Ó¿ÚΪ»ìÔÓģʽ
¡¡¡¡ÍøÂç½Ó¿ÚµÄ»ìÔÓģʽʹµÃÒ»¸öÍøÂç½Ó¿ÚÉ豸´ÓÖ»ÄܶÁȡĿ±êµØÖ·Îª6×Ö½ÚMACµØÖ·µÄÊý¾Ý°ü£¬±äΪ¿É¶ÁÈ¡ÍøÂç¹ã²¥Ã½ÌåÖеÄËùÓÐÊý¾Ý°ü¡£¸Ã²¿·Öͨ¹ýÁ½´Îioctlº¯Êýµ÷ÓÃʵÏÖ£º
¡¡
ÒýÓÃ:¡¡¡¡ioctl(sock, SIOCGIFFLAGS, &ifr)
¡¡¡¡ifr.ifr_flags |= IFF_PROMISC
¡¡¡¡ioctl(sock, SIOCGIFFLAGS, &ifr)
¡¡¡¡µÚÒ»´ÎµÄioctlº¯Êýµ÷Óã¬ÓÃÀ´½Ø»ñifr(struct ifreq)½á¹¹ÖÐËùº¬½Ó¿ÚÃû³ÆËùÖ¸½Ó¿ÚµÄ±ê¼Ç¡£µÚÒ»¸ö²ÎÊýÊÇ´ò¿ªµÄÔʼÌ×½Ó×ÖÃèÊö·û¡°sock¡±£¬µÚ¶þ¸ö²ÎÊýÊÇËùÒªÖ´ÐеÄÇëÇó²Ù×÷¡£µÚÈý¸ö²ÎÊýÊǽӿÚÇë ÇóÊý¾Ý½á¹¹µÄµØÖ·Ö¸Õ룬¸Ã½á¹¹Öаüº¬ÁËËùÒÔ½øÐÐÇëÇó²Ù×÷µÄ½Ó¿ÚÃû³ÆÖµ¡£
¡¡¡¡ÎÒÃÇͨ¹ý½«»ìºÏ±ê¼Ç(IFF_PROMISC)Ó¦Óõ½½Ó¿ÚÇëÇó½á¹¹µÄ±ê¼Çλ±äÁ¿ÖÐÀ´¸Ä±ä½Ó¿Ú±ê¼Çλ¡£²Ù×÷·û¡°|=¡±½«»ìºÏ±ê¼Ç·ûÓëÔÓеĽӿڱê¼Ç½øÐÐ ¡°»ò¡±²Ù×÷À´ÉèÖÃеĽӿڱê¼Ç¡£»ñµÃеĽӿڱê¼Çºó£¬½«ÆäÉèÖõ½Êµ¼Ê½Ó¿ÚÖС£µÚ¶þ´ÎµÄioctlµ÷Ó㬽«½Ó¿ÚÉ豸ÉèÖÃΪ»ìºÏģʽ¡£ÕýÈçµÚÒ»¸öioctlµ÷ ÓÃÊÇ»ñµÃÍøÂç½Ó¿ÚµÄ±ê¼Ç£¬Õâ´Îµ÷ÓÃÊÇÉèÖÃifr½á¹¹ÖÐÐ޸ĹýµÄбê¼Çдµ½ÎïÀí½Ó¿ÚÉÏ¡£
¡¡¡¡£¨2£©´ò¿ªSocketÉ豸
¡¡¡¡ÓÃsocketº¯ÊýÀ´´ò¿ªSocketÉ豸¡£sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)).domainÓòʹÓÃAF_PACKET,Äܹ»¼È½ÓÊÕÁ´Â·²ãÒ²½ÓÊÕÍøÂç²ãµÄÊý¾Ý°ü¡£
¡¡¡¡£¨3£©½ÓÊÕÊý¾Ý
¡¡¡¡Ê¹ÓÃrecvfrom()º¯ÊýÀ´ÊµÏÖ½ÓÊÕÊý¾Ý°ü£º
ÒýÓÃ:¡¡¡¡recvfrom(sock,(char *)buf,sizeof(buf),
0, (struct sockaddr *)&addr,&len)
¡¡¡¡ÕâÊÇ´Ó´ò¿ªµÄÍøÂç²å×ùSocket¶ÁÈ¡Êý¾Ý°üµÄµØ·½£¬µ«Òª×¢Ò⣬addr½á¹¹ÓÐÒ»¸öÇ¿ÖÆÀàÐÍת»»£¬ÒÔÊÊÓ¦recvfrom()º¯ÊýµÄÓï·¨ÒªÇó£¬recvfrom()º¯ÊýÔڳɹ¦¶ÁÈ¡µÄÇé¿öÏ·µ»Ø¶ÁÈ¡µÄ×Ö½ÚÊý£¬·ñÔò·µ»Ø-1¡£
¡¡¡¡£¨4£©ÅжϰüÍ·Ö¸Õë
¡¡¡¡¸ÃÊý¾Ý°ü²¶»ñÄ£¿é¿ÉÒÔ½ÓÊÕµ½µÄÊý¾Ý°ü¶¼ÊÇÔʼÊý¾Ý°ü£¬ËüÃǵĸñʽһ°ãÏÈÊÇÒÔÌ«ÍøÊý¾ÝÖ¡µÄÍ·²¿£¬½Ó×ÅÊÇARP»òÕßIPÊý¾Ý°üµÄÍ·²¿¡£IPÊý¾Ý°üºó½ô¸ú×Å TCP»òUDP¡¢ICMPµÄÍ·²¿£¬×îºó²ÅÊÇÕæÕýÒª´«ÊäµÄÊý¾Ý¡£ÓÚÊÇ£¬ÔÚ²ð·ÖIPÊý¾Ý°üʱ£¬ÏÈÌáÈ¡ÒÔÌ«ÍøÊý¾ÝÖ¡µÄÍ·²¿£¬ÔÙÌáÈ¡IPÊý¾Ý°üµÄÍ·²¿£¬È»ºó·ÖÎö TCP»òUDP¡¢ICMPÊý¾Ý°üµÄÍ·²¿¡£×îºó£¬´ÓÊý¾Ý°üÌáÈ¡³öÐèÒªµÄÊý¾Ý¡£
¡¡¡¡3¡¢³ÌÐòÖÐÓõ½µÄһЩ½á¹¹Ìå½âÎö
¡¡¡¡£¨1£©sockadd_in½á¹¹Ìå
¡¡¡¡ÔÚÍøÂçÖеÚÒ»¸ö±»´´ÔìµÄ½á¹¹ÀàÐÍÊÇsockaddr¡£Õâ¸öÊý¾Ý½á¹¹ÊÇΪÐí¶àÀàÐ͵ÄÌ×½Ó¿Ú´¢´æµØÖ·ÐÅÏ¢¡£ËüµÄ¶¨ÒåÈçÏ£º
ÒýÓÃ:¡¡¡¡struct sockaddr{
¡¡¡¡unsigned shortsa_family£» /*Õâ¸öÊǵØÖ·×壬ͨ³£ÊÇAF-xxxxµÄÐÎʽ*/
¡¡¡¡charsa_data[14]£» /*14×ֽڵĵØÖ·ÐÅÏ¢*/
¡¡¡¡}£»
¡¡¡¡£¨2£©ethhdr½á¹¹Ìå
¡¡¡¡ÒÔÏÂÊÇÏàÓ¦Êý¾Ý½á¹¹£º
ÒýÓÃ:¡¡¡¡struct ethhdr
¡¡¡¡{
¡¡¡¡unsigned char h_dest[ETH_ALEN]£»/*48λµÄÄ¿±êµØÖ·µÄÍø¿¨ÎïÀíµØÖ·*/
¡¡¡¡unsigned char h_source[ETH_ALEN]£»/*48λµÄÔ´µØÖ·µÄÎïÀíÍø¿¨µØÖ·*/
¡¡¡¡unsigned short h_proto£»/*16λµÄÒÔÌ«ÍøÐÒé*/
¡¡¡¡}
¡¡
¡¡¡¡£¨3£©iphdr½á¹¹Ìå
¡¡¡¡ÕâÊÇLinux µÄipÐÒ鱨ͷ£¬Õë¶Ô°æ±¾µÄ²»Í¬Ëü¿ÉÒÔÓв»Í¬µÄ¶¨Ò壬ÎÒÃǹúÄÚÒ»°ãÓÃBIGµÄ¶¨Ò壬ÆäÖÐversion ÊÇipµÄ°æ±¾£¬protocolÊÇipµÄÐÒé·ÖÀ࣬saddrÊÇ32λµÄÔ´ipµØÖ·£¬daddrÊÇ32λµÄÄ¿±êipµØÖ·¡£
¡¡¡¡£¨4£©tcphdr½á¹¹Ìå
¡¡¡¡ÕâÊÇLinux ÏÂtcpÐÒéµÄÒ»²¿·Ö,ÓëipÐÒéÏàͬȡBIG£¬ÆäÖÐsourceÊÇÔ´¶Ë¿Ú£¬dest ÊÇÄ¿µÄ¶Ë¿Ú£¬seqÊÇsÐò£¬ack_seqÊÇaÐòºÅ£¬ÆäÓàµÄÊÇtcpµÄÁ¬½Ó±êÖ¾ÆäÖаüÀ¨6¸ö±êÖ¾£ºsyn±íʾÁ¬½ÓÇëÇó£¬urg ±íʾ½ô¼±ÐÅÏ¢£¬fin±íʾÁ¬½Ó½áÊø£¬ack±íʾÁ¬½ÓÓ¦´ð£¬psh±íÊ¾ÍÆÕ»±êÖ¾£¬rst±íʾÖжÏÁ¬½Ó¡£windowÊDZíʾ½ÓÊÜÊý¾Ý´°¿Ú´óС£¬checkÊÇУ ÑéÂ룬urg ptrÊǽô¼±Ö¸Õë¡£
¡¡¡¡£¨5£©udphdr½á¹¹Ìå
¡¡¡¡ÕâÊÇLinuxÏÂipÐÒéÖÐudpÐÒéµÄÒ»²¿·Ö,ÒÔÏÂÊÇÏàÓ¦Êý¾Ý½á¹¹£º
ÒýÓÃ:¡¡¡¡struct udphdr
¡¡¡¡{
¡¡¡¡u_int16_t source;/* Ô´¶Ë¿Ú*/
¡¡¡¡u_int16_t dest;/* Ä¿µÄ¶Ë¿Ú*/
¡¡¡¡u_int16_t len;/* udp ³¤¶È*/
¡¡¡¡u_int16_t check;/*УÑéÂë*/
¡¡¡¡}