Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

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

 
MegaVolt ©   (2004-11-08 18:23) [0]

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


 
MegaVolt ©   (2004-11-08 19:33) [1]

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


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

http://rouse.front.ru/

infofromip.zip:

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


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

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


 
Piter ©   (2004-11-08 20:14) [4]

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


 
Verg ©   (2004-11-08 20:33) [5]

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


 
Piter ©   (2004-11-08 23:19) [6]

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


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

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


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

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

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


 
MegaVolt ©   (2004-11-09 09:25) [8]

К сожалению пример только под 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;


 
Verg ©   (2004-11-09 10:04) [9]


> [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 11:25) [10]

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

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


 
MegaVolt ©   (2004-11-09 11:27) [11]

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

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


 
Verg ©   (2004-11-09 11:47) [12]


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.034 c
1-1105953088
koshak
2005-01-17 12:11
2005.01.30
Что-то вроде InnoSetup


4-1102570024
NetDigger
2004-12-09 08:27
2005.01.30
Работа с окнами


1-1105653572
Alex_S
2005-01-14 00:59
2005.01.30
Label.Caption запаздывает


3-1103908935
vixic
2004-12-24 20:22
2005.01.30
TDataSetProvider


14-1105518621
Tornado
2005-01-12 11:30
2005.01.30
Помогите с PHP