מציאת כתובת MAC של מכשיר ברשת
-
ARP מציג לך את ה CACHE במחשב שלך שמטבע הדברים שמור אצלו רק מכשירים ששוחחו עם המחשב שלך.
NMAP אמור להיות כלי יותר טוב למשימה שלך אבל עדיין לא יציג מכשיר שלא עונה לבקשה שנשלחה אליו.
היחיד שיודע את כל הכתובות הוא הראוטר כי הוא מקצה אותם, ברוב הראוטרים יש מקום לצפות ברשימת כל המכשירים המחוברים.
פורסם במקור בפורום CODE613 ב18/01/2017 21:03 (+02:00)
-
היחיד שיודע את כל הכתובות הוא הראוטר כי הוא מקצה אותם, ברוב הראוטרים יש מקום לצפות ברשימת כל המכשירים המחוברים.
וגם זה זה רק אם הוא הDHCP.
מה שכל התוכנות עושות זה לולאה על כל האפשרויות בטווח מסכת הרשת.פורסם במקור בפורום CODE613 ב18/01/2017 21:14 (+02:00)
-
תודה רבה על התשובה!
@softsNMAP אמור להיות כלי יותר טוב למשימה שלך אבל עדיין לא יציג מכשיר שלא עונה לבקשה שנשלחה אליו.
מה פירוש "לא עונה", למה שהוא לא יענה? המכשירים לא מוגדרים לענות אוט' לבקשת ARP?
@softsהיחיד שיודע את כל הכתובות הוא הראוטר כי הוא מקצה אותם, ברוב הראוטרים יש מקום לצפות ברשימת כל המכשירים המחוברים.
יש דרך לגשת אל הראוטר דרך הקוד, כדי לקבל את כל המכשירים המחוברים?
אני רוצה לכתוב קוד שמנטר את הרשת, ובמידה והוא רואה שמכשיר מסוים (ספציפי, שיש לי את כתובת הMAC שלו) מחובר אליה מעל לפרק זמן מסוים (בערך חצי שעה), הוא שולח מייל לבעל הרשת.
לשם כך, חשבתי להשתמש בשאילתת ARP, וכך אני יכול לדעת האם הוא מחובר או לא. אבל מדבריך אני מבין שזה לא בדיוק כך, כי גם אם המכשיר מחובר לרשת הוא לא בהכרח יגיב לי לבקשת ARP?
יש איזה דרך לעשות זאת?תודה רבה רבה מראש!
אברהם.פורסם במקור בפורום CODE613 ב18/01/2017 21:16 (+02:00)
-
מצאתי את המאמר הזה:
https://www.codeproject.com/Tips/889483/How-to-List-all-devices-info-on-your-WLAN-routerמה שהוא עושה זה נראה לי מה שדוד התכוון, הוא רץ בלולאה על כל האפשרויות של הרשת, ולכל אחד מכתובות הIP הללו הוא שולח שאילתת ARP, ואח"כ הוא מחלץ את כל המידע הדרוש.
אני קצת שיניתי את הקוד שלו, בע"ה אעלה אותו בהמשך.
תודה רבה רבה לכל המסייעים!
פורסם במקור בפורום CODE613 ב18/01/2017 22:33 (+02:00)
-
מחילה מאותו כותב מאמר אבל נראה לי שהוא טועה בכמה דברים.
א. החלטה שלו מה נקרא הרשת הפנימית לא מובנת. הוא רץ מ2 עד 255. למה? יש רשתות פנימיות עם יותר מחשבים.
ב. הוא שולח arp ע"י פקודת windows פר IP. נראה ממש משוגע. בשביל הצורך שלך זה סביר, אבל אני בהלם שככה הוא כותב במאמר בcodeproject.בכלל הוא עושה רושם של מבין בטכנאות יותר מבתכנות.
פורסם במקור בפורום CODE613 ב18/01/2017 23:16 (+02:00)
-
@דוד ל.ט.
א. החלטה שלו מה נקרא הרשת הפנימית לא מובנת. הוא רץ מ2 עד 255. למה? יש רשתות פנימיות עם יותר מחשבים.
אני אישית הגדרתי שירוץ עד 10, כי אין לי צורך ביותר מזה. כלומר, לא נראה לי שהראוטר יתן כתובת IP עם סיומת 150 כאשר רק 2 מכשירים מחוברים לרשת, נכון?
@דוד ל.ט.ב. הוא שולח arp ע"י פקודת windows פר IP. נראה ממש משוגע. בשביל הצורך שלך זה סביר, אבל אני בהלם שככה הוא כותב במאמר בcodeproject.
בכלל הוא עושה רושם של מבין בטכנאות יותר מבתכנות.איך אתה היית עושה? (אני בכלל לא מבין בתחום הזה, לכן אני שואל.. לא כדי לקנטר חלילה.)
כשאני שלחתי פקודת ARP כללית, הוא לא מצא לי 2 מכשירים שהיו מחוברים. ורק כאשר שלחתי את הפקודה לIP שלהם ישירות - אז הם ענו לי.
או שאתה מתכוון שזה מיותר להפעיל את זה דרך הקומנד ליין ועדיף לעשות את הכל מתוך הקוד?לילה טוב!
פורסם במקור בפורום CODE613 ב19/01/2017 00:57 (+02:00)
-
אני מבין שאתה יודע את הMAC של המכשיר שאתה מחפש.
ומתוכן השאלה כאן ובפוסט של הקלטת הוידאו, אני מבין שאתה הולך על מימוש של זה:
http://icode.co.il/מאבטחים-את-הבית-בפחות-מ-80-שורות-קוד/
רק בדוטנט במקום בפייתון.
ושם הוא אכן משתמש בARP.
ראית את המאמר הזה?פורסם במקור בפורום CODE613 ב19/01/2017 11:12 (+02:00)
-
foreach (var ipInter in GetInterfacesAddress()) foreach (var element in IpsForMask(ipInter.IPv4Mask, ipInter.Address)) { var res = await IpArp(element); if (res != null) Console.WriteLine("{0}: {1}", element, res); } [DllImport("iphlpapi.dll", ExactSpelling = true)] public static extern int SendARP(int destIp, int srcIP, byte[] macAddr, ref uint physicalAddrLen); async Task<string> IpArp(IPAddress dst) { return await Task.Run(() => { byte[] macAddr = new byte[6]; uint macAddrLen = (uint)macAddr.Length; if (SendARP(BitConverter.ToInt32(dst.GetAddressBytes(), 0), 0, macAddr, ref macAddrLen) != 0) return null; string[] str = new string[(int)macAddrLen]; for (int i = 0; i < macAddrLen; i++) str[i] = macAddr[i].ToString("x2"); return string.Join(":", str); }); } IPAddress GetNetworkAddress(IPAddress address, IPAddress subnetMask) { byte[] ipAdressBytes = address.GetAddressBytes(); byte[] subnetMaskBytes = subnetMask.GetAddressBytes(); byte[] broadcastAddress = new byte[ipAdressBytes.Length]; for (int i = 0; i < broadcastAddress.Length; i++) broadcastAddress[i] = (byte)(ipAdressBytes[i] & (subnetMaskBytes[i])); return new IPAddress(broadcastAddress); } IEnumerable<IPAddress> IpsForMask(IPAddress ip, IPAddress mask) { var first = GetNetworkAddress(ip, mask); var uintFirst = BitConverter.ToUInt32(first.GetAddressBytes().Reverse().ToArray(), 0); var uintMask = BitConverter.ToUInt32(mask.GetAddressBytes().Reverse().ToArray(), 0); var num = (~uintMask) - 1; for (uint i = 1; i < num; i++) { var reversed = BitConverter.GetBytes(uintFirst + i).Reverse().ToArray(); yield return new IPAddress(reversed); } } IEnumerable<UnicastIPAddressInformation> GetInterfacesAddress() { foreach (var i in NetworkInterface.GetAllNetworkInterfaces()) if (i.OperationalStatus == OperationalStatus.Up && i.NetworkInterfaceType == NetworkInterfaceType.Ethernet) foreach (var element in i.GetIPProperties().UnicastAddresses) if (element.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) yield return element; }
אני מודה שגם טעון שיפור. אבל זה הרבה יותר נכון מההוא.
פורסם במקור בפורום CODE613 ב19/01/2017 13:30 (+02:00)
-
דוד - תודה רבה רבה על ההשקעה הענקית!!
עשית לי את כל העבודה :lol:
clickone אכן אני מנסה לעשות משהו דומה לשלו, אבל לא בדיוק.
אני צריך רק זיהוי תנועה, ובמידה וזוהתה תנועה לשמור לוידאו על המחשב. אין צורך לשלוח את זה.
כמו כן, יש לי טאבלט שאני יודע את הMAC שלו, וכאשר אני מזהה שהוא התחבר לרשת מעל חצי שעה, אני רוצה לשלוח הודעה לבעל הרשת, ואז הוא יכול אח"כ לבוא ולראות במצלמות מה בדיוק אירע באותו זמן.
זה פרויקט קטן שאני עושה עבור חבר.פורסם במקור בפורום CODE613 ב19/01/2017 15:31 (+02:00)
-
רק הערה קטנה על הקוד:
בשורה 56 שיניתי את התנאי השני, כיון שאני מחפש מכשיר שמחובר דרך הויפי, ולא דרך האטרנט.i.NetworkInterfaceType == NetworkInterfaceType.Wireless80211
תודה ענקית!!
תיקון והוספה:
זה לא משנה איך המכשיר מחובר לרשת, השאלה איך המחשב שרצה עליו התוכנה מחובר.
אם המחשב מחובר בWIFI - צריך לעשות כמו שכתבתי.
אם המחשב עם כבל רשת - צריך לעשות כמו בקוד המקורי של דוד ל.ט. לבחור באפשרות Ethernet.פורסם במקור בפורום CODE613 ב26/01/2017 15:21 (+02:00)