Tal y como dice el titulo mi pregunta se trata de raw sockets y .net.
Estuve leyendo por ahí y mismo en el foro que desde XP SP2 Microsoft no admite mas trabajar con raw sockets. Entonces..
serverSocket = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Raw, ProtocolType.Raw)
Ahí estoy trabajando con raw sockets? O veo mal?
Espero puedan responder mi duda.
Saludos!
pues diria que si, no tengo npi idea de que es un raw socket, pero ahi lo defines de ese tipo :-X
Mi idea es crear paquetes SYN. Trate de usar la lib wincap en vb.net pero no la logre hacer funcionar.
¿¿y por que usas la libreria que net te da??
Porque me parece lo mas sencillo y porque no encontré otra cosa mas que me funcione. Aparte en lo personal prefiero usar algo que este integrado en .net antes que andar agregando referencias y no estar seguro de la estabilidad y compatibilidad que tenga. Pero si hay mas opciones, a probarlas. No estoy casado con nadie jaja :laugh:
http://msdn.microsoft.com/en-us/library/2b86d684.aspx
también podés buscar alguno de los ports de pcap a .NET, hay un par ...
este es uno --> http://www.codeproject.com/KB/IP/sharppcap.aspx
de última, PInvoke a lo guerrillero =P (swig te puede ayudar)
Saludos ~
Si lo quieres en español...
http://msdn.microsoft.com/es-es/library/2b86d684.aspx
Saludo.
Muchas gracias por las respuestas. En cuanto tenga un minuto reviso y pruebo.
Si me funciona bien posteo el code.
Gracias nuevamente
estuve probando los ejemplos de CodeProject, muy buenos la verdad.
El ejemplo que envía paquetes, genera uno aleatorio
private static byte[] GetRandomPacket()
{
byte[] packet = new byte[200];
Random rand = new Random();
rand.NextBytes( packet );
return packet;
}
Como puedo crear los paquetes con los datos que yo quiera? Principalmente me interesa el Header y el puerto e IP de destino. Por algún lado había visto como eran los distintos tipos de paquetes, pero no recuerdo donde era y no lo puedo encontrar.
Encontré esto para crearlos, perlo la verdad no me sirve de mucho (http://www.netscantools.com/nstpro_packet_generator_tcp.html)
Necesitaría crearlos yo mismo mediante código.
Cualquier sugerencia es bienvenida.
Gracias!
Edit:
Algo interesante
http://foro.elhacker.net/redes/el_modelo_tcpip-t33974.0.html;wap2=
Apuesto a que estás haciendo un Port Scanner! jeje :P
Dale dale que si se puede en .net! ;)
Saludos! :D
D4N93R , tu lo has hecho? Tienes el code para crear los paquetes? ;D
Si es así, navidad llego temprano para mi :laugh:
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!
Excelente idea. Voy a ponerme con c++ jeje
Gracias y cualquier novedad la posteo. Nunca esta de mas
C++ .Net, es mejor si quieres interactuar con .Net y Win32... :D
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 (http://www.freesoft.org/CIE/Course/Section4/8.htm) :
// 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
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
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 (http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure)
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 ~