我正在编写一个使用SharpPcap注入数据包的应用程序。
但是,由于我自己构建数据包并且只知道目的地的 IP 地址,因此我必须确定下一跳的物理地址。我总是可以向远程IP 地址发送 ping ,嗅探它,并从嗅探的数据包中获取MAC 地址。但是,我希望在C#中有一种不那么复杂的方法。
显然,获取下一跳的 IP 地址也会很有帮助,因为我可以使用 SendArp 来确定它的 MAC 地址。
获取路由表就可以了。我将如何使用代码获得它?
我在使用 WMI 时遇到了一些问题(似乎无法将 Win32_IP4RouteTable 中的接口索引与实际设备相关联;MSDN 文档是错误的,并且其他更骇人听闻的技术在某些计算机上失败了)。
因此,我选择使用非托管GetBestRoute,这实际上为我节省了很多时间,因为它让 Windows 自行决定路由,并返回下一跳的 IP 地址和指向该地址的 NIC 标识符。它也比对 WMI 运行查询快得多。
然后,您可以通过在GetAdaptersInfo返回的列表中查找该标识符来找到 NIC 本身。
希望能帮助到你 ...
物理地址由地址解析协议解析- 只需发送带有 IP 地址的ARP Reuest即可解析。
如果目的地不在本地网络中,则必须将数据包发送到标准网关,并且必须对标准网关执行 ARP 请求。可以使用System.Net.NetworkInformation命名空间中的方法获得标准网关。
NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses
这样做的完全骇人听闻的方法是运行命令“arp -a”并读取和解析命令的结果(使用Windows 已经拥有的ARP缓存)。
否则,您需要在协议栈中包含 ARP。这就是您的系统本身如何确定将帧发送到何处的方式。或者最后,如果您不担心效率低下,您可以将您的以太网目的地设置为:FF:FF:FF:FF:FF:FF 并让与您在同一个 LAN 上的所有人。当有东西响应或你收到一个数据包时,自己缓存它以获得正确的目标 MAC 地址。
就个人而言,如果您在我的网络上进行了所有人的洪水攻击,我会伤害您,但根据您的情况,这可能是一个相当容易的黑客攻击。然而,做一个 100% 全栈实现是相当复杂的,因为有很多边缘情况应该得到很好的支持(例如处理代理 ARP、免费 ARP 等)。