Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP pakete bauen + senden (https://www.delphipraxis.net/100408-tcp-pakete-bauen-senden.html)

Innos 27. Sep 2007 21:45


TCP pakete bauen + senden
 
hihi^^

also 1. ich habe die SuFu genuzt und
2. war das einzige was ich dazu gefunden habe ein (glaub italienisches) Tutorial... also naja ich kann kein italienisch^^

vllt könnt ihr ma eben ein paar anfänge verraten, da ich weiß dass das thema etwas größer ist...

ich benutze Wireshark um meinen inet verkehr "abzuhören" und habe dadurch glaub ich alles nötige ... also
destination port etc und Sequenz number...

habe gelsesen was man für son tcp Paket alles brauch.
nur wie setzt man das alles zusammen und versendet es dann? geht das mit TServerSocket oder ClientSocket?

wäre sehr dankbar für etwas hilfe^^
mfg Innos!

Innos 27. Sep 2007 22:45

Re: TCP pakete bauen + senden
 
also:
ich habe ein Programm dass immer auf eine bestimmte IP zugreift und von diesem server ein bestimmtes paket empfängt...
jetzt imitiere ich den server mit meinem eigenen prog und leite quasi die IP von dem client programm über einen Loopback Adapter auf mein prog...
so client is an meinem server connectet nur wie sende ich jetzt dem client genau dieses paket?

also vllt so?

Delphi-Quellcode:
serversocket1.socket.connection[0].sendbuf( {ja und was kommt hier rein?^^});
oder vllt mit sendstream? und was muss ich dann da reinschreiben? mit wireshark kann ich die bytes des paketes zB als (Offset Hex) kopieren... nur das geht leider nicht wenn ich es direkt hinter sendbuf schreibe -.-

f.siebler 28. Sep 2007 09:38

Re: TCP pakete bauen + senden
 
Moin,

was auch immer du vor hast, schau dir doch einfach mal die Basics zu TCP/IP bei wikipedia oder so an..
das könnte dich weiterbringen...
vll. solltest du auch mal schauen auf welchen Ports was wo gesendet wird....

Innos 28. Sep 2007 12:15

Re: TCP pakete bauen + senden
 
ok^^ ich schau mir das bei wiki gleich mal an...

ansonsten hab ich die vermutung dass ich mein problem vllt nicht genau erklärt habe xD

also:
eine fremde anwendung kommuniziert über TCP mit einem fremden server... iwo im inet^^
und prüft quasi, ob die ID, die man eingibt gültig ist... Das Paket habe ich mit Wireshark ausfindig gemacht und kenne IP und Port und Header eigenschaften ...

Jetzt habe ich einen Loopback adapter erstellt mit der IP des fremden servers um die verbing des Programmes auf mein eigenes Programm weiterzuleiten. In meinem Programm habe ich nun eine TServerSocket komponente mit dem benötigten Port.
Das fremde Programm connected sogar auch auf meinen ServerSocket.

Jetzt mein Problem:
ich möchte genau das paket, dass ich mit wireshark ausfindig gemacht habe über meine server komponente dem fremden Programm schicken, damit es denk: "JA ich bin am richtigen server angelangt"

ich habe gelesen, was alles so ein TCP/IP Header beinhaltet (daten sind in wireshark aufgelistet)... außerdem laß ich, dass man um solche pakete zu verschicken eine andere komponente als TServerSocket braucht. nur 1. welche? und 2. wie impletier ich die damit ich so ein paket versenden kann?

so hoffe das war jetzt verständlich genug^^
jetzt lese ich mir wikipedia durch :zwinker:

shmia 28. Sep 2007 12:25

Re: TCP pakete bauen + senden
 
Soll dein Programm als Man-In-The-Middle agieren
(also Client <-> DeinProg <-> Server)
oder soll dein Programm selbstständig arbeiten und so vortäuschen selbst der Server zu sein ?
(also Client <-> DeinProg)
In beiden Fällen brauchst die TCP-Header selbst nicht kreieren, sondern nur die Nutzdaten herumschaufeln.
Die Netzwerkpakete (also Ethernet-Header, IP-Header, TCP-Header) werden von WinSock zusammengebaut.

Innos 28. Sep 2007 12:58

Re: TCP pakete bauen + senden
 
aha klingt interessant^^
also so hab ich mir das vorgestellt:

client (fremde anwendung auf meinem PC) >>>> Mein Programm (als Server)

und wie schaufel ich die nutzdaten um?
kann ich hierfür TServerSocket verwenden oder brauche ich eine andere komponente? und wenn JA kann mann die nutzdaten mit

Delphi-Quellcode:
serversocket1.socket.connection[0].sendbuf();
verändern / umschaufeln?

EDIT: also es findet nach wieshark diese "handshake" statt (also jetzt mit dem original server, mein prog hat damit noch nix zu tun) also erst sendet der client die syn=x, dann der server syn=y ack=x+1 etc, dann wieder der client ack und syn und dann sendet
der original server eine DATA stream... genau DIESEN müsste ich "simulieren", wenn statt original server mein Prog gestartet ist, da du meintest der header wird automatisch generiert^^ ich verstehe daraus dass ich mich also nur um diesen DATA stream kümmern muss richtig?

shmia 28. Sep 2007 13:16

Re: TCP pakete bauen + senden
 
Zitat:

Zitat von Innos
kann ich hierfür TServerSocket verwenden oder brauche ich eine andere komponente?

Ja, entweder TServerSocket, Indy-Komponenten oder sonstige Kapselungen für WinSock (Fastnet PowerSock).
TServerSocket wäre die einfachste Möglichkeit.
Statt SendBuf() würde ich aber SendText() verwenden; damit werden Zeiger sowie Beschaffung und Freigabe von Speicher vermieden.

Innos 28. Sep 2007 13:36

Re: TCP pakete bauen + senden
 
also sendtext('{dann einfach den DATA stream hier rein kopieren?}') ?

Innos 28. Sep 2007 14:16

Re: TCP pakete bauen + senden
 
also das mit sendtext geht nur bedingt... also das erste paket konnte ich damit erfplgreich senden und der client hat das auch alles empfangen (da es auch tatsächlich nur ein string war, den ich übergeben musste)... jetzt müsste ich aber ein DATA stream senden, das 1049 Bytes groß ist und das aus lauter verschiedenener unlesbare zeichen enthält 0o wenn ich das mit sendtext() versuche klappt es nicht, da diese zeichen nicht zu einem string erkannt werden :wall:

ich glaube jetzt komm ich mit sendtext hier nicht mehr weiter...

shmia 28. Sep 2007 17:00

Re: TCP pakete bauen + senden
 
Zitat:

Zitat von Innos
jetzt müsste ich aber ein DATA stream senden, das 1049 Bytes groß ist und das aus lauter verschiedenener unlesbare zeichen enthält 0o wenn ich das mit sendtext() versuche klappt es nicht, da diese zeichen nicht zu einem string erkannt werden

Das ist kein Problem. Das Gute an dem (Ansi-)String in Delphi ist, dass er beliebige Daten (auch $00) aufnehmen kann und dass er dynamisch verwaltet wird.
Beispiele:
Delphi-Quellcode:
var s, t:string;  x : double;
begin
   s:= #27'[w'; // Escape Sequence für Drucker
   s:= #0#0#0#0'test'#0; // String mit Hex Nullen drin (C-Compiler hätten da Probleme mit)
   s:= #$F2#$A0#$01#$05; // wirklich beliebiger Inhalt (könnten sogar Maschinebefehle sein)
   s:= StringOfChar(#$FF, 512) + s; // so spart man Schreibarbeit
   // wenn ein String länger als 80 (Limit ist 255) Zeichen ist
   // sollte man die Zeilen umbrechen und die Teilstrings mit + verketten
   s:= 'ein ganz langer string.................................................'+
       'der hier weitergeht';

   x := 3.14;
   // mit SetString kann man beliebige binäre Daten in einen String reinpacken
   SetString(t, PChar(@x), sizeof(x));

   // von Stream => String
   SetLength(s, stream.Size);  // Speicherplatz im String reservieren
   stream.ReadBuffer(s[1], Length(s));
Es gibt für einen AnsiString nur das Limit vom max 2GB; das sollte aber kein Problem sein.

Innos 28. Sep 2007 17:43

Re: TCP pakete bauen + senden
 
also
diese Stream oder String keine ahnung sieht so aus:
Delphi-Quellcode:
‘L ¸êÄ«ˆ—_˜¯¼BĤâBÎë]²‰ûq?-J¬0ÿƒŽÕl]VîU¯01‰ñÖ&ÇÃ*èƒFÅ:E lâ ÀŠ'Ç‹}E˜Ö¥   *uØ3}»OÙµÝðyq@²„µf’*¡D;%MÛeÜJßåˆuÔ
so da gabs jetzt einmal das problem, dass mittendrin ein ' kam (also das ding, was strings eingrenzt zB bei x:='bla';)
d.h. der hörte da auf... ich hab bisl probiert und einfach direkt ein ' daneben gemacht und es ging 0o

naja dann war noch das problem mit diesen  , manchmal hat delphi anstat diese dinger darzustellen einen absatz gemacht...
aber das geht jetzt auch (fragt mich nicht warum)

so deinen code werde ich gleich mal bei einem anderen paket ausprobieren THX erstmal dafür :D

btw: kann man diese stream eigentlich iwie entschlüsseln? also gibt es vllt ein programm, dass häufig verwendete decodierungen hat?
wäre ganz nützlich

wicht 28. Sep 2007 18:05

Re: TCP pakete bauen + senden
 
Zitat:

so da gabs jetzt einmal das problem, dass mittendrin ein ' kam (also das ding, was strings eingrenzt zB bei x:='bla'
d.h. der hörte da auf... ich hab bisl probiert und einfach direkt ein ' daneben gemacht und es ging 0o
Das kann ich mir nur sehr schwer vorstellen. Der "string" in Delphi kann das 100%ig. Dass er NULL-Bytes aufnehmen kann war mir aber auch nicht klar. Ich benutze auf der Arbeit den C++ Builder 5 und da hatte ich mit NULL-Bytes als String Probleme.

Zitat:

naja dann war noch das problem mit diesen  , manchmal hat delphi anstat diese dinger darzustellen einen absatz gemacht...
aber das geht jetzt auch (fragt mich nicht warum)
Meinst du im Debugger, wenn du den Inhalt des Strings anschaust oder wie? Das liegt wohl daran, dass das ein Zeilenumbruch war (Code 10/13 in Dezimal). Da würde ich mir aber keine Gedanken machen. Eine Byte-Folge ist eben nicht unbedingt lesbar für einen Menschen. Denke mal, der ist verschlüsselt wie du selbst sagst. Ich würde hier sowieso nicht mit Strings arbeiten. Ich würde den TIdTCPServer nehmen und da einfach ein Byte-Array verschicken, was du dir vorher zusammenbaust. Das müsstest du bei dem TIdTCPServer in das OnExecute schreiben, die Daten einmal senden, vielleicht noch eine Antwort abwarten und dann die Verbindung schließen. Das mit dem Byte-Array sollte aber auch bei anderen Socket-Klassen funktionieren.
Zu deiner Frage mit dem entschlüsseln.... Ich denke, wenn du das willst, musst du die Daten selbst analysieren.

Innos 28. Sep 2007 18:14

Re: TCP pakete bauen + senden
 
wie sieht denn so ein byte array aus? also baut man da den header ein oder auch nur die nutzdaten... und wie nent sich das dann unter wireshark? da kann man nämlich diese nutzdaten kopieren als: Byte(Hex STream), Byte (Binary Stream) usw

Innos 28. Sep 2007 18:30

Re: TCP pakete bauen + senden
 
folgene 8 Pakete (mehr hab ich nich probiert weil es zu deprimierend war^^)
tun absolut das gleiche
Delphi-Quellcode:
//ÏP_wüXþX¦{q<øømd[@ Éºrýœpf°7ºrÍuy•ÆL4*óö×êIÖ»ìô0Á¹@êK‚Øÿc¨%¼“ŦF0V*€kXHJUJ€BeôÕ:4f<kÂF€°1ý’ò9› D“a‹Í 5KçÚwù?–   ³/Ø

//Y7´¸}öß–Ö]Ùv?`Ü£ô k탪·‰ï9Âû¡=óáûjXá EÕ‰š<ÉXT*Ru[£tùhÓåÛÇÜ’lùí   •øµnM””T›ó»óL$éh}±¼>/VõL4¶çóÀ£K+¯zˆÃ·¡ÝÊE£«n

