Обнаружение TCP-пакетов устройства Android в локальной сети - PullRequest
1 голос
/ 02 июля 2019

Я пишу анализатор пакетов с использованием C # и PcapDotNet, я успешно реализовал эту функцию и смог перехватить все TCP-пакеты с моего ноутбука, проблема в том, что, если я нацелился на свое устройство Android, я не получил пакетов вообще , Я новичок в области сетевых технологий, поэтому думаю, что, возможно, что-то упустил.

Это мой код для обработчика пакетов, я использую ObjectListView с объектом модели, который содержит всю информацию, которую я хочу перечислить, а также у меня есть сетевой адаптер в режиме Promiscuous с фильтром Беркли, чтобы получать только пакеты TCP с номера портов 443 и 80, которые содержат данные (без пакетов SYN, FIN, ACK-only) с определенного Mac-адреса

Код:

        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-пакеты от других устройств в сети, кроме моего собственного устройства? или может быть что-то не так с моей реализацией?

Редактировать: после нескольких попыток я смог успешно получить TCP-пакеты от устройства Android, но только при одновременной реализации ARP Cache Poisoning, потому что устройство считает меня шлюзом. поэтому мой вопрос стоит, можно ли это сделать без ARP Cache Poisoning, потому что я думаю, что это немного агрессивно для анализатора пакетов.

...