C#SharpPCap同步扫描

C#SharpPCap同步扫描,c#,tcp,network-programming,sharppcap,C#,Tcp,Network Programming,Sharppcap,我正在尝试使用SharpPcap进行TCP SYN扫描,我正在使用WireShark查看数据包是否从我的NIC发送,它们是否被发送,但我没有收到响应。 文件上说我应该得到一个SYN | ACK或RST TCP数据包,我一个也没有,另一个站已经启动,如果我在它们之间进行telnet,TCP握手在wireshark中显示ok 下面是代码: //Generate a random packet EthernetPacket packet = Ethern

我正在尝试使用SharpPcap进行TCP SYN扫描,我正在使用WireShark查看数据包是否从我的NIC发送,它们是否被发送,但我没有收到响应。 文件上说我应该得到一个SYN | ACK或RST TCP数据包,我一个也没有,另一个站已经启动,如果我在它们之间进行telnet,TCP握手在wireshark中显示ok

下面是代码:

            //Generate a random packet
            EthernetPacket packet = EthernetPacket.RandomPacket();
            packet.SourceHwAddress = srcMacAddress;
            packet.DestinationHwAddress = dstMacAddress;

            string ss = "Message TCP";
            byte[] bArray = System.Text.Encoding.ASCII.GetBytes(ss);
            byte[] asd = new byte[60];
            bArray.CopyTo(asd, 20);

            ByteArraySegment bas = new ByteArraySegment(asd);
            TcpPacket tcpPacket = new TcpPacket(bas);

            IpPacket ipPacket = IpPacket.RandomPacket(IpVersion.IPv4);
            ipPacket.TimeToLive = 20;
            ipPacket.Protocol = IPProtocolType.TCP;
            ipPacket.Version = IpVersion.IPv4;
            ipPacket.DestinationAddress = dstIpAddress;
            ipPacket.SourceAddress = srcIpAddress;
            ipPacket.PayloadPacket = tcpPacket; 
            packet.PayloadPacket = ipPacket;
            ipPacket.ParentPacket = packet;

            tcpPacket.ParentPacket = ipPacket;
            tcpPacket.SourcePort = SourcePortNumber;
            tcpPacket.DestinationPort = DestinationPortNumber;
            tcpPacket.Syn = true;
            tcpPacket.WindowSize = 500;
            tcpPacket.AcknowledgmentNumber = 1000;
            tcpPacket.SequenceNumber = 1000;

            tcpPacket.DataOffset = TcpFields.HeaderLength + 1;

            try
            {
                //Send the packet out the network device
                device.SendPacket(packet);
                ScanManager.Instance.AddPacket(packet, IPProtocolType.TCP);
            }
            catch (Exception e)
            {
                Console.WriteLine("-- " + e.Message);
            }
呼叫代码:

public static bool InitiliazeData(string dstIp)
        {
            bool bResult = false;
            // Print SharpPcap version
            string ver = SharpPcap.Version.VersionString;
            Console.WriteLine("SharpPcap Port scanner\n", ver);

            // Retrieve the device list
            var devices = CaptureDeviceList.Instance;

            // If no devices were found print an error
            if (devices.Count < 1)
            {
                Console.WriteLine("No devices were found on this machine");
                return false;
            }

            Console.WriteLine("The following devices are available on this machine:");
            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();

            int i = 0;


            foreach (WinPcapDevice dev in devices)
            {
                Console.Out.WriteLine("{0}) {1}", i, dev.Description);
                i++;

                foreach (PcapAddress addr in dev.Addresses)
                {
                    if (addr.Addr != null && addr.Addr.ipAddress != null)
                    {
                        Console.Out.Write("IP: {0}", addr.Addr.ipAddress);


                    }
                }
            }

            Console.WriteLine();
            Console.Write("-- Please choose a device to send a packet on: ");
            i = int.Parse(Console.ReadLine());
            iDeviceNumber = i;
            device = (PcapDevice)devices[i];
            i = 0;
            Console.WriteLine("Ip addresses for the selected interface: ");
            foreach (PcapAddress addr in ((WinPcapDevice)device).Addresses)
            {
                if (addr.Addr != null && addr.Addr.ipAddress != null)
                {
                    Console.Out.Write("{0}) {1}", i, addr.Addr.ipAddress);
                    i++;

                }
            }
            Console.WriteLine();
            Console.Write("-- Please choose a source ip to send a packet from: ");
            i = int.Parse(Console.ReadLine());
            iIpNumber = i;
            int j = 0;
            foreach (PcapAddress addr in ((WinPcapDevice)device).Addresses)
            {
                if (addr.Addr != null && addr.Addr.ipAddress != null)
                {

                    if (j == i)
                    {
                        srcIpAddress = addr.Addr.ipAddress;
                        break;
                    }
                    j++;
                }
            }
            //do
            //{
            //    Console.WriteLine("Please enter the IP that you want to scan: ");
            //    String ipAddressString = Console.ReadLine();
            //    dstIpAddress = IPAddress.Parse(ipAddressString);
            //    if (dstIpAddress != null)
            //        break;
            //    else
            //        Console.Write("Incorrect ip address.");
            //} while (true);

            IPAddress.TryParse(dstIp, out dstIpAddress);
            ARP arpResolver = new ARP(((WinPcapDevice)device));
            dstMacAddress = arpResolver.Resolve(dstIpAddress);
            if (dstMacAddress == null)
            {
                Console.WriteLine("Could not get MAC Address for ip {0}", dstIpAddress);
                return false;
            }
            else
            {
                Console.WriteLine("Destination MAC Address: {0}.", dstMacAddress);
            }
            device.Open();
            srcMacAddress = device.MacAddress;
            device.Close();
            return bResult;
        }
