Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема определения MAC-адреса 
:(
    Опции темы
p0s0l
Дата 6.11.2004, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 1
Всего: 112



Мне надо сделать привязку программы к железу.
Один из параметров привяки - MAC адрес сетевого адаптера.
Но возникли трудности... Не нашёл способа уверенного определения MAC-адреса.
Способы, которые я пробовал - ненадёжные...

1) Через функцию Netbios (см. DRKB).
Если нет сетевого подключения, получается облом... smile

2) Через сокеты (см. DRKB): socket, getsockopt.
Не работает в любом случае... Пока не разбирался в чём дело...

3) Создание GUID/UUID
В GUID/UUID используется MAC-адрес.
Опять же, если нет сетевого подключения, то будет кирдык - либо возьмётся MAC-адрес другого активного адаптера (например, их устанавливает VMWare), либо если их нет, будет какая-то ерунда вместо MAC-адреса...

4) Ip Helper API
GetAdaptersAddresses - в возвращаемой структуре есть поле PhysicalAddress, но почему он один ? А если несколько адаптеров ? В любом случае, на моём компе это поле заполняется нулями...
SendARP (inet_addr('127.0.0.1'), 0, ...) - не пашет... как им пользоваться ?
GetIpNetTable - в bPhysAddr что-то не то...
GetAdaptersInfo - работает, но опять же только если соединение активно smile


КАК БЫТЬ ? Какие идеи ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Girder
Дата 10.11.2004, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Цитата(p0s0l @ 6.11.2004, 16:49)
SendARP (inet_addr('127.0.0.1'), 0, ...) - не пашет... как им пользоваться ?
К примеру вот так smile :
Код
uses ... winsock;
...
function SendARP(DestIP:DWord; SrcIP:DWord; pMacAddr:PULONG;
PhyAddrLen:PULONG):DWORD; stdcall; external 'IPHLPAPI.DLL';

var
 Form1: TForm1;

implementation

{$R *.dfm}

function GetIP():string;
var WSAData:TWSAData;
   p:PHostEnt;
   hName:array [0..255] of Char;
begin
WSAStartup($101,WSAData);
GetHostName(hName,255);
p:=GetHostByName(hName);
Result:=inet_ntoa(PInAddr(p.h_addr_list^)^);
WSACleanup;
end;

function GetMacByIP(const sIP:string):string;
var DestIP:integer;
   AddrLen:u_long;
   MacAddr: array[1..6] of byte;
   s:string;
   i:integer;
begin
DestIP:=inet_addr(pchar(sIP));
AddrLen:=sizeof(MacAddr);
if (SendARP(DestIP,0,PULONG(@MacAddr),@AddrLen)=0)and(AddrLen>0) then
 begin
  for i:=1 to AddrLen-1 do s:=s+IntToHex(MacAddr[i],2)+'.';
  s:=s+IntToHex(MacAddr[AddrLen],2);
 end else s:='00.00.00.00.00.00';
Result:= s;
end;

...
Использование: Caption:=GetMacByIP(GetIP) или Caption:=GetMacByIP('192.168.1.1')...

Цитата(p0s0l @ 6.11.2004, 16:49)
КАК БЫТЬ ? Какие идеи ?

Ну... можно обратиться к таблице маршрутизации на прямую, т.е. воспользоваться INETMIB1.DLL: SnmpExtensionInit - Функция инициализации; SnmpExtensionQuery - Функция запроса; SnmpExtensionTrap - Обработчик ловушек.

Проверять, при неактивном сетевом подключении, не стал... так как считаю что привязка по MAC не есть гуд... smile Т.к. МАС можно изменить!

Поясню...:
1)Для некоторых сетевых карт можно заменить МАС адресс в настройках драйвера;
2)Для некоторых... устанавливая соответствующие ключи в реестре
3)Использование двух интерфейсов - готовых реализаций в инете полно smile
4)Самый простой и надежный способ! - Корректировать драйвер сетевой карты. Т.к. драйвер сетевой карты считывает MAC-адрес через стандартные порты ввода-вывода только на этапе инициализации! Чтение MAC-адреса происходит через порт XXX и определение его не составляет труда: смотрится диапазон ввода-вывода сетевой карты... к примеру он равен=AA00h...AA1Fh => тогда XXX=AA00h+10h=AA10h... ну а дальше SoftIce и bpio AA10 r и... и... я думаю поймеш дальше сам... smile

PS: Даже если ты сделаеш определение МАС адресса через порт(имхо: самый надежный спрособ smile ), то... не хороший юзер... все равно быстро енто отсечет и воспользуется 4 способом... но уже не для драйвера, а для твоей программы.

Удачи.

Это сообщение отредактировал(а) Girder - 10.11.2004, 02:55


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 10.11.2004, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 1
Всего: 112



Цитата
Т.к. МАС можно изменить!

Это понятно. Но моя прога сама не знает, какой MAC-адрес правильный (она лишь может сказать, есть изменения в аппаратуре или нет, а в чём именно изменения - это она не знает), поэтому какой адрес юзер будет ставить ?
Короче, тут всё продумано (вроде smile), даже если саму прогу кто-то заломает - он потом об этом пожалеет smile

Цитата(Girder @ 10.11.2004, 02:08)
К примеру вот так
Спасибо.... Но так не интересно smile Вот заставить бы для 127.0.0.1 работать - было бы круто, хотя нельзя видимо. А таким способом - это опять же узнаётся только адаптер активного соединения... smile
Еще пробовал через WMI - такая же фигня...
Придётся отказаться от MAC-адреса...




--------------------
С уважением, г-н Посол.
PM   Вверх
Akella
  Дата 11.12.2004, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



В WinXP такая программка исчезла, а в Win98 она была smile

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  IPConfig.zip
PM MAIL   Вверх
Akella
  Дата 11.12.2004, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



пример, как работать с ARP

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  ARP.zip
PM MAIL   Вверх
Akella
  Дата 11.12.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



забыл, может быть, понаlобится WinSock2

Это сообщение отредактировал(а) dsergey - 11.12.2004, 10:19

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  Winsock2.zip
PM MAIL   Вверх
dm9
Дата 13.12.2004, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: нет
Всего: 137



Мне тоже сначала пришла в голову мысль использовать ipconfig /all smile
PM MAIL ICQ   Вверх
Alex
Дата 13.12.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 4
Всего: 162



Цитата(dsergey @ 11.12.2004, 10:14)
В WinXP такая программка исчезла, а в Win98 она была

Ни куда она не изчезала Пуск->Выполнить->cmd /k ipconfig /all


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 17.12.2004, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 1
Всего: 112



dsergey, спасибо smile, но это всё равно не то что нужно...

Цитата(dm9 @ 13.12.2004, 05:41)
Мне тоже сначала пришла в голову мысль использовать ipconfig /all

IPConfig предназначен для IP-адресов, они назначаются при активном подключении. Нет подключения - нет IP-адреса, нет и MAC-адреса (если смотреть через IPConfig)...

Короче, всё в итоге сводится к такому вопросу:
Как узнать MAC-адрес, даже если нет сетевого подключения ?
Все API-функции, которые я просмотрел, думают, что если нет сетевого подключения, то как будто бы и нет сетевой карты вообще, физически...

Если делать через порт - то шкурка выделки не стоит...



--------------------
С уважением, г-н Посол.
PM   Вверх
Akella
Дата 23.12.2004, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



ну звыняйте, бананив у нас нэмае smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1330 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.