我正在使用 C# 和 PcapDotNet 编写一个数据包嗅探器,我已经成功实现了该功能,并且能够从我的笔记本电脑捕获所有 TCP 数据包,问题是如果我以我的 android 设备为目标,我根本没有收到任何数据包,我是网络初学者,所以我想我可能遗漏了一些东西。
这是我的数据包处理程序代码,我正在使用一个 ObjectListView 和一个模型对象,其中包含我想要列出的所有信息,我还有一个混杂模式的网络适配器和一个伯克利过滤器,只获取端口号为 443 的 TCP 数据包和 80 包含来自特定 Mac 地址的数据(无 SYN、FIN、仅 ACK 数据包)
代码:
private void PacketHandler(PcapDotNet.Packets.Packet packet)
{
if (packet == null) { return; }
if (packet.Ethernet == null) { return; }
if (packet.Ethernet.IpV4 == null) { return; }
if (packet.Ethernet.IpV4.Tcp == null) { return; }
if (packet.Ethernet.IpV4.Tcp.Http == null) { return; }
var acpacket = new AcceptedPacket(); //Model Object
acpacket.Packet = packet;
try
{
HttpDatagram http = packet.Ethernet.IpV4.Tcp.Http;
if (packet.Ethernet.Source.ToString() == targetmac)
{
if (http.IsRequest && http.IsValid)
{
if (materialListView1.InvokeRequired)
{
materialListView1.BeginInvoke(new Action(() => {
materialListView1.AddObject(acpacket); }));
}
else
{
materialListView1.AddObject(acpacket);
}
ListofAcceptedPackets.Add(acpacket);
}
}
}
catch (Exception ex)
{
MetroMessageBox.Show(this, ex.Message, "Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
这就是我打开适配器的方式:
using (communicator =
selectedDevice.Open(65536,PacketDeviceOpenAttributes.Promiscuous,
1000))
{
if (communicator.DataLink.Kind !=
DataLinkKind.Ethernet)
{
if (MetroMessageBox.Show(this, "Only Ethernet is supported in this operation!","Error", MessageBoxButtons.OK,MessageBoxIcon.Error) == DialogResult.OK)
{
return;
}
}
using (BerkeleyPacketFilter filter = communicator.CreateFilter($"tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and ether src {targetmac.ToLower()} or tcp port 443 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and ether src {targetmac.ToLower()}"))
{
communicator.SetFilter(filter);
}
flag = true;
Packet packet;
do
{
PacketCommunicatorReceiveResult result =
communicator.ReceivePacket(out packet);
switch (result)
{
case
PacketCommunicatorReceiveResult.Timeout:
continue;
case
PacketCommunicatorReceiveResult.Ok:
{
PacketHandler(packet);
}
break;
default:
break;
}
} while (flag);
}
我也尝试不使用任何过滤器,但无法访问 android 设备数据包。那么除了我自己的设备之外,是否可以从网络上的其他设备捕获 TCP 数据包?或者我的实现可能有问题?
编辑:在尝试了更多之后,我能够成功地从 android 设备获取 TCP 数据包,但只能在同时实施 ARP 缓存中毒的同时,因为设备认为我是网关。所以我的问题是,这是否可以在没有 ARP 缓存中毒的情况下完成,因为我认为这对于数据包嗅探器来说有点激进。