時光機

2009年8月3日 星期一

如何使用Winpcap取得網卡的MAC位址

Winpcap在一般的pcap_開頭的函式中似乎沒有提供網卡MAC資料的取得方法,但是其實在Winpcap函式庫更底層的Packet.dll中有導出相關函式

Packet.dll的頭文件為Packet32.h,lib為Packet.lib

它似乎是比wpcap.dll更底層(wpcap.dll似乎是透過packet.dll跟ring0中的NPF驅動作溝通)

packet.dll少數的範例文件存在於winpcap原始碼包中的Examples\PacketDriver

裡面有一個範例就是取得MAC(GetMacAddress.c)

下面是一小段我寫出來的程式,主要參考GetMacAddress.c 部份文件是參考packet32.h和ntddndis.h


temp=4096;
PacketGetAdapterNames((PTSTR)dev_names,&temp); //列舉網卡名稱
i=0;
j=0;
oid_data=(PPACKET_OID_DATA)new u_char[sizeof(PACKET_OID_DATA)+6]; //取得資訊用的緩衝區
RtlZeroMemory(oid_data,sizeof(PACKET_OID_DATA)+6);
while(dev_names[i]!='\0' || dev_names[i+1]!='\0'){
dev_name[j]=dev_names[i];
if(dev_names[i]=='\0'){
dev_adapter=PacketOpenAdapter(dev_name); //開啟網卡
oid_data->Oid=OID_802_3_CURRENT_ADDRESS; //要取得的資訊類型,
oid_data->Length=6;
PacketRequest(dev_adapter,FALSE,oid_data); //送出請求

printf("%sMAC=%02x:%02x:%02x:%02x:%02x:%02x\n",dev_name,
oid_data>Data[0],
oid_data->Data[1],
oid_data->Data[2],
oid_data->Data[3],
oid_data->Data[4],
oid_data->Data[5],
j=0;
}

i++;
j++;
}

1 則留言:

自動搜尋器

關於我們