۱۳۸۸/۰۴/۱۴

پيدا كردن MAC Address از روي IP


دستگاه كارتخوان تحت شبكه‌اي را تصور كنيد كه تا ديروز در شبكه ديده مي‌شد اما امروز ناپديد شده! ديگر نمي‌شود با آن ارتباط برقرار كرد و توسط برنامه نوشته شده آن‌را تخليه كرد. به صورت پيش فرض يك IP ثابت به اين دستگاه‌ها انتساب داده مي‌شود مثلا 192.168.1.100 . حال اگر در شبكه اين IP رزرو نشود ممكن است DHCP اين IP را به كامپيوتر ديگري بدهد يا روتري به اشتباه از آن استفاده كند. الان چطور بايد تشخيص داد كه اين IP توسط چه وسيله‌اي در حال استفاده است؟
براي بدست آوردن MAC Address يك ديوايس در شبكه از دستور خط فرمان ARP مي‌توان استفاده كرد. براي مثال:

arp -a

و يا :
arp -a findstr 192.168.1.100


اگر در اين ليست‌ها MAC Address آي پي مورد نظر شما يافت نشد، ابتدا آن IP را ping كنيد و بعد دستورات فوق را استفاده نمائيد. علت هم اين است كه دستورات فوق تنها ARP table ايي را بر اساس ارتباطات ايستگاه كاري فعلي با شبكه نمايش مي‌دهند و اگر كامپيوتر فعلي هيچ ارتباطي با IP مورد نظر نداشته باشد، خروجي خاصي را نمايش نخواهد داد.

حال اگر با برنامه نويسي بخواهيم اين‌كار را انجام دهيم با استفاده از تابع API زير نيز مي‌توان به همين نتيجه رسيد:

[System.Runtime.InteropServices.DllImport("Iphlpapi.dll", EntryPoint = "SendARP")]
internal extern static Int32 SendArp(Int32 destIpAddress, Int32 srcIpAddress, byte[] macAddress, ref Int32 macAddressLength);

public static System.Net.NetworkInformation.PhysicalAddress GetMacFromIP(System.Net.IPAddress IP)
{
if (IP.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
throw new ArgumentException("supports just IPv4 addresses");

Int32 addrInt = IpToInt(IP);
Int32 srcAddrInt = 0;
byte[] mac = new byte[6]; // 48 bit

int length = mac.Length;
int reply = SendArp(addrInt, srcAddrInt, mac, ref length);

byte[] emptyMac = new byte[12];

if (reply != 0)
{
//No MAC Address found for the IP Address
return new System.Net.NetworkInformation.PhysicalAddress(emptyMac);
}
return new System.Net.NetworkInformation.PhysicalAddress(mac);
}

private static Int32 IpToInt(System.Net.IPAddress IP)
{
byte[] bytes = IP.GetAddressBytes();
return BitConverter.ToInt32(bytes, 0);
}
مك آدرسي كه در حال استفاده از IP ما بود:
00:0F:8F:F1:EE:40

مك آدرس واقعي دستگاه كارتخوان:
00.64.00.00.5E.7A

اين تداخل رخ داده، باعث شده بود كه ارتباط با دستگاه كارتخوان قطع شود. همانطور كه مي‌دانيد سه بايت اول هر مك آدرس مي‌تواند بيانگر شركت سازنده‌اي باشد. 00:0F:8F مربوط به روترهاي سيسكو است.