Avatar billede repsac666 Nybegynder
12. januar 2005 - 10:39 Der er 12 kommentarer

Send TCP/IP pakke vha. raw sockets

Hej allesammen

Jeg har et svært spørgsmål (synes jeg). Jeg skal sende en TCP pakke vha. raw sockets, altså uden at først oprette en forbindelse. Jeg har fået det til at virke med en ICMP (ping) pakke, men tcp driller. Jeg bruger følgende kode:

IPEndPoint IPEndPointTo = new IPEndPoint((Dns.GetHostByName(destAddress)).AddressList[0], 34745);
EndPoint EndPointTo = (IPEndPointTo);   

IPEndPoint IPEndPointFrom = new IPEndPoint((Dns.GetHostByName(Dns.GetHostName())).AddressList[0], 5412);       
EndPoint EndPointFrom = (IPEndPointFrom);

mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp);
mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);

Så konstruerer jeg de data som jeg skal sende, smider dem i et byte array der hedder buffer og kører:

mySocket.SendTo(buffer, EndPointTo);

Ved denne linie kode får jeg fejlen:

"An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in system.dll

Additional information: An invalid argument was supplied"

Dette er det samme som jeg gør når jeg sender en ICMP pakke (hvilket virker). Er der nogle kald jeg skal lave som jeg ikke gør eller er der noget andet galt?

Jeg håber i kan hjælpe...jeg er desparat!
Avatar billede repsac666 Nybegynder
12. januar 2005 - 10:43 #1
Kan det være at der bliver sat nogle flag når man opretter en forbindelse normalt som mangler at blive sat? Kan det overhovedet lade sig gøre?
Avatar billede burningice Nybegynder
12. januar 2005 - 13:47 #2
sådan som jeg læser SDK'et, så skal du kalde Connect først, da TCP jo er en connectionoriented protocol:

If you are using a connection-oriented protocol, you must first establish a remote host connection by calling the Connect method or accept an incoming connection request using the Accept method. If you do not establish or accept a remote host connection, SendTo will throw a SocketException.
Avatar billede repsac666 Nybegynder
12. januar 2005 - 14:34 #3
Er der så en måde hvorpå jeg kan bruge en anden protokol, hvor jeg selv får lov til at konstruere IP headeren og TCP headeren? Jeg har forsøgt at gøre noget med

mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw);
mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);
mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);

dette har jeg dog ikke fået til at virke. HeaderIncluded har ikke nogen effect tilsyneladende eller måske bruger jeg den forkert, fordi der kommer altid en header med hvor der i protokol feltet står 255. Det vigtige er bare at det kommer til at være en gyldig TCP/IP pakke; metoden er ligegyldig.

Jeg håber der en kan hjælpe. På forhånd tak. Og tak for kommentaren cyberfessor, jeg tror du har ret i at det ikke kan komme til at lykkes med ProtocolType.Tcp.
Avatar billede burningice Nybegynder
12. januar 2005 - 14:42 #4
in tcp/ip pakke?? det giver jo ikke mening.

hvad nu hvis du bare bruger udp? så burde du bare kunne sende afsted uden at connecte først
Avatar billede repsac666 Nybegynder
12. januar 2005 - 15:00 #5
Meningen med mit projekt er at det rent faktisk skal teste en firewall, så derfor skal det kunne sende nogle forskellige pakker (ICMP, TCP og UDP) hvor jeg brugeren så kan sætte pakken sammen som han vil (source port, destination port, ack osv). Den skal altså sende pakker der er gyldige men uden der nødvendigvis er nogen grund til at sende lige netop dén pakke fx en acknowledgement uden der er sendt noget data at kvitere for. Så kan man så se på den anden side om firewallen filterer de pakker fra som den skal. Det burde jeg nok have forklaret lidt bedre så jeg undskylder.

Jeg har rent faktisk fået UDP og ICMP til at virke så jeg mangler bare at få TCP til at makke ret.
Avatar billede burningice Nybegynder
12. januar 2005 - 15:13 #6
:)

