【发布时间】:2019-11-12 21:45:09
【问题描述】:
我正在使用 C# 和 PcapDotNet 编写数据包嗅探器,我已经成功实现了该功能,并且能够从我的笔记本电脑捕获所有 TCP 数据包,问题是如果我针对我的 android 设备,我根本没有收到任何数据包, 我是网络初学者,所以我想我可能遗漏了一些东西。
这是我的数据包处理程序代码,我正在使用带有模型对象的 ObjectListView,该模型对象包含我想要列出的所有信息,而且我的网络适配器处于混杂模式,带有 Berkeley 过滤器,仅获取 TCP 数据包端口号 443 和 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 缓存中毒的情况下完成吗,因为我认为这对于数据包嗅探器来说有点激进。
【问题讨论】:
标签: c# packet packet-sniffers packet-capture packetdotnet