• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 在Linux下如何利用C語言來實現(xiàn)一個Sniffer

    在Linux下如何利用C語言來實現(xiàn)一個Sniffer

    作者: 時間:2010-08-25 來源:網(wǎng)絡(luò) 收藏

      if (n42) {

      perror(recvfrom():);

      printf(Incomplete packet (errno is %d)n,

      errno);

      close(sock);

      exit(0);

      }

      ethhead = buffer;

      printf(Source MAC address:

      %02x:%02x:%02x:%02x:%02x:%02xn,

      ethhead[0],ethhead[1],ethhead[2],

      ethhead[3],ethhead[4],ethhead[5]);

      printf(Destination MAC address:

      %02x:%02x:%02x:%02x:%02x:%02xn,

      ethhead[6],ethhead[7],ethhead[8],

      ethhead[9],ethhead[10],ethhead[11]);

      iphead = buffer+14; /* Skip Ethernet header */

      if (*iphead==0x45) { /* Double check for IPv4

      * and no options present */

      printf(Source host %d.%d.%d.%dn,

      iphead[12],iphead[13],

      iphead[14],iphead[15]);

      printf(Dest host %d.%d.%d.%dn,

      iphead[16],iphead[17],

      iphead[18],iphead[19]);

      printf(Source,Dest ports %d,%dn,

      (iphead[20]8)+iphead[21],

      (iphead[22]8)+iphead[23]);

      printf(Layer-4 protocol %dn,iphead[9]);

      }

      }

      }

      PF_PACKET協(xié)議簇可以讓應(yīng)用程序把數(shù)據(jù)包變成似乎從網(wǎng)絡(luò)層接收的樣子,但是沒有辦法抓到那些不是發(fā)向自己主機(jī)的包。正如我們前面看到的,網(wǎng)卡丟棄所有不含有主機(jī)MAC地址的數(shù)據(jù)包,這是因為網(wǎng)卡處于非混雜模式,即每個網(wǎng)卡只處理源地址是它自己的幀!

      只有三個例外:如果幀的目的MAC地址是受限的廣播地址(255.255.255.255)那么它將被所有的網(wǎng)卡接收:如果一個幀的目的地址是組播地址,那么它將被那些打開組播接收功能的網(wǎng)卡所接收;網(wǎng)卡如被設(shè)置成混雜模式,那么它將接收所有流經(jīng)它的數(shù)據(jù)包最后一種情況當(dāng)然是我們最感興趣的了,把網(wǎng)卡設(shè)置成混雜模式,我們只需要發(fā)出一個特殊的ioctl()調(diào)用在那個網(wǎng)卡上打開一個socket,因為這是一個具有危險性的操作,所以這個調(diào)用只有具有root權(quán)限的用戶才可完成,假設(shè)那個“sock”包含一個已經(jīng)打開的socket。

    linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

    上一頁 1 2 下一頁

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 黄浦区| 平顺县| 商洛市| 津市市| 清涧县| 南丹县| 灵石县| 邵阳市| 嘉禾县| 民权县| 庆阳市| 阳曲县| 祁门县| 青岛市| 桂林市| 嘉峪关市| 皮山县| 普兰店市| 兴化市| 库尔勒市| 林周县| 南城县| 太仆寺旗| 河源市| 丰台区| 开封市| 安岳县| 汶川县| 明水县| 汕头市| 利津县| 宜川县| 维西| 利辛县| 锦屏县| 来宾市| 抚远县| 仪陇县| 上蔡县| 拜泉县| 津市市|