![]() |
IP - Hardcore
Hi zusammen,
ich habe im moment vor, mich mal auf etwas systemnaherer ebene mit der internetprogrammierung zu beschäftigen, sprich ohne indy oder ähnliche komponenten. da dachte ich mir wäre es ein anfang, einfach mal ein ip paket zu versenden. da hört mein basiswissen aber dann auch auf ;) also, ein ip paket hat ja diesen aufbau:
Code:
so, erstmal dazu ein paar fragen:
Bits | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|-----------------------------------------------------------------------------------------------| | Version |Headerläng.| Service Typ | Gesamtlänge | |-----------------------------------------------------------------------------------------------| | Identifikation | Flags | Fragment Offset | |-----------------------------------------------------------------------------------------------| | Time To Live | Protokoll | Header Prüfsumme | |-----------------------------------------------------------------------------------------------| | Sende Adresse | |-----------------------------------------------------------------------------------------------| | Empfangs Adresse | |-----------------------------------------------------------------------------------------------| | IP Optionen | Füllbits | |-----------------------------------------------------------------------------------------------| | Daten... | |-----------------------------------------------------------------------------------------------| Version: das ist die IP Version oder? also IPv4, nur in welchem format gibt man das an? Headerlänge: klar, die länge des headers, aber in bit oder in byte? Service typ: was kommt hierein? Gesamtlänge: klar, nur frage wie headerlänge Identifikation: hat doch was mit fragmentierung zu tun oder? Flags und Fragment Offset gleiche Frage Time To Live: klar Protokoll: kommt da sowas rein wie telnet, smtp, ftp etc? Header Prüfsumme: auch klar, nur wie bilden? Sende Adresse: IP des Senders (von mir) Empfangs Adresse: IP des Empfängers IP Optionen: welche gibts da? Füllbits: haben wohl keine weitere aufgabe Daten: auch klar. (ach ja und: neue frage neuer thread macht imho wenig sinn hier) Nunja, wenn man nun so ein paket gebastelt hat, und nun kommt das hauptproblem, wie kriegt mane s dann dazu, sich zum empfänger zu bewegen? das ist mir im moment noch absolut schleierhaft! hoffe auf eure hilfe, *MFG* |
Re: IP - Hardcore
|
Re: IP - Hardcore
Guck dich mal auf dieser Seite etwas um:
![]() |
Re: IP - Hardcore
hmm ... zur erklärung eines IP-Packetes, da kam mal nen guter vortrag darüber im IT-Kompaktkurs auf BR-Alpha, vielleicht hilft dir das ja weiter (TCP/IP). Ein paar links dazu:
![]() ![]() Allerdings denke ich, dass das größere problem ist, diese packete zu senden, denn meineswissens nach kann man das (unter win) nicht so direkt, außer man ist rein zufällig netzwerktreiber ... ;) ciao, Philipp |
Re: IP - Hardcore
Zitat:
|
Re: IP - Hardcore
Zitat:
Hier noch ein kleiner Link: ![]() |
Re: IP - Hardcore
Zitat:
|
Re: IP - Hardcore
In Sachen RAW-Sockets hab ich noch was interessantes gefunden, denn wie es scheint, können diese unter WinXP SP 2 nichtmehr richtig eingesetzt werden:
![]() ciao, Philipp |
Re: IP - Hardcore
danach hab ich leider auch sehr lange vergebens gesucht,
ich bin dabei nur auf eine udp variante gestoßen: ![]() vielleicht bringt dich das ja ein wenig weiter |
Re: IP - Hardcore
oder per Ethereal (sf.net) mal ein paar packets mitprotokollieren, dann kannst du genau sehen, wie sie aufgebaut sind!
|
Re: IP - Hardcore
Und Ethereal kommt auch mit Source. Dort sieht man also auch, wie man die Pakete empfangen kann :) Und ich glaube, Ethereal kann auch einzelne Pakete senden. Dort hat man also ne gute Vorlage.
|
Re: IP - Hardcore
leute, ob udp oder tcp steht bei raw ausser frage, da man dort das protocol selber zusammen friemeln muss.. so wird raw auf dem ip layer genutzt und man kann damit icmp, tcp, udp, ALLES ANDERE AUCH
zusammenbauen und als paket verschicken //edit wenn nicht sogar, muss man den ip header oder ethernet auch noch selber machen (nicht genau weis) eine entprechende demo mit source für delphi enthalten diverse sources von madshi und iphlpapi wird benötigt ausser man baut die auch selber ;) ich hab da ein paar gute sources von syn floodern und anderem krempel gefunden, der auf iphlpapi aufsetzt und damit raw pakete sendet. aber bitte keine anfragen! das zeug lässt sich mit ein wenig selbstinitiative selber ergooglen. |
Re: IP - Hardcore
Ganz schön und gut. Aber was soll das ganze?
Wenn ein Programm Datenpakete über ein Medium (Netzwerk) schicken will, muss es sich an die entsprechenden Konventionen (Gesetze) halten. Also der Header für das Senden im Internet wird dann wohl TCP/IP bleiben - sprich IP (Internet Protocol)! Ich denke, die Art des Headers wird man nicht selber bauen können. Dann verstehen die ganzen anderen Netzsegmente nicht mehr was los ist :) . Es stellt sich somit eher die Frage wie kann man das vorhandene IP entsprechend seinen Wünschen konfigurieren? Nich? |
Re: IP - Hardcore
Zitat:
TCP/IP sind 2 Protokolle TCP ist das Transmission Control Protocol und liegt auf dem IP (Internet Protocol) auf Im internet wird auch das UDP Protokoll genutzt (teilweise Gameserver oder Radio und TV sender) Bei TCP muß zuerst die Verbindung Server-Client hergestellt werden und bei UDP kann auch gesendet werden ohne das Clients verbunden sind. Hier kann ein Client später verbinden. Erst darüber wird ein Protokoll wie HTTP,FTP oder ähnliches genutzt. Wenn man nun nicht TCP oder UDP nutzen möchte (aus welchen Gründen auch immer) muß man sich sein eigenes Protokoll bauen. UDP ist recht flexibel und kleiner als TCP, da keine Kontrolle der Datenpakete vorgenommen wird - somit reicht es für die meisten Dinge darauf aufzusetzen. TCP prüft die korrektheit der Pakete (Reihenfolge der Pakete und Prüfsumme ob das Paket selbst in Ordnung ist) und schickt die Pakete gegebenenfalls nochmal. Das IP soll als Basis genutzt werden wie ich es verstanden habe, nur eben nicht TCP. |
Re: IP - Hardcore
Zitat:
ich versuche mich nämlich grade auch daran, allerdings basierend auf einer anderen Quelle (SysInternals - ShareEnum\Source\Ping.cpp) und erhalte beim Empfangen einen Fehler "WSAGetLastError: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat" dabei ist mein Router sehr wohl online :mrgreen: sonst wär ich ja nicht hier... anbei mal den Stand der Dinge zum Pingen (Jedi-Übersetzungen von WinSock2 benötigt):
Delphi-Quellcode:
unit SockPing;
interface uses Windows,SysUtils,JWAWinSock2; const ICMP_ECHO=8; ICMP_ECHOREPLY=0; type TIcmpHeader=Record i_type: Byte; // ICMP packet type i_code: Byte; // type subcode i_chksum: USHORT; // packet checksum i_id: USHORT; // unique packet ID i_seq: USHORT; // packet sequence number timestamp: ULONG; // timestamp data:array[0..31]of char; end; function Ping(Const Server:String):boolean; implementation function Ping(Const Server:String):boolean; var Sock:TSocket; Addr:TSockAddrIn; WD:WSAData; ICMPhdr:TIcmpHeader; datasize,fromlen,Timeout:Integer; begin WSAStartup(MakeWord(2,2),WD); Sock:=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,nil,0,WSA_FLAG_OVERLAPPED); Result:=not(Sock=Invalid_Socket); if not Result then exit; TimeOut:=100; Result:=not(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@Timeout,Sizeof(Timeout))=SOCKET_ERROR); if not Result then exit; TimeOut:=100; Result:=not(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,@Timeout,Sizeof(Timeout))=SOCKET_ERROR); if not Result then exit; with Addr do begin sin_addr.S_addr:=inet_addr(Pchar(Server)); sin_family:=AF_INET; end; with ICMPhdr do begin i_type:=ICMP_ECHO; i_code:=0; i_id:=Ushort(GetCurrentProcessId); i_chksum:=0; i_seq:=0; timestamp:=GetTickCount; FillChar(data[0],32,0); end; DataSize:=Sizeof(icmphdr); Result:=not(sendto(Sock,ICMPhdr,DataSize,0,@Addr,Sizeof(TSockAddrIn))=SOCKET_ERROR); if not Result then exit; Result:=not(recvfrom(Sock,ICMPhdr,DataSize,0,@Addr,fromlen)=SOCKET_ERROR); if not Result then begin Writeln('Error! RecvReason: '+SysErrorMessage(WSAGetLastError)); exit; end; closesocket(Sock); WSACleanup; end; end. |
Re: IP - Hardcore
Nope. Ich hatte bisher keine Lust mich damit zu beschäftigen.
|
Re: IP - Hardcore
wenn du rausfinden willst warum dein code nicht funzt solltest du mal bei jeder zeile mit einem winsock-kommando den rückgabewert (typ INTEGER, nicht boolean) auf SOCKET_ERROR prüfen, und falls dem so ist die WSAGetLastError msg anzeigen lassen
bzgl wie mahct ethereal das: ![]() und btw: raw sockets mit winsock kann man nur mit admin rechten ausführen, was das ganze sehr unattraktiv macht |
Re: IP - Hardcore
Mich interessiert mal ober ihr das hinbekommen habt ?
Bau auch gerade daran ^^ doch ich empfange nichts :-(. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz