1
votes

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 but 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://pcapdot.net/",
            };

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

        return builder.Build(DateTime.Now);
    }
}
}
1
Can you use Wireshark and see what packet you get when you run this code and think what packet do you want to get? Remember that Pcap.Net can currently only be used to create single packets, so if you want to create a TCP stream you need to take care of all the TCP 3-way handshake and correct sequence and acknowledgment numbers in the following packets.brickner
Thanks for reply @brickner, I using my IP Address (True IP) and creat a TCP Packet request on my VPS Server on port 80 with pcapdotnet! I can see request on wireshark, but i don't see this request on my server.Johnny Nguyen

1 Answers

1
votes

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