Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как на сервере определить MAC клиента?


MegaVolt ©   (2004-11-08 18:23:00) 

Есть приложение сервер исспользуется TServerSocket. Можно ли узнать MAC подключившегося пользователя? IP прописан явно в RemotAddress может так же просто можно получить и MAC?


Rouse_   (2004-11-09 13:02:00) [1]

Собственно говоря пример получения MAC адреса из ARP таблицы по совету [12] Verg © , как раз тут и лежит: > [2] Piter ©   (08.11.04 20:13)


Verg   (2004-11-09 11:47:00) [2]


> Т.е. всё что связано с сокетом я могу просто удалить и оставить
> просто работу с таблицей?


Все, что связано с UDPсокетом.

Непосредственно после подключения клиента проси арп кеш (GetIpNetTable) и ищи в нем Socket.RemoteAddress.
Арп кеш чистится: из него удаляются записи, которыми не пользовались в течение 30 сек, по-моему. Так что, "клювом щелкать" не рекомендуется.


MegaVolt   (2004-11-09 11:27:00) [3]

VergСпасибо за ответ :)
1. Задача сейчас поймать хулиганов в чате. Для этого был нарисован прозрачный экран который анализирует пакеты и плохие пихает в логи :) Чтобы понять кто это гадит нуна знать IP и желательно MAC. Вот для того чтобы можно было поймать и надавать по ушам и делаю поиск мака.

2. Ты пишешь что не обязательно посылать запрос. Т.е. всё что связано с сокетом я могу просто удалить и оставить просто работу с таблицей?


MegaVolt   (2004-11-09 11:25:00) [4]

VergСпасибо за ответ :)
1. Задача сейчас поймать хулиганов в чате. Для этого был нарисован прозрачный экран который анализирует пакеты и плохие пихает в логи :) Чтобы понять кто это гадит нуна знать IP и желательно MAC. Вот для того чтобы можно было поймать и надавать по ушам и делаю поиск мака.

2. Ты пишешь что не обязательно посылать запрос. Т.е. всё что связано с сокетом я могу просто удалить и оставить просто работу с таблицей?


Verg   (2004-11-09 10:04:00) [5]


> [8] MegaVolt ©   (09.11.04 09:25)


Во-первых. Если ты хочешь найти в арп кеше запись подключившегосяклиента, то зачем спрашивается отправлять ему какие-то UDP датаграммы? Подключение-то уже произошло и значит, обмен IP пакетами уже произошел. Т.о. в арп-кеше либо уже есть инф-ция о клиенте, либо ее нет. Если нет, то и никогда не будет. Хоть запосылайся UDP. Просто клиент в другом сегменте.
Во-вторых. Если задача не из разряда "учебных" и если речь идет об авторизации, то еще раз посоветую - не трать сил попусту. Привязка ip-mac еще ничего, кроме неудобств не приносила. Это как привязка софта с серийнику аппартуры. Лучше уж потратиться на какой-либо криптоалгоритм авторизации или вообще шифрования. И знаний прибавится и система будет гибче на порядок. У нас в городе, например, по-моему всего один провайдер остался, у которого все еще ip-mac привязка осталась. Да и то как "копчик"...
Все ушли на VPN. Нет, можно напрямую работать, но
"п.2.3.7. В целях предотвращения несанкционированного доступа злоумышленников в Сеть с реквизитами Абонента, Абонент должен использовать систему авторизации. Если система авторизации Абонентом не использовалась, претензии по начисленному на Лицевой Счет Абонента объему трафика не принимаются. Система авторизации и статистика работы системы авторизации предоставляется Абоненту Оператором кабельных сетей."
В данный момент Вы можете воспользоваться для защиты либо программой авторизации, либо установить VPN-тоннелирование (с точки зрения п.2.3.7 Регламента приравнивается к системе авторизации).


MegaVolt   (2004-11-09 09:25:00) [6]