well, kan du ikke bare connecte til en tilældig computer via tcp for at få den til at sende din pakke?
Avatar billede burningice Nybegynder
12. januar 2005 - 15:19 #7
dog tror jeg næsten man skal ned og rode direkte med netkort-driveren, uden om Socket-klassen. Det ser i hvert fald ud som om den overholder de basaler regler der gælder for de forskellige protokller. Så hvis man vil undgå dem, skal du nok lave noget Interop med nogle win32-dll og snakke direkte med netkortet.

Wincap var f.eks. en mulighed, dens API findes her: http://winpcap.cs.pu.edu.tw/docs/docs31beta4/html/group__packetapi.html

Lader faktisk til der allerede er lavet en wrapper for Wincap til .net: http://www.thecodeproject.com/csharp/pktcap.asp
Avatar billede bufferzone Praktikant
12. januar 2005 - 15:25 #8
Jeg erret sikker på at du kan gøre dette med programmet NetWox. NetWox og de tilhørende interfaces og lib's er programmeret af en franskmand, der er rigtig hjælpsom. Programmet er open source, så du kan hente det, se kilde koden og få hjælp af Laurent til at lave din egen kode, hvis du da ikke kan anvende netvox direkte til det
Avatar billede repsac666 Nybegynder
12. januar 2005 - 16:03 #9
Jeg kan bare ikke forstå hvorfor. Med

mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw);
mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);
mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);

burde jeg da få et helt tomt datagram hvor jeg så kan fylde de ting i som jeg vil? Hvad skal den eller bruges til? Desuden er der adskillige steder der siger det modsatte, her er en:
http://wiki.hping.org/148

Der er bare ikke nogle kode eksempler i C# og jeg kan ikke C/C++.
Her er en der fortæller lidt om det, men i C

http://www.faqs.org/faqs/internet/tcp-ip/raw-ip-faq/
Avatar billede repsac666 Nybegynder
12. januar 2005 - 16:12 #10
Der er desuden en på www.planet-source-code.com (som tilsyneladende er nede i øjeblikket) der har lavet et projekt der skulle kunne lige netop det som jeg vil (det hedder vidst "easy socket v3 (network stuff)"), men det virker ikke. Når jeg fejler hans try-catch om det der sender hans pakke får jeg følgende fejl:

"An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in system.dll

Additional information: A blocking operation was interrupted by a call to WSACancelBlockingCall"

han går sådan:

mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);
mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
mySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.Broadcast, 1);

fylder data ind i et byte array jeg kalder buffer og kører:

mySocket.SendTo(buffer, EndPointTo);

Kan det være at der er nogle netværksresourcer, der er slået fra hvor jeg sidder?
Avatar billede burningice Nybegynder
12. januar 2005 - 16:28 #11
jo, men spørgsmålet er jo bare hvor meget socket der egentig er over System.Socket.Socket i .Net. Om den virkelig giver dig uforbeholdne muligheder for at strikke dine pakker sammen som du har lyst. For mig virker det som om at man er tvunget til at holde sig indenfor nogle fastsatte rammer. Og at hvis du har brug for helt frie hænder må du ty til mere lowlevel kode.

Du siger "burde jeg da få et helt tomt datagram hvor jeg så kan fylde de ting i som jeg vil". En socket er jo ikke en abstraction af et datagram. Din socket er en dør ned til dit netkort hvorigennem du kan sende data. Den har indbygget support for mange forskellige protokoltyper, og det er måske her det går galt. ProtocolType.Raw svarer til Raw UP packet protocol (255 i headeren). Prøv at brug Unspecified istedet (0 i headeren).

Jeg har umiddelbart svært ved at se hvordan man skulle kunne sammensætte sit eget datagram og sende det afsted via en .net socket.
Avatar billede repsac666 Nybegynder
12. januar 2005 - 16:40 #12
AAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHH

Damn you Service Pack 2!

Jeg har lige fået et gennembrud. Det kan ikke lade sig gøre over service pack 2.

Så må jeg ud og finde en computer der ikke har SP2 til formålet. Tak for hjælpen alligevel. Dette er et super forum.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester