Raw Sockets y VB.NET

Iniciado por elmaro, 30 Noviembre 2009, 03:54 AM

0 Miembros y 2 Visitantes están viendo este tema.

elmaro

#10
D4N93R , tu lo has hecho? Tienes el code para crear los paquetes?  ;D
Si es así, navidad llego temprano para mi  :laugh:

[D4N93R]

Si lo llegué a hacer, pero no tengo el código.. Perdí eso y mucho más :(

Pero igual es demasiado enredado. mejor dale en c++.net :) te lo haces en una libreria y luego la llamas desde tu aplicación principal en C#..

Un saludo!

elmaro

Excelente idea. Voy a ponerme con c++ jeje

Gracias y cualquier novedad la posteo. Nunca esta de mas

[D4N93R]

C++ .Net, es mejor si quieres interactuar con .Net y Win32... :D

Foxy Rider

#14
Como veo que tuviste dificultades para armar paquetes ... te tiro una ayudita ...

usando Raw sockets tenés que armar el paquete by hand, vamos al ejemplo de armar un paquete TCP  :

Código (csharp) [Seleccionar]

// Somewhere in the code ...

class Package
{
public Int16 SourcePort,DestinationPort,Window,CheckSum,UrgentPtr;
public Int32 SequenceNumber,AckNumber;
public Byte DataOffset,Reserved,ControlBits;
public Byte [] Options = new Byte[1],Data = new Byte[1];
};


private static Byte[] makeTCPackage(Package PackageInfo)
{

// El paquete per se ... en una lista
System.Collections.Generic.List<Byte> mPacketBytes = new System.Collections.Generic.List<Byte>();
int optionBytes = 0;

// Empaquetamos el Puerto de origen y agregamos
// no limpiamos los bits que se truncan anyways
mPacketBytes.Add((Byte) (PackageInfo.SourcePort >> 8));
mPacketBytes.Add((Byte)  PackageInfo.SourcePort ); // truncamos y dejamos donde estaba

// Empaquetamos el de Destino y agregamos
mPacketBytes.Add((Byte) (PackageInfo.DestinationPort >> 8));
mPacketBytes.Add((Byte)  PackageInfo.DestinationPort);

// Empaquetamos el Sequence Number (en 4 pasos de un byte) y agregamos
mPacketBytes.Add((Byte) (PackageInfo.SequenceNumber >> 24));
mPacketBytes.Add((Byte) (PackageInfo.SequenceNumber >> 16));
mPacketBytes.Add((Byte) (PackageInfo.SequenceNumber >> 8));
mPacketBytes.Add((Byte)  PackageInfo.SequenceNumber);

// Empaquetamos el Ack Number (en 4 pasos de un byte) y agregamos
mPacketBytes.Add((Byte) (PackageInfo.AckNumber >> 24));
mPacketBytes.Add((Byte) (PackageInfo.AckNumber >> 16));
mPacketBytes.Add((Byte) (PackageInfo.AckNumber >> 8));
mPacketBytes.Add((Byte)  PackageInfo.AckNumber);

// 4 Bits de Data Offset + 2 de reserved
mPacketBytes.Add((Byte) (PackageInfo.DataOffset <<4));

// 2 de reserved + 6 de control bit
mPacketBytes.Add((Byte) ((PackageInfo.ControlBits << 2) >> 2));

// 2 bytes de Window
mPacketBytes.Add((Byte) (PackageInfo.Window >> 8));
mPacketBytes.Add((Byte)  PackageInfo.Window);

// 2 de checksum
mPacketBytes.Add((Byte) (PackageInfo.CheckSum >> 8));
mPacketBytes.Add((Byte)  PackageInfo.CheckSum);

// urgentPtr .. 2 bytes
mPacketBytes.Add((Byte) (PackageInfo.UrgentPtr >> 8));
mPacketBytes.Add((Byte) PackageInfo.UrgentPtr);

// Options
foreach(Byte mOptions in PackageInfo.Options)
{
mPacketBytes.Add(mOptions);
++optionBytes;
}

// Padding (4 columnas de 8 bits)

while((optionBytes++)%4 != 0)
{
mPacketBytes.Add((Byte) 0);
}

//Data
foreach(Byte mBData in PackageInfo.Data)
{
mPacketBytes.Add(mBData);

}

Byte[] mRawPacket = new Byte[mPacketBytes.Count];
mPacketBytes.CopyTo(mRawPacket);
return mRawPacket;
}


usás package para rellenar los datos y obtenerlos en un Byte[] para más tarde  enviarlo ...
o de última usás algún port de PCap a .net, si bien podés PInvokear, mejor evitalo ...
otro detalle : forget about Managed C++

Saludos ~

P.S : en Linux se requiere privilegios root para poder mandar paquetes raw, sino : Exception -> Access denied

P.S 2 : eso no está optimizado, está escrito de manera que se vea bien

elmaro

Vertex.Symphony fue de gran ayuda el code para entender un poco mas del tema (es la primera vez que me pongo con armado y envío de paquetes)

Antes de empezar a hacer algo, el paquete lo voy a enviar usando pcap seguramente.
Usando como referencia el link que me dejaste:
En checksum:

This pseudo header contains the Source
    Address, the Destination Address, the Protocol, and TCP length.


                     +--------+--------+--------+--------+
                     |           Source Address          |
                     +--------+--------+--------+--------+
                     |         Destination Address       |
                     +--------+--------+--------+--------+
                     |  zero  |  PTCL  |    TCP Length   |
                     +--------+--------+--------+--------+


De que manera se arma? Porque la clase Package tiene puertos de origen y destino, pero no las direcciones. Las cuales se tienen que poner en CheckSum, si estoy equivocado en algo, estoy atento a correcciones.

Gracias por tu tiempo

[D4N93R]

Excelente, se ve muy bien.. acá te dejo un enlace de la wiki para que estudies la estructura, deberías leerlo:

http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure

Foxy Rider

Si, el code jamás completa algo, no era la intención, solo mostrar como empaquetar a Byte[] los datos del paquete que indiques en la clase para enviarlo (con lo que te trabaste...la implementación queda de tarea...incluído el checksum)
si quisieses hacerlo bien, dentro de la clase incluirías la data que falta (y que no puse ..), armás el pseudoheader, el header tcp y operás para obtener el checksum ...

te dejo como calcular el checksum :
http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader-2.htm
http://wwwse.inf.tu-dresden.de/data/courses/SE1/exercises/se_ws0405_exercise8_tcp_checksum.pdf
http://www.netfor2.com/tcpsum.htm

aunque si vas para pcap, then, don't make a big fuzz about this =P

Saludos ~