publicstaticboolinitiliazedata(字符串dstIp)
{
bool-bResult=false;
//打印SharpPcap版本
字符串ver=SharpPcap.Version.VersionString;
Console.WriteLine(“SharpPcap端口扫描仪\n”,版本);
//检索设备列表
var devices=CaptureDeviceList.Instance;
//如果未找到任何设备,请打印错误
如果(设备数<1)
{
Console.WriteLine(“此计算机上未找到任何设备”);
返回false;
}
Console.WriteLine(“此计算机上提供以下设备:”);
Console.WriteLine(“------------------------------------------------------------”);
Console.WriteLine();
int i=0;
foreach(设备中的WinPcapDevice dev)
{
Console.Out.WriteLine(“{0}{1}”,i,dev.Description);
i++;
foreach(dev.address中的PcapAddress addr)
{
if(addr.addr!=null&&addr.addr.ipAddress!=null)
{
Write(“IP:{0}”,addr.addr.ipAddress);
}
}
}
Console.WriteLine();
控制台。写入(“--请选择发送数据包的设备:”;
i=int.Parse(Console.ReadLine());
iDeviceNumber=i;
设备=(PcapDevice)设备[i];
i=0;
Console.WriteLine(“所选接口的Ip地址:”);
foreach(PcapAddress addr in((WinPcapDevice)设备)。地址)
{
if(addr.addr!=null&&addr.addr.ipAddress!=null)
{
Write(“{0}{1}”,i,addr.addr.ipAddress);
i++;
}
}
Console.WriteLine();
Console.Write(“--请选择要从中发送数据包的源ip:”);
i=int.Parse(Console.ReadLine());
iIpNumber=i;
int j=0;
foreach(PcapAddress addr in((WinPcapDevice)设备)。地址)
{
if(addr.addr!=null&&addr.addr.ipAddress!=null)
{
如果(j==i)
{
srcIpAddress=addr.addr.ipAddress;
打破
}
j++;
}
}
//做
//{
//WriteLine(“请输入要扫描的IP:”;
//字符串ipAddressString=Console.ReadLine();
//dstIpAddress=IPAddress.Parse(ipAddressString);
//if(dstIpAddress!=null)
//中断;
//否则
//控制台。写入(“不正确的ip地址”);
//}虽然(正确);
TryParse(dstIp,out-dstIpAddress);
ARP ARP解析器=新的ARP(((WinPcapDevice)设备));
dstMacAddress=arpResolver.Resolve(dstIpAddress);
if(dstMacAddress==null)
{
WriteLine(“无法获取ip{0}的MAC地址”,dstIpAddress);
返回false;
}
其他的
{
WriteLine(“目标MAC地址:{0}.”,dstMacAddress);
}
device.Open();
srcMacAddress=device.MacAddress;
设备。关闭();
返回结果;
}

答案可能有点晚了 这是我的密码

            byte[] MAC = new byte[] { 0xf8, 0x7b, 0x20, 0x6f, 0x50, 0x50 };
        var etn = new EthernetPacket(device.MacAddress, new PhysicalAddress(MAC), EthernetPacketType.IPv4);
        TcpPacket tcpPacket = new TcpPacket(6145,80);

        IPv4Packet ipPacket = new IPv4Packet(new IPAddress(new byte[] { 192, 168, 116, 162 }), new IPAddress(new byte[] { 101, 201, 181, 92 }))
        {
            TimeToLive = 64,
            Protocol = IPProtocolType.TCP,
            Version = IPVersion.IPv4,
            DestinationAddress = new IPAddress(new byte[] { 101, 201, 181, 92 }),
            SourceAddress = new IPAddress(new byte[] { 192, 168, 116, 162 }),
            PayloadPacket = tcpPacket,
            HopLimit = 64,
            Id = 15,

        };
        etn.PayloadPacket = ipPacket;
        ipPacket.ParentPacket = etn;
        tcpPacket.ParentPacket = ipPacket;
        tcpPacket.SourcePort = 1545;
        tcpPacket.DestinationPort = 80;
        tcpPacket.Syn = true;
        tcpPacket.WindowSize = 8140;
        tcpPacket.AcknowledgmentNumber = 0;
        tcpPacket.SequenceNumber = 1541;
        tcpPacket.UpdateTCPChecksum();
        ipPacket.UpdateIPChecksum();

你能提供更多的信息吗?事实上,你在Wireshark中看到SYN并不意味着它们到达了另一端。1-当您尝试telnet时,是否会看到Wireshark的所有消息?2-您能提供pcap文件、两个节点的MAC地址和两个节点的IP地址吗?我看到SYN数据包到达了另一端,因为我在两端都进行了wireshark捕获。1.对2.它们位于私人家庭局域网上,我将提供pcap文件。。但是现在,是否有可能数据包格式错误?