Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie auf record schließen? (https://www.delphipraxis.net/66497-wie-auf-record-schliessen.html)

Eichhoernchen 30. Mär 2006 14:11


Wie auf record schließen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab da mal ne Frage:

Ich würde gern ein Programm nachschreiben was sich auf einen Server connectet und dann dinge tut, nun das Problem:

Ich kann die Pakete abfangen die das Programm sendet(ist ein Delphi Programm) und für mich sieht das stark nach nem Record aus was da gesent wird, jedoch bekomme ich nicht alle Felder raus die in dem record sind.

Wie kann ich z.B. unterschreiden ob in dem record ein string[29] oder rein array[0..28] of char ist?

Im Anhang befindet sich mal ein Paket, dass ich mit Hilfe von Ethereal abgefangen hab, dass ist jetzt nur der Teil des Paketes den Ethereal als das Datenpaket ansieht.

Nächste Frage: Darf ich das überhaupt? Die Daten von nem Programm abfangen und mit deren Hilfe ein ähnliches Programm schreiben?

Ich möchte dann ja mit dem Server kommunizieren, würde es dann nen Unterschied machen wenn ich die Records verdrehen würde:

Delphi-Quellcode:
type TLogininfo = record
                   Name, Passwort : string[29];
                   Alter : integer;
                  end;

type TLogininfo = record
                   Alter : integer;
                   Passwort, Name : string[29];
                  end;
Jetzt hab ich 2 Records die die selben Werte fassen können aber anders aufgebaut sind, macht das einen Unterschied?




Danke schonmal Eichhoernchen

markusj 30. Mär 2006 14:52

Re: Wie auf record schließen?
 
Hallo!

Ich denke, dass es sich um einen Stream handelt.
Wegen Array of Char<>String: Einem String geht eine Angabe über die Länge voraus, es müsste also eine Zahl (als byte oder word encoded) zu finden sein, die zum String passt.
Was die Array-Reihenfolge betrifft: die ist egal, es kommt auf die Sende-Reihenfolge an, es wird ja ein Stream geschickt und ein Stream am anderen Ende geparst.

Ach ja, was das Rechtliche betrifft: meines Wissens nach ist das sogenannte Reverse-Engeneering nicht verboten und wird in der Open-Source-Welt tagtäglich gemacht.

mfG

Markus

Eichhoernchen 30. Mär 2006 15:04

Re: Wie auf record schließen?
 
Ahh danke schonmal für die Infos.


Das heißt wenn da nen String gesendet wird steht da z.B.:

29ABC



Aber warum meinst du, dass da ein Stream gesendet wird? Glaub es dir ja aber wie kommst du darauf?

markusj 30. Mär 2006 15:35

Re: Wie auf record schließen?
 
Aaalso:

1. Wenn da ein String mit der Länge 150 gesendet wird, sieht das ganze so aus: "-abcdef..."
Wenn du dir "-" im Hex-Editor anschaust wirst du feststellen, dass es 150 als ord(-) ergibt.
Und warum ich tippe, dass es ein Stream ist? Nun, weil jeder Datenverkehr als Stream ebtrachtet werden kann,
ein Gespräch kann man als Stream sehen, ein Bild, Netztwerkverkehr etc.
Es muss ja hier etwas in einer bestimmten Reihenfolge übertragen werden, das heisst wir haben einen Datenstrom (den du aufgefangen hast), und den können wir dann auch so interperetieren, nämlich Byte für Byte, bzw. als Grupee von Items, aus denen er zusammengesetzt wurde.

mfG

Markus

EDIT: Wenn du dir mal das "Kästchen" vor jedem String im Hex-Editor betrachtest, stellst du fest, dass der Byte-Wert der Länge des Strings entspricht. Mit den übrigen Zwischenräumen und Kästchen kann ich aber nichts anfangen, das ist dein Job.

EDIT2: Für das Reverse-Engeneering wäre es sinnvoll, zu wissen, welche Daten übertragen werden, wenn du mehrere Vergleichsdatensätze auffängst, dann lassen sich nämlich gewisse Muster herauslesen.

Corpsman 30. Mär 2006 16:27

Re: Wie auf record schließen?
 
Ho,

Ich hab mal ein Programm geschrieben in dem ich aus einer Datei Recors via Stream auslesen wollte.

Ich wuste wie das Record aussah das reingeschrieben wurde.

Also dachte ich das ist ganz einfach .

Nach ettliche Versuchen muste ich feststellen das da serh wohl unterschiede sind.

Wenn ich also Deklariere.

Delphi-Quellcode:
Type
  Bla = Record
    x,y,z : Integer;
    data : Byte;
  end;

  Bla1 = Record
   x:Integer;
   y:integer;
   z:Integer;
   data:Byte;
  end;

  Bla2 = Record
    data : Byte;
    x,y,z : Integer;
  end;
dann habe ich genau 3 verschiedene varianten von Records obwohl die alle das gleiche beinhalten.

Übrigens die 2. Variante war die einzige die ging.

Eichhoernchen 30. Mär 2006 17:31

Re: Wie auf record schließen?
 
so, ich denke ich habe jetzt alle Sachen bis auf 3/2 herausbekommen:

In dem Connect Dialog gibt es einmal 2 Radiobuttons und ne Checkbox,
bei der checkbox denk ich mal es wir ein Boolean sein, bei den 2 Radioboxen könnte es auch oder eben nen Integer vllt.


So sieht der hex Code aus in allen zuständen:

Delphi-Quellcode:
Checkbox = true
Radiobutton 1

E1 A3 24 FD

----------

Checkbox = true
Radiobutton 2

94 0D F2 D3 

----------
Checkbox = false
Radiobutton 1

D0 80 3E ED

----------
Checkbox = false
Radiobutton 2

A5 2E E8 C3



Das ist jeweils der Hexcode der sich ändert aber der sagt mir nicht wirklich was, müsste ich nicht z.B. eine Gemeinsamkeit beim 1 und 2 feststellen? Da dort jeweil die Checkbox auf true steht?





EDIT: Hab was übersehn, das da oben gibt wohl nicht den Status der boxen an hab noch was anderes übersehn, da ist mittendrinn noch immer nen block wo:

01 01 oder 01 02 oder 00 01 oder 00 02

denke mal der 1. block ist die checkbox und die andere der Radiobutton, aber mit welchen typ wird der Radiobutton übergeben? byte?

Aber nichts desto trotz die anderen Werte ändern sich auch immer nur wenn ich die boxen ändern, was können die bedeuten?

Eichhoernchen 31. Mär 2006 09:04

Re: Wie auf record schließen?
 
Hab noch nen problem, wenn ich nen Record habe mit nem String und den beispielsweise mit write() in eine Datei schreibe kommt hinterher im hexeditor folgendes:


Delphi-Quellcode:
So kommt es raus:
00000000h: 09 54 65 61 6D 53 70 65 61 6B 00 00 00 00 00 00 ; .TeamSpeak......
00000010h: F0 FD 12 00 A8 05 D2 77 BC 84 D1 77 C8          ; ðý..¨.Òw¼„ÑwÈ


Aber warum sind da noch so viel andere Sachen müsse es nicht so aussehen:

00000000h: 09 54 65 61 6D 53 70 65 61 6B 00 00 00 00 00 00 ; .TeamSpeak......
00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00          ; .............

Im record steht ein string[29] an der Stelle wenn ich es mit einen array[0..28] of char mache dann sieht es so aus wie das 2. nur eben ohne die Längenangabe ganz am Anfang.


Also warum schreibt delphi in den Reststring noch so viel Müll rein? Bzw. Wie schaff ich es, dass es dass nicht tut?


Hab es jetzt mal über den umweg über einen Pointer reingeschrieben, dann erhalte ich folgendes:

Delphi-Quellcode:
00000000h: 09 54 65 61 6D 53 70 65 61 6B 00 00 0D 00 00 00 ; .TeamSpeak......
00000010h: 4D 53 20 53 61 6E 73 20 53 65 72 69 66          ; MS Sans Serif
Delphi scheint wohl noch ne Textart mitzuliefern?

Luckie 31. Mär 2006 09:12

Re: Wie auf record schließen?
 
Zitat:

Zitat von Corpsman
Wenn ich also Deklariere.

Delphi-Quellcode:
Type
  Bla = Record
    x,y,z : Integer;
    data : Byte;
  end;

  Bla1 = Record
   x:Integer;
   y:integer;
   z:Integer;
   data:Byte;
  end;

  Bla2 = Record
    data : Byte;
    x,y,z : Integer;
  end;
dann habe ich genau 3 verschiedene varianten von Records obwohl die alle das gleiche beinhalten.

Bla und Bla1 müssen identisch sein. Es ist lediglich eine andwere Schreibweise, die den Code aber in keinster Weise beeinflusst.

markusj 31. Mär 2006 09:46

Re: Wie auf record schließen?
 
Genau was ich sagte, aber zu Eichörnchen Problem: Du musst den String vorher leeren, ich habe keine Ahnung ob es dafür eine Funktion gibt, aber im Zweifelsfalle, mach dich einfach mit einer Schleife den String erstmal mit Leerzeichen voll.

mfG

Markus

Eichhoernchen 31. Mär 2006 09:59

Re: Wie auf record schließen?
 
hmm das Problem tritt nur auf wenn ich es aus einer VCL Form raus in die Datei rein schriebe bei einer Konsolenanwendung sieht es richtig aus.


Ich hänge aber immer noch etwas in der 1. Datei die ich oben angehängt habe sind die ersten 3 Bytes die Folgenden:
Delphi-Quellcode:
F4 BE 03
aber was bedeutet das?
F4 ist ja 244 also hab ich an nen shortstring gedacht aber das kann ja nicht sein, das ganze Paket hat ja nur 180 byte
BE ist 190 naja das sagt mir mal gar nix
03 ist 3 und naja toll ...

Weiter im Text kommt nur noch ne 01 und dann noch die Bytes die sich immer ändern wenn ich die Checkboxen änder, die aber nicht deren Wert angeben.


Und später mitten drinn kommen noch mal nen paar konstante Byte wofür die stehen weiß ich noch nicht, aber die ändern sich wenigstens net egal wie ich es einstelle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 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