C# Pcap.Net Send TCP, HTTP Packet not work

Nov 9, 2012 at 6:57 PM
Edited Nov 9, 2012 at 6:57 PM

I will using Pcap.Net 0.10.0 (67076) for send TCP or HTTP packet but not work, only work with UDP Packet?? I can see UDP Packet showing in TCPViewer but now show with TCP or HTTP packet.

I using windows 7 64bit and i really build application x86 platform.

Here is my code.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using PcapDotNet.Base;
using PcapDotNet.Core;
using PcapDotNet.Packets;
using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Dns;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Gre;
using PcapDotNet.Packets.Http;
using PcapDotNet.Packets.Icmp;
using PcapDotNet.Packets.Igmp;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
using System.Text;

namespace PcapTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Retrieve the device list from the local machine
            IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;

            if (allDevices.Count == 0)
            {
                Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");
                return;
            }

            // Print the list
            for (int i = 0; i != allDevices.Count; ++i)
            {
                LivePacketDevice device = allDevices[i];
                Console.Write(String.Format("{0}. {1}", (i + 1), device.Name));
                Console.WriteLine(device.Description != null ? String.Format(" ({0})", device.Description) : " (No description available)");
            }

            int deviceIndex = 0;
            do
            {
                Console.WriteLine(String.Format("Enter the interface number (1-{0}):", allDevices.Count));
                string deviceIndexString = Console.ReadLine();
                if (!int.TryParse(deviceIndexString, out deviceIndex) ||
                    deviceIndex < 1 || deviceIndex > allDevices.Count)
                {
                    deviceIndex = 0;
                }
            } while (deviceIndex == 0);

            // Take the selected adapter
            PacketDevice selectedDevice = allDevices[deviceIndex - 1];

            // Open the output device
            using (PacketCommunicator communicator = selectedDevice.Open(69559, PacketDeviceOpenAttributes.Promiscuous, 1000)) // read timeout
            {
                communicator.SendPacket(BuildHttpPacket());
            }
            Console.ReadKey();
        }

        private static Packet BuildHttpPacket()
        {
            EthernetLayer ethernetLayer =
                new EthernetLayer
                {
                    Source = new MacAddress("01:01:01:01:01:01"),
                    Destination = new MacAddress("02:02:02:02:02:02"),
                    EtherType = EthernetType.None, // Will be filled automatically.
                };

            IpV4Layer ipV4Layer =
                new IpV4Layer
                {
                    Source = new IpV4Address("99.99.99.99"),
                    CurrentDestination = new IpV4Address("111.90.147.168"),
                    Fragmentation = IpV4Fragmentation.None,
                    HeaderChecksum = null, // Will be filled automatically.
                    Identification = 123,
                    Options = IpV4Options.None,
                    Protocol = null, // Will be filled automatically.
                    Ttl = 100,
                    TypeOfService = 0,
                };

            TcpLayer tcpLayer =
                new TcpLayer
                {
                    SourcePort = 4050,
                    DestinationPort = 80,
                    Checksum = null, // Will be filled automatically.
                    SequenceNumber = 100,
                    AcknowledgmentNumber = 50,
                    ControlBits = TcpControlBits.Acknowledgment,
                    Window = 100,
                    UrgentPointer = 0,
                    Options = TcpOptions.None,
                };

            HttpRequestLayer httpLayer =
                new HttpRequestLayer
                {
                    Version = HttpVersion.Version11,
                    Header = new HttpHeader(new HttpContentLengthField(11)),
                    Body = new Datagram(Encoding.ASCII.GetBytes("hello world")),
                    Method = new HttpRequestMethod(HttpRequestKnownMethod.Get),
                    Uri = @"http://mywebsite.com/",
                };

            PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, tcpLayer, httpLayer);

            return builder.Build(DateTime.Now);
        }
    }
}

Coordinator
Nov 23, 2012 at 7:13 PM

If you want to see the request in the server, you should create a valid TCP connection. This includes a TCP 3-Way Handshake (SYN,SYN-ACK,ACK).

If you just send an HTTP request, the server will ignore it because it ignores packets that are out of a valid TCP connection.

See more in http://en.wikipedia.org/wiki/Transmission_Control_Protocol

Dec 13, 2012 at 3:07 PM

I need send a TCP packet with spoofing ip address and i don't need get response from server, you can teach me or give me an example working how to creat a valid TCP connection for send a packet to server with Pcap.Net?

 

Thanks so much.

viet

Coordinator
Dec 28, 2012 at 4:23 PM

I don't have an example, but I suggest you record a normal TCP connection with your server (you can use telnet, your browser or other application that uses TCP) using Wireshark and then see what kind of packets you need to send in order to create a working connection.

 

I hope this helps,

 

Boaz.