определить мак адресс удаленно

Discussion in 'WASM.WIN32' started by addedie, Mar 21, 2020.

  1. addedie

    addedie New Member

    Blog Posts:
    0
    Joined:
    Aug 14, 2019
    Messages:
    25
    как програмно узнать мак адрес компьютера удаленного?
     
  2. Bedolaga

    Bedolaga Member

    Blog Posts:
    0
    Joined:
    Jul 10, 2019
    Messages:
    131
    addedie and Mikl___ like this.
  3. f13nd

    f13nd Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    MAC-адрес если что используется в пределах домена коллизий (в современном сетевом оборудовании это от сетевого разъема в компе до разъема роутера, у дедовских 10мбит хабов домен коллизий был в пределах коаксиального шланга, к которому все подключены), это типа аппаратного идентификатора сетевого интерфейса. Пожалуй только если ты соединяешь два кампуцера патч-кордом, то можешь с одного из них выяснить мак адрес соседнего. Я бы не назвал это "удаленно", для 100BASE-TX, 1000BASE-T и 1000BASE-TX эта удаленность не может превышать 100 метров.
    [​IMG]
     
    Last edited: Mar 21, 2020
    addedie likes this.
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Более того, сейчас многие локальные сети уже не используют чистый езернет. И мак-адрес может быть вам тупо недоступен за счет прослойки.
    В общем нужно больше инфы, что автор воспринимает про удаленность и о каких сетях идет речь.
     
  5. addedie

    addedie New Member

    Blog Posts:
    0
    Joined:
    Aug 14, 2019
    Messages:
    25
    Code (C):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <sys/socket.h>
    5. #include <sys/ioctl.h>
    6. #include <net/if_arp.h>
    7. #include <net/if.h>
    8. #include <netinet/in.h>
    9. #include <linux/sockios.h>
    10. #include <errno.h>
    11. int main(void)
    12. {
    13.     const char *addr = "192.168.0.2";
    14.     int             s;
    15.     struct arpreq       areq;
    16.     struct ifconf       ifc;
    17.     struct ifreq        ifrBuff[1024];
    18.     struct ifreq        *ifr;
    19.     struct sockaddr_in  *sin;
    20.     struct in_addr      ipaddr;
    21.     int num, i;
    22.     unsigned char       mac[10] = {0};
    23.     //  Create socket
    24.     if (-1 == (s = socket(AF_INET, SOCK_STREAM, 0)))
    25.     {
    26.         perror("socket");
    27.         exit(1);
    28.     }
    29.     //  Put address const char *addr to struct in_addr ipaddr
    30.     if (0 == inet_aton(addr, &ipaddr))
    31.     {
    32.         fprintf(stderr, "Error: bad dotted-decimal IP '%s'.\n", addr);
    33.         exit(1);
    34.     }
    35.     memset(&areq, 0, sizeof(areq));
    36.     sin = (struct sockaddr_in *)&areq.arp_pa;
    37.     sin->sin_family = AF_INET;
    38.     sin->sin_addr = ipaddr;
    39.     ifc.ifc_len = sizeof(ifrBuff);
    40.     ifc.ifc_buf = (char *)ifrBuff;
    41.     if (-1 == ioctl(s, SIOCGIFCONF, &ifc))
    42.     {
    43.         printf("Unable to make SIOCGIFCONF request, error %d: %s\n", errno, strerror(errno));
    44.         exit(1);
    45.     }
    46.     num = ifc.ifc_len/sizeof(struct ifreq);
    47.     for(ifr = ifc.ifc_req, i = 0; i<num; ifr++, i++)
    48.     {
    49.         if(ifr->ifr_addr.sa_family != AF_INET)
    50.             printf("[%d]: (%s) is not AF_INET interface!\n", i, ifr->ifr_name);
    51.         else
    52.             printf("[%d]: (%s) interface\n", i, ifr->ifr_name);
    53.         if(-1 == ioctl(s, SIOCGIFHWADDR, ifr))
    54.         {
    55.             printf("Unable to make SIOCGIFHWADDR request, error %d: %s\n", errno, strerror(errno));
    56.             continue;
    57.         }
    58.         memcpy(mac, (unsigned char *)&(ifr->ifr_hwaddr.sa_data), sizeof(struct sockaddr));
    59.         printf("[%d] MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
    60.                i, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    61.         strncpy(areq.arp_dev, ifr->ifr_name, 15);
    62.         if(-1 == ioctl(s, SIOCGARP, &areq))
    63.         {
    64.             printf("Unable to make ARP request, error %d: %s\n", errno, strerror(errno));
    65.             continue;
    66.         }
    67.         printf("%s -> %02X:%02X:%02X:%02X:%02X:%02X\n", addr,
    68.                 (&areq.arp_ha)->sa_data[0],
    69.                 (&areq.arp_ha)->sa_data[1],
    70.                 (&areq.arp_ha)->sa_data[2],
    71.                 (&areq.arp_ha)->sa_data[3],
    72.                 (&areq.arp_ha)->sa_data[4],
    73.                 (&areq.arp_ha)->sa_data[5]);
    74.     }
    75.     return 0;
    76. }
    ну вот код к примеру по ссылке но он для линукс, как его на винду переписать?
     
  6. f13nd

    f13nd Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    С тобой как со стенами. Ссылка.
     
    LastNoob and addedie like this.
  7. addedie

    addedie New Member

    Blog Posts:
    0
    Joined:
    Aug 14, 2019
    Messages:
    25
    вот такого поворота я неожидал, то что надо спасибо.
     
  8. ant0xa

    ant0xa New Member

    Blog Posts:
    0
    Joined:
    Jun 4, 2009
    Messages:
    29
    Если быть точным, то для Ethernet в пределах broadcast домена. Разница большая очень. Если грубо, то домен коллизий это хаб (Level-1 по OSI), а broadcast домен это свич (Level-2 по OSI). В пределах broadcast домена мак можно получить arp протоколом если разговор про IP сети.
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
  10. RETN

    RETN Member

    Blog Posts:
    4
    Joined:
    Apr 4, 2020
    Messages:
    71
    Конечно же можно :)))
    Зашлите троян на удаленную машину и узнавайте не только MAC адрес.
    f13nd, абсолютно прав.