C#SharpPCap同步扫描
我正在尝试使用SharpPcap进行TCP SYN扫描,我正在使用WireShark查看数据包是否从我的NIC发送,它们是否被发送,但我没有收到响应。 文件上说我应该得到一个SYN | ACK或RST TCP数据包,我一个也没有,另一个站已经启动,如果我在它们之间进行telnet,TCP握手在wireshark中显示ok 下面是代码: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
//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文件。。但是现在,是否有可能数据包格式错误?