получение MAC адреса
От: ebersen  
Дата: 30.01.04 10:02
Оценка:
Привет Всем!

Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...
Re: получение MAC адреса
От: Flex2 Россия  
Дата: 30.01.04 14:02
Оценка:
Здравствуйте, ebersen, Вы писали:

E>Привет Всем!


E>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


1. есть хорошая команда ARP ДОС сесии. Типа ARP>>filename.txt, а потом разбираешь файл
2. через WinSock(не помню как, гже-то исходники валялись)
3 пошли сам себе сообщение и заснифь пакет IP
Re: получение MAC адреса
От: Flex2 Россия  
Дата: 30.01.04 14:05
Оценка:
Здравствуйте, ebersen, Вы писали:

E>Привет Всем!


E>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


На уровне драйвера сетевой карты MAC можно перехватить двумя способами:
тупой: фильтровать весь трафик и смотеть адрес в заголовке пакета
поумней: перехватывать конфигурационные запросы от системы (NDIS), среди них есть запрос и об адресе карты.
А МАС, прошитый в карты, также обычно можно узнать. Например, RTL8139 (RealTech) предоставляет регистры для перепрограммирования собственного ПЗУ (где и хранит МАС). НА уровне ядра туда можно чето посмотреть.
Re[2]: получение MAC адреса
От: ebersen  
Дата: 30.01.04 14:31
Оценка:
Здравствуйте, Flex2, Вы писали:

F>Здравствуйте, ebersen, Вы писали:


E>>Привет Всем!


E>>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


F>1. есть хорошая команда ARP ДОС сесии. Типа ARP>>filename.txt, а потом разбираешь файл

F>2. через WinSock(не помню как, гже-то исходники валялись)
F>3 пошли сам себе сообщение и заснифь пакет IP

Но эти способы, на сколько я понимаю, тоже не будут работать при выключении сети...
Re[3]: получение MAC адреса
От: Flex2 Россия  
Дата: 30.01.04 14:43
Оценка:
Здравствуйте, ebersen, Вы писали:

E>Здравствуйте, Flex2, Вы писали:


F>>Здравствуйте, ebersen, Вы писали:


E>>>Привет Всем!


E>>>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


F>>1. есть хорошая команда ARP ДОС сесии. Типа ARP>>filename.txt, а потом разбираешь файл

F>>2. через WinSock(не помню как, гже-то исходники валялись)
F>>3 пошли сам себе сообщение и заснифь пакет IP

E>Но эти способы, на сколько я понимаю, тоже не будут работать при выключении сети...


Будут.
Есть еще одно.
Придется помучатся, но можно открыть дрова, эдементраной командой CreateFile и дергать сервис API DDK, он 100% имеет такую-то апи аппаратура-ядро-ситема(это тебе в DDK или ставь Numega — для разработчиков драйверов, VS от 6.0 интегрируется.)
Однакодумаю что есть более простой способ.

И что значит выключенная сеть ?
Если нет драйва под карту сетки то нет. если все "ок" и сам себя видишь то все будет работать.
Re[2]: получение MAC адреса
От: Flex2 Россия  
Дата: 30.01.04 14:50
Оценка:
Здравствуйте, Flex2, Вы писали:

F>Здравствуйте, ebersen, Вы писали:


E>>Привет Всем!


E>>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


F>1. есть хорошая команда ARP ДОС сесии. Типа ARP>>filename.txt, а потом разбираешь файл

F>2. через WinSock(не помню как, гже-то исходники валялись)
F>3 пошли сам себе сообщение и заснифь пакет IP
Кто тебе мешает послать сообщение на адрес 127.0.0.1 — это localhost всегда — Сам себе пошли .
Все пройдет по 7 уровней арзхитектуре TCP/IP от 1 приложения ко 2.
Re[4]: получение MAC адреса
От: ebersen  
Дата: 30.01.04 14:59
Оценка:
Здравствуйте, Flex2, Вы писали:

F>Здравствуйте, ebersen, Вы писали:


E>>Здравствуйте, Flex2, Вы писали:


F>>>Здравствуйте, ebersen, Вы писали:


E>>>>Привет Всем!


E>>>>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


F>>>1. есть хорошая команда ARP ДОС сесии. Типа ARP>>filename.txt, а потом разбираешь файл

F>>>2. через WinSock(не помню как, гже-то исходники валялись)
F>>>3 пошли сам себе сообщение и заснифь пакет IP

E>>Но эти способы, на сколько я понимаю, тоже не будут работать при выключении сети...


F>Будут.

F>Есть еще одно.
F>Придется помучатся, но можно открыть дрова, эдементраной командой CreateFile и дергать сервис API DDK, он 100% имеет такую-то апи аппаратура-ядро-ситема(это тебе в DDK или ставь Numega — для разработчиков драйверов, VS от 6.0 интегрируется.)
F>Однакодумаю что есть более простой способ.

F>И что значит выключенная сеть ?

F>Если нет драйва под карту сетки то нет. если все "ок" и сам себя видишь то все будет работать.

Выключенная сеть означает, что для Local Area Connection просто юзер сделал Disable. От этого же карта не перестала существовать со своим MAC'ом, но трафика ужо никакого нету.
Re[5]: получение MAC адреса
От: Flex2 Россия  
Дата: 30.01.04 15:37
Оценка:
Здравствуйте, ebersen, Вы писали:

E>Здравствуйте, Flex2, Вы писали:


F>>Здравствуйте, ebersen, Вы писали:


E>>>Здравствуйте, Flex2, Вы писали:


F>>>>Здравствуйте, ebersen, Вы писали:


E>>>>>Привет Всем!


E>>>>>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


F>>>>1. есть хорошая команда ARP ДОС сесии. Типа ARP>>filename.txt, а потом разбираешь файл

F>>>>2. через WinSock(не помню как, гже-то исходники валялись)
F>>>>3 пошли сам себе сообщение и заснифь пакет IP

E>>>Но эти способы, на сколько я понимаю, тоже не будут работать при выключении сети...


F>>Будут.

F>>Есть еще одно.
F>>Придется помучатся, но можно открыть дрова, эдементраной командой CreateFile и дергать сервис API DDK, он 100% имеет такую-то апи аппаратура-ядро-ситема(это тебе в DDK или ставь Numega — для разработчиков драйверов, VS от 6.0 интегрируется.)
F>>Однакодумаю что есть более простой способ.

F>>И что значит выключенная сеть ?

F>>Если нет драйва под карту сетки то нет. если все "ок" и сам себя видишь то все будет работать.

E>Выключенная сеть означает, что для Local Area Connection просто юзер сделал Disable. От этого же карта не перестала существовать со своим MAC'ом, но трафика ужо никакого нету.


Вопрос не в том к чему ты стучишься а в том как.
В данном случе парень хочет поиметь мак-адрес катры. ну и попролбуй, безVXD, WDM, SYS достучаться до адреса(хрен его знает какой) по базовому адрему сетевухи, как минимум тебе надо иметь привилегии уровня ядра, а имеено 0-1, и хто тебя пустит ? Уверен, что есть API, что облегчает, и что радует API форточек, либо это значение возвращается в качестве результат в структуру. Надеюсь по крайне мере.

Не знаю задачи, если быстро и надежно я бы выгрузку сгрузку в файл и потом его распарсил. Хоть как-то, но работало, а правильно потом-потом.
Re: получение MAC адреса
От: Flex2 Россия  
Дата: 31.01.04 09:44
Оценка:
Здравствуйте, ebersen, Вы писали:

E>Привет Всем!


E>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


Значит так:
Работает на ОС : Windows NT/2000/XP

DWORD SendARP(
IPAddr DestIP, // тут тот куда посылаешь запрос, IP твоей машины
IPAddr SrcIP, // тут твой адрес, может быть 0 или 127.0.0.1
PULONG pMacAddr, // мак двоичный
PULONG PhyAddrLen // его длинна

Теперь как юзать:

void GetMAC(ParamBlk FAR *parm)
{
#define p0 (parm->p[0].val)
#define p1 (parm->p[0].val)
char * szIPAddress = (char *)malloc(p0.ev_length);
char * szIPAddressS = (char *)malloc(p1.ev_length);
char * szMac;
HRESULT hr;
IPAddr ipAddr;
IPAddr ipAddrS;
ULONG pulMac[2];
ULONG ulLen;
size_t i, j;
PBYTE pbHexMac;

memcpy(szIPAddress,_HandToPtr(p0.ev_handle),p0.ev_length);
memcpy(szIPAddressS,_HandToPtr(p1.ev_handle),p1.ev_length);

ipAddr = inet_addr (szIPAddress);
ipAddrS = inet_addr (szIPAddressS);
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;
hr = SendARP (ipAddr, ipAddrS, pulMac, &ulLen);
szMac = (char *)malloc(ulLen*3);
pbHexMac = (PBYTE) pulMac;

/* Сконверитируем двоичный MAC в понятную форму */

for (i = 0, j = 0; i < ulLen — 1; ++i)
{
j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
}
sprintf (szMac + j, "%02X", pbHexMac[i]);
_RetChar(szMac); // тут вернули МАС в вызывающую функцию.
free(szMac);
free(szIPAddress);
}
P.S. Этот код заточен под библиотеку вызова из VFP, тебе надо szIPAddress и szIPAddressS указывать или явно или через твой механихм передачи параметров, так же и значения возвращать не _RetChar(szMac), а по твоему. Надеюсь разберешься.
В вызывающей программе это выглядит у меня так =GetMAC(192.168.0.148,127.0.0.1) взвращает адрес интерфейса связи IP c МАС : 00:80:48:14:46:3F
Используя это можешь узнать МАС любой машины во внутренней сети.
Ошибки вызова можно посмотреть, вызвав FormatMessage ()
Re: получение MAC адреса
От: Muchacho США  
Дата: 02.02.04 16:02
Оценка:
Здравствуйте, ebersen, Вы писали:

E>Привет Всем!


E>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


можно воспользоваться тем фактом, что Uuid, генерируемые системой зависят от MAC адреса, точнее говоря последние 6 байт UUID и есть MAC адрес

UUID NewUuid;
UuidCreate(&NewUuid); //или UuidCreateSequential(&NewUuid) в случае W2K/XP

printf("MAC address:");
for(i=2;i<7;i++)
printf("%X:",NewUuid.Data4[i]);
printf("%X",NewUuid.Data4[7]);
printf("\n");

в случае W2K/XP надо пользоваться UuidCreateSequential, т.к. UUID, генерируемые UuidCreate от MAC адреса не зависят
Re: получение MAC адреса
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.02.04 16:38
Оценка:
E>Привет Всем!

E>Не подскажет ли кто-нить, как получить MAC адрес сетевухи (сетевух) стоящих в системе (XP). Пробовал всякие GetAdaptersInfo(), но это всё не то — если тривиально выключить сеть, то указанная функция ничего не обнаружит...


Гугль, как обычно... http://www.ndis.com/faq/QA01030302.htm
Эххх... Ну ладно, раньше поиск был проблемой, но сейчас то... Стыдно, господа!
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.