К сожалению пример только под 2k и выше :(

Короче я решил вопрос вот так:

function GetMAC(IP:PChar):string;      // Получение MAC-адреса сетевого компьютера
const Data  : string = 'Test';
var   UDP_in    : TSockAddrIn;
     pBuf      : PChar;
     TableSize : DWORD;
     Error     : DWORD;
     NumEntries: DWORD;
     IpNetRow  : TMibIpNetRow;
     I         : Integer;
     MAC       : string;
     UDP_Socket:TSocket;
     WSA_Data  : TWSAData;
begin
  UDP_Socket:=Socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);       // Создаём UDP-сокет
  MAC:='00-00-00-00-00-00';
  UDP_in.sin_family:=AF_INET;
  UDP_in.sin_port:=htons(5232);                                      // Шлем на любой порт
  UDP_in.sin_addr.S_addr:=inet_addr(IP);                             // Указываем нужный адрес
  if SendTo(UDP_Socket,Data,5,0,UDP_in,SizeOf(UDP_in)) > 0
    then
      begin
        TableSize:=0;
        Error:=GetIpNetTable(PTMibIpNetTable(pBuf),@TableSize,True);    // first call: get memsize needed
        if Error <> ERROR_NO_DATA
          then
            begin
              GetMem(pBuf,TableSize);
              Error:=GetIpNetTable(PTMibIpNetTable(pBuf),@TableSize,True); // get table pointer
              if Error = NO_ERROR
                then
                  begin
                    NumEntries:=PTMibIpNetTable(pBuf)^.dwNumEntries;
                    if NumEntries > 0
                      then
                        begin
                          inc(pBuf,SizeOf(NumEntries));
                          for I:=1 to NumEntries do
                            begin
                              IpNetRow:=PTMibIpNetRow(pBuf)^;
                              with IpNetRow do
                                if (dwAddr = inet_addr(IP))and(dwType<>2)
                                  then MAC:=MacAddr2Str(bPhysAddr,dwPhysAddrLen);
                                inc(pBuf,SizeOf(IpNetRow));
                            end;
                          dec(pBuf,SizeOf(DWORD)+NumEntries*SizeOf(IpNetRow));
                        end;
                  end;
              FreeMem(pBuf);
            end;
      end;
  Result:=MAC;
  CloseSocket(UDP_Socket);
end;


MegaVolt   (2004-11-09 09:08:00) [7]

Задача не очень бессмысленна если учесть пристрастие к изменению IP. Хорошо что ещё не все умеют MAC-и менять.

PiterНа счёт того что в MSDN такой функции нет ты прав. Но возможно что в MSDN уже и нету инфы про 98 :( Так что я посмотрел что библиотека есть и решил проверить :) Большущее спасибо за ссылку.


Piter   (2004-11-08 23:19:00) [8]

Verg ©   (08.11.04 20:33) [5]
Бессмысленная задача.


Это почему же?

Например, в локальной сети раздача интернета идет по логину, паролю на прокси сервере, но при этом дополнительно проверяется MAC адрес - так очень часто делают. И с каких пор это стало бессмысленным?


Verg   (2004-11-08 20:33:00) [9]

Бессмысленная задача.


Piter   (2004-11-08 20:14:00) [10]

насчет SendARP:
"Client: Requires Windows XP or Windows 2000 Professional.
Server: Requires Windows Server 2003 or Windows 2000 Server"


Piter   (2004-11-08 20:13:00) [11]

http://rouse.front.ru/

infofromip.zip:

Демонстрационная программа получения информации о компьютере на основе IP адреса
Позволяет узнать:
- Имя компьютера
- Список залогиненных пользователей
- Коментарий к компьютеру
- Провайдер (не тот который вы подумали :)
- MAC адресс
- Домен в который входит компьютер
- Если сеть доменная то дополнительно определяет имя сервера домена и группы в которые входит текущий пользователь...


Piter   (2004-11-08 20:13:00) [12]

там исходник на Delphi


MegaVolt   (2004-11-08 19:33:00) [13]

Попробовал SendARP пишет сетевой запрос не поддерживается. 98 похоже не поддерживает :(


Наверх

Титульная страница Поиск, карта сайта Написать письмо