Error building a Packet

Jan 31, 2011 at 2:17 PM
Edited Feb 1, 2011 at 2:48 AM

Hi Everyone = )

Im reciving packets and modifing and resendig on execution with this code everithing was ok :

 

Private Sub ReciveModifyAndSend(ByVal paqts As Queue(Of Packet), ByRef Reciv As PacketReciver)
If paqts.Count = 0 Then Exit Sub

Dim Elay As EthernetLayer
Dim Rest As ILayer

Dim paqts2 As New Queue(Of Packet)

For Each p As Packet In paqts

Elay = p.Ethernet.ExtractLayer
Rest = p.Ethernet.payload.ExtractLayer

Elay.Source = Device.DeviceMac
Elay.Destination = SendTo.Mac


Dim i As Packet = PacketBuilder.Build(p.TimeStamp, Elay, Rest)
paqts2.Enqueue(i)
Next

Sender.SendBuffer(paqts2, True)
PacketsRedirected += paqts2.Count
End Sub

but when i Extracted Also de ipv4Layer i recived an error :

   Private Sub ReciveModifyAndSend(ByVal paqts As Queue(Of Packet), ByRef Reciv As PacketReciver)
If paqts.Count = 0 Then Exit Sub

Dim Elay As EthernetLayer
Dim IpLay As IpV4Layer
Dim Rest As ILayer

Dim paqts2 As New Queue(Of Packet)

For Each p As Packet In paqts

Elay = p.Ethernet.ExtractLayer
IpLay = p.Ethernet.IpV4.ExtractLayer
Rest = p.Ethernet.IpV4.Payload.ExtractLayer

Elay.Source = Device.DeviceMac
Elay.Destination = SendTo.Mac

'IpLay.Source = Device.DeviceIPv4
'IpLay.Destination = SendTo.Ip
'IpLay.HeaderChecksum = Nothing

Dim i As Packet = PacketBuilder.Build(p.Timestamp, Elay, IpLay, Rest)
paqts2.Enqueue(i)
Next

Sender.SendBuffer(paqts2, True)
PacketsRedirected += paqts2.Count
End Sub

i just extracted it and modified nothing and got 3 System.IndexOutOfRangeException on :

 

                Dim i As Packet = PacketBuilder.Build(p.Timestamp, Elay, IpLay, Rest)

what is wrongg!!

Simplifying why this code throws an Exception :

PacketBuilder.Build(p.Timestamp ,p.Ethernet.ExtractLayer ,p.Ethernet.IpV4.IpV4.ExtractLayer,p.Ethernet.IpV4.Payload.ExtractLayer )

Note this packet is a ping request
Feb 1, 2011 at 3:32 AM

I found the problem is that the method p.Ethernet.IpV4.Payload.ExtractLayer incorrectly interprets the payload as a tcp layer so i think the best will be add an overload to the packet builder so it also accepts payloads(datagrams )

Coordinator
Feb 4, 2011 at 8:17 PM

What exception do you get?

Feb 4, 2011 at 8:22 PM
Edited Feb 4, 2011 at 8:32 PM

Like i said : 

  Dim i As Packet = PacketBuilder.Build(p.Timestamp, Elay, IpLay, Rest)

System.IndexOutOfRangeException

Because "Rest" is inccorrectly casted as a Tcp Layer

Rest = p.Ethernet.IpV4.Payload.ExtractLayer

instead of Icmp layer

Will be great if i could do this:

 Dim Elay As EthernetLayer
 Dim IpLay As IpV4Layer
 Dim Rest As Datagram

 Elay = p.Ethernet.ExtractLayer
 IpLay = p.Ethernet.IpV4.ExtractLayer
 Rest = p.Ethernet.IpV4.Payload

'Here i would make my modifications to the layers and then:

Dim i As Packet = PacketBuilder.Build(p.Timestamp, Elay, IpLay, Rest)

Coordinator
Feb 4, 2011 at 8:43 PM

Sorry, I missed that.

 

Can you give me the full call stack of the exception?

 

Thanks,

 

Boaz.

Feb 4, 2011 at 8:51 PM

sorry i dont know very well if this is the full call stack of the exception :

Excepción del tipo 'System.IndexOutOfRangeException' en PcapDotNet.Packets.dll
Excepción del tipo 'System.IndexOutOfRangeException' en PcapDotNet.Packets.dll
Excepción del tipo 'System.IndexOutOfRangeException' en PcapDotNet.Packets.dll
Excepción del tipo 'System.IndexOutOfRangeException' en PcapDotNet.Packets.dll

or this :

TargetSite:

{Void Write(Byte[], Int32, Int16)}

StackTrace:

   en PcapDotNet.Packets.ByteArrayExtensions.Write(Byte[] buffer, Int32 offset, Int16 value) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\ByteArrayExtensions.cs:línea 863
   en PcapDotNet.Packets.ByteArrayExtensions.Write(Byte[] buffer, Int32 offset, Int16 value, Endianity endianity) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\ByteArrayExtensions.cs:línea 475
   en PcapDotNet.Packets.ByteArrayExtensions.Write(Byte[] buffer, Int32 offset, UInt16 value, Endianity endianity) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\ByteArrayExtensions.cs:línea 487
   en PcapDotNet.Packets.Transport.TransportDatagram.WriteHeader(Byte[] buffer, Int32 offset, UInt16 sourcePort, UInt16 destinationPort) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\Transport\TransportDatagram.cs:línea 66
   en PcapDotNet.Packets.Transport.TcpDatagram.WriteHeader(Byte[] buffer, Int32 offset, UInt16 sourcePort, UInt16 destinationPort, UInt32 sequenceNumber, UInt32 acknowledgmentNumber, TcpControlBits controlBits, UInt16 window, UInt16 urgentPointer, TcpOptions options) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\Transport\TcpDatagram.cs:línea 335
   en PcapDotNet.Packets.Transport.TcpLayer.Write(Byte[] buffer, Int32 offset, Int32 payloadLength, ILayer previousLayer, ILayer nextLayer) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\Transport\TcpLayer.cs:línea 98
   en PcapDotNet.Packets.PacketBuilder.WriteLayers(Byte[] buffer, Int32 length) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\PacketBuilder.cs:línea 125
   en PcapDotNet.Packets.PacketBuilder.Build(DateTime timestamp) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\PacketBuilder.cs:línea 111
   en PcapDotNet.Packets.PacketBuilder.Build(DateTime timestamp, ILayer[] layers) en C:\Users\Boaz\TFS\tfs06.codeplex.com\PcapDotNet\PcapDotNet\src\PcapDotNet.Packets\PacketBuilder.cs:línea 55
   en ejercicio_1.Sniffing.TraficRedirector.ReciveModifyAndSend(Queue`1 paqts, PacketReciver& Reciv) en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 380
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 173
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en ejercicio_1.Sniffing.PacketReciver.Recive() en E:\Mis proyectos personales\ejercicio_1\ejercicio_1\Form1.vb:línea 174
   en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   en System.Threading.ExecutionContext.runTryCode(Object userData)
   en System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   en System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   en System.Threading.ThreadHelper.ThreadStart()

Coordinator
Feb 4, 2011 at 9:52 PM

Hi Adum_264,

 

I believe you are right. This is a bug.

I've submitted a fix (Change Set 55360).

 

You can do one of the following:

1. Wait for the next release (no idea when this will happen).

2. Download the source code, build it and use it (instructions available in the developer's pack).

3. Don't use the fix and just create a new Datagram containing the same data as the IpV4Datagram's payload datagram by using ToMemoryStream on the Payload datagran.

 

Thanks again,

 

Boaz.

Feb 4, 2011 at 10:16 PM
Edited Feb 4, 2011 at 10:17 PM

No, No,

thanks to you for making this project = )