2017-04-18 166 views
0

我写了一个UDP端口扫描器。我发送一个数据包到同一网络中的另一台设备,但在这里有一点问题,为什么wireshark只收到一个数据包,如果我在不同的端口上发送10个数据包(每个端口都关闭)。我应该收到10个类型为ICMP的packects:3.我应该在我的代码中更改哪些内容以获取这些内容?端口扫描器 - icmp数据包

using PcapDotNet.Core; 
using PcapDotNet.Packets; 
using PcapDotNet.Packets.Ethernet; 
using PcapDotNet.Packets.IpV4; 
using PcapDotNet.Packets.Transport; 
using System; 
using System.Collections.Generic; 

namespace SendingASinglePacketWithSendPacket 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine; 
     PacketDevice selectedDevice = allDevices[2]; 


     for (int i = 1; i < 10; i++) 
     { 
      new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i); 
     } 


     System.Console.ReadKey(); 
    } 
} 

class Sender 
{ 
    public void SendUDPandGetStatus(PacketDevice selectedDevice, ushort port) 
    { 
     using (PacketCommunicator communicator = selectedDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, -1)) 
     {   
      communicator.SendPacket(BuildUdpPacket(port)); 
     } 
    } 

    private static Packet BuildUdpPacket(ushort destinationPort) 
    { 
     EthernetLayer ethernetLayer = new EthernetLayer 
     { 
      Destination = new MacAddress("14:cc:20:2c:7e:36"), 
      Source = new MacAddress("9C:4E:36:17:86:48"), 

      EtherType = EthernetType.None, 
     }; 

     IpV4Layer ipV4Layer =new IpV4Layer 
     { 
      Source = new IpV4Address("192.168.0.104"), 
      CurrentDestination = new IpV4Address("192.168.0.105"), 
      Fragmentation = IpV4Fragmentation.None, 
      HeaderChecksum = null, 
      Identification = 123, 
      Options = IpV4Options.None, 
      Ttl = 30, 
      TypeOfService = 0, 
     }; 

     UdpLayer udpLayer = new UdpLayer 
     { 
      SourcePort = 4050, 
      DestinationPort = destinationPort, 
      Checksum = null, 
      CalculateChecksumValue = true, 
     }; 

     PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, udpLayer); 
     return builder.Build(DateTime.Now); 
    } 
} 
} 

Wireshark的结果: enter image description here

如果我把断点行我只想补充:

new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i); 

,推动F5键(间隔5秒),得到正确的结果。

+0

ICMP是一个ping消息,如果你有一个路由循环将被封锁。尝试从cmd.exe> PING 192.168.0.104使用并查看响应。检查生存时间以指示有多少路由器消息通过。 – jdweng

+0

你可能是对的,但在我的情况下,我有两台电脑连接到同一个路由器。我检查了tracert命令和更高的TTL值 - 相同。我认为问题在于:“Linux 2.4.20内核将目标不可达消息限制为每秒一次”。如果我添加“System.Threading.Thread.Sleep(1000);”在for循环中,问题消失。我可以推断在Windows上的限制是相同的在Linux上。 –

+0

获取IP地址和掩码并确保您有路由。您可能需要ping每个子网中的设备,以查看可以访问哪些设备。还要转到目标设备和ping源设备。我怀疑你有一条路向一个方向,而不是返回路线。 – jdweng

回答

0

这是我发现的Nmap在文档:

的Nmap探测速率限制并相应地减慢,以避免 无用的数据包,目标计算机会 下降充斥网络。不幸的是,Linux风格的限制每秒一个数据包 使65,536端口扫描需要超过18小时。加速 您的UDP扫描的想法包括:并行扫描更多主机,首先对热门端口执行 快速扫描,从 防火墙进行扫描,然后使用--host-timeout跳过慢速主机。

Documentation

+1

不同于windows的Linux机器可以有多个IP地址。所以你可以使用多个IP来欺骗Nmap。 – jdweng

+0

我在几台Windows机器上测试过 - 效果相同,但在Linux上一切正常。我期望相反的行为.. –

+0

具有一个IP的窗口仍然会有每秒一个数据包的限制。使用多个IP时,每个IP地址将有一个数据包。所以如果你有5个IP地址,你将有每秒5个数据包。 – jdweng