私は C# と PcapDotNet を使用してパケット スニファーを作成しています。この機能を正常に実装し、ラップトップからすべての TCP パケットをキャプチャできました。問題は、Android デバイスをターゲットにすると、パケットがまったく取得されないことです。ネットワーキングの初心者なので、おそらく何かが足りないと思います。
これはパケット ハンドラーのコードです。一覧表示するすべての情報を含むモデル オブジェクトで ObjectListView を使用しています。また、ポート番号 443 の TCP パケットのみを取得するバークレー フィルターを使用した無差別モードのネットワーク アダプターを使用しています。特定の Mac アドレスからのデータ (SYN、FIN、ACK のみのパケットなし) を含む 80
コード:
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 キャッシュ ポイズニングなしでこれを行うことができるかということです。これは、パケット スニファーにとって少し攻撃的だと思うからです。