//1fìÆ'?-8ûQ½aDÑ%¦úXˆ,Á-5Ö[ߎ ¸äæ’Š1l6DÜ¢\êS˜BÌ$o,ížgj/hm©¢™vÎ/u*¿Zf¡/Û(ƒ"rÞŠû7·Q_)'(ÒÆŠr"öÙd¼<Ì”‰\bað‡&^ãÜqª

//ê˜kD€FæÓ Ñw̱Ýs;Å„>Eѥ㲖Ó‡i[ÏoQ"ßhnV—}3œê‹¿-¨[›WÃUÖÐHn5ÍTõG*àÛ¼…q¸-ÖÁ¶H+‚žYúºà~?NÔA¡@³º”.‹3h¥ -†–„Mrrp<D¿ CšÊî©Ñ¥Y¸¤

//¿†”æBœƒ†Ä7¢@.<ë´{Z8Rå(2^n…Ê‘i4§ÐAF·'›3_ÄÔß0)³üY#)'+=±há˜ñd*œâ™®2Ô¢Õr"Ö–Q)+æ»æË*ÈŸ5]*ðQF6ê€4çæŠ5$GŸ˜•wÜ›º,

//4«.EŦ“ùqm´e¹ûÕÂýÐÂÞàƒ½ Û<þÈš†½ff‘RM¦ëäf„:xŒ¶kiÔTÁ–¯   fyº˜!¼aíÌÁ©Ž]åÔ´pþf\nºfQÍ¢–žòŠƒÔ=sþ( .¯v-½wrj3|‹%p¢®=Sȶ@˜äÏ

//ÇçbˆöÔ§–h¶þdHŸ:3Q{ì‚ÔLGÖ±GF*‰tAÁ«LYE]XuÔ:Yc¤U¼ÉÅo"Ê;§n ¬€Þã–5Ý$0¢ÏëÉÃCÏ2ë4°"o+ndТfx¸ûr˜í¼Œ¨.Ùª‘6¤÷·Ö–3`å k²‚A}wíêuÈÑ

//‘L ¸êÄ«ˆ—_˜¯¼BĤâBÎë]²‰ûq?-J¬0ÿƒŽÕl]VîU¯01‰ñÖ&ÇÃ*èƒFÅ:E lâ ÀŠ''Ç‹}E˜Ö¥   *uØ3}»OÙµÝðyq@²„µf’*¡D;%MÛeÜJßåˆuÔ
da eine regelmäßigkeit entdecken und das paket so ändern, iwie seine ID anstat die der beispiel ID einfügt^^, ist krank :D

wicht 28. Sep 2007 19:17

Re: TCP pakete bauen + senden
 
Ich denke die Nutzdaten reichen.

Delphi-Quellcode:
var
  Bytes: TIdBytes;
begin
  SetLength(Bytes, 20);
  Bytes[0] := 34;
  Bytes[1] := 54;
  Bytes[n] := i;
end;
Das ist nur ein Beispiel. Geht auch anders, z.B. mit Move() etc..... Tja, aber dieses Gewirr da zu entschlüsseln, äääh..... Ich muss weg! :-D

Innos 28. Sep 2007 19:33

Re: TCP pakete bauen + senden
 
hehe thx an euch^^ also einige pakete konnt ich erfolgreich senden bis halt zu diesem verschlüsselten teil :wall: :wall: :wall:
ich sitz da scho ewig vor und zähl iwelche zeichen :shock: :shock: :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz