C#中的ARP请求

时间:2013-06-16 11:43:07

标签: c# wifi pinvoke arp spoofing

我正在尝试让我的Android设备认为我是路由器,在C#中使用简单的ARP请求(使用C#将笔记本电脑中的arp发送到我的Android设备)。 我想如果我将使用SendArp方法(来自Iphlpapi.dll),它可以工作:

SendArp(ConvertIPToInt32(IPAddress.Parse("myAndroidIP")), 
   ConvertIPToInt32(IPAddress.Parse("192.168.1.1")), macAddr, ref macAddrLen)

但是我无法发送请求。*但是,如果我写'0'而不是ConvertIPToInt32(IPAddress.Parse("192.168.1.1"))

SendArp(ConvertIPToInt32(IPAddress.Parse("myAndroidIP")), 0, 
    macAddr, ref macAddrLen)

它会起作用:

enter image description here

因此,如果源ip为'0',则它正在工作,但如果源是路由器IP地址,则为NOT。

我正在使用此pinvoke方法发送ARP:

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

此方法将字符串IP转换为Int32:

private static Int32 ConvertIPToInt32(IPAddress pIPAddr)
{
 byte[] lByteAddress = pIPAddr.GetAddressBytes();
 return BitConverter.ToInt32(lByteAddress, 0);
}

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为你误解了第二个参数的含义。

1)ARP请求不是发送给特定的IP(例如Android设备),而是广播给网络的所有计算机。

2)看一下SendARP function的描述,第二个参数是接口IP,而不是目标IP。如果我理解正确,如果您的计算机中有多个局域网卡,则可以选择一个将发送ARP请求的局域网卡

  

SrcIP [in]发件人的源IPv4地址,格式为   IPAddr结构。此参数是可选的,用于选择   接口,用于发送ARP条目的请求。来电者可以   为此指定与INADDR_ANY IPv4地址对应的零   参数。

答案 1 :(得分:0)

这是我使用的方法,似乎没有问题。
如其他答案所述,第二个参数是源IP的选择。
将其设置为0只会使用您计算机上的任何界面。

//You'll need this pinvoke signature as it is not part of the .Net framework
[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(int DestIP, int SrcIP, 
                                 byte[] pMacAddr, ref uint PhyAddrLen);

//These vars are needed, if the the request was a success 
//the MAC address of the host is returned in macAddr
private byte[] macAddr = new byte[6];
private uint macAddrLen;

//Here you can put the IP that should be checked
private IPAddress Destination = IPAddress.Parse("127.0.0.1");

//Send Request and check if the host is there
if (SendARP((int)Destination.Address, 0, macAddr, ref macAddrLen) == 0)
{
    //SUCCESS! Igor it's alive!
}