Ethernetframes als String darstellen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von mrwebber.

    Ethernetframes als String darstellen

    Hi,

    ich habe ein Ethernetframe in Form eines Bytearrays() vorliegen.
    Ich würde gerne lesen können, was z.B. FileZilla bei einer FTP-Verbindung sendet. (Kennt ihr ja, steht immer da oben) ...
    Nun habe ich alle möglichen Codierungen durchprobiert:

    VB.NET-Quellcode

    1. Private Function ReadByte(ByRef Barr() As Byte) As String
    2. Return Encoding.Unicode.GetString(Barr, 0, Barr.Length)
    3. End Function


    VB.NET-Quellcode

    1. Private Function ReadByte(ByRef Barr() As Byte) As String
    2. Return Encoding.ASCII.GetString(Barr, 0, Barr.Length)
    3. End Function


    usw.

    Leider konnte ich die FTP-Befehle nicht lesen. Bei Unicode kommen nur chinesische Zeichen raus, bei anderen Codierungen eben auch unleserliche Zeichenfolgen.
    Kennt jemand die Codierung bzw. auch die dazugehörige Umwandlungsmethode? Wäre toll das Frame mitsamt Header usw. lesen zu können (wie in WireShark)!

    Danke

    EDIT: Hier ein kurzes Video wie es aussieht momentan: file-upload.net/download-7318859/snifferFilezilla.avi.html oder jahalso.dyndns.org/real/PUB/DOWNLOAD/snifferFilezilla.avi

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „mrwebber“ ()

    Ich sage das. Ich möchte z.B. FTP ausfiltern und anzeigen. (und auch nach anderen Sachen evtl. später filtern). Was da sonst noch irgendwie codiert herumschwirrt ist mir egal.
    Die Daten müssen nur so codiert werden, dass wenn ein String vorliegt, dieser korrekt dargestellt wird und ausgewertet werden kann. Wenn kein String vorliegt wird mein Filter nicht anspringen, denn es kommt ja nur Kauderwelsch an.
    Wie oben gesagt orientiere ich ich am Beispiel Wireshark. Dort kann man sich die Frames auch als Mensch anschaun und man sieht die Daten, die z.B. in FileZilla protokolliert/angezeigt werden. (Siehts du ja auch im Video)

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Das Zeug ist binär codiert. Du musst dir die jeweiligen Spezifikationen durchlesen und die Bytes und Bits auseinander nehmen und diese dann so zu lesen.
    Wenn du dir das wirklich antun möchtest wird du wohl oder übel erstmal via google die jeweiligen Spezifikationen suchen und dann halt durcharbeiten müssen. Wenn du nicht weiß wie man dann z.b. das 5 bit liest kannst du wieder fragen :)
    Bis dahin viel spaß.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Rinecamo schrieb:

    Ich denke mal die Programme "machen" aus den Paketen Strings (0xFF... könnte z.B. "Disconnect" sein, u.s.w.). Wäre hirnrissig nen Befehl als String zu verschicken.

    Jaja. Das schon. Für FTP werden ja diese Zahlen benutzt 211 ist z.B. END. Jetzt melde ich mich aber beim Server an. Dann sendet mein FileZilla USER mrwebber.
    Und genau das möchte ich durch meine Codierung lesen können. Wie in Wireshark eben.
    Schaut euch am besten kurz das Video an, dann könnt ihr euch das vielleicht besser vorstellen.

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Und wieso so kompliziert?

    VB.NET-Quellcode

    1. ConnectToServer(username, password)
    2. Console.WriteLine(String.Format("USER={0} PASSWORD={1}", username, password))


    Wenn du da anfängst Frames zu sniffen wirste nie fertig. Wenn du dich mit dem Server bindest schreibst du halt deine Nachricht. Wer sagt, dass die Meldungen von FileZilla dem tatsächlichen Netzwerkverkehr entsprechen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    FTP ist 3 Layer über Ethernet. In einen Frame passen 1500 Bytes Payload. Diese wird aber nicht immer ausgenutzt (wegen verschiedenen MTUs). Dazu kommt noch der TCP- und IP-Header (die müssen zwar nicht in jedem Ethernet Frame stehen, aber müssen trotzdem erkannt werden).
    Eine gute Netzwerkanalyse, die nicht einfach alles als String interpretiert, ist nicht einfach.

    Falls du es dir einfach machen willst, schaust du im FTP-Standard nach, welche Zeichenkodierung verwendet wird. Laut dem FileZilla-Wiki ist das 7-Bit ASCII und später UTF-8. Encoding.UTF8 könnte dir da vielleicht helfen. Erwarte aber nichts lesbares, besonders nicht am Frameanfang, wo der Ethernetheader steht.
    Von meinem iPhone gesendet

    nikeee13 schrieb:

    Eine gute Netzwerkanalyse, die nicht einfach alles als String interpretiert, ist nicht einfach.

    Das soll es auch nicht werden ;) Mir genügt es, den Namen des Users herauszufiltern.
    Dass da dann nur ein kleiner Teil lesbar ist, ist logisch. Die ganzen Header stören ja nicht, sofern USER mrwebber irgendwo dazwischen steht. Dann kann ich ja ganz billig mit sPaket.contains("USER") nach dem passenden Paket suchen und mir das mal anzeigen. Blöd wär's nur, wenn das TCP genau im USER splitten würde. Wäre dann halt Pech für mich. Mit UTF-8 kommt nur ein ganz kurzer (6 Zeichen) String raus ... Es sind aber sehr viele Bytes (siehst ja im Video) ...

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Das mit den 6 Bytes liegt wohl daran, dass an der 7. Stelle ein NULL-Byte steht ('\0000', Null-terminated String). Die IDE und viele andere GUIs schneiden dann einfach den Rest des Strings ab. Kannst dir ja mal die Länge des Strings ausgeben lassen, denn die sollte bei der Größe des Frames liegen.

    Mal eine frage Zwischendurch: Warum packst du nicht alle Frames zusammen, entfernst die Ethernet-Header und schreibst das in eine Textdatei? Dann kannst du auch Strg+F benutzen.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Siehe mein Edit oben. Die Header haben ne feste Länge, die du einfach pauschal wegschneiden kannst. Dann noch die Checksum am Ende jedes Frames rausschneiden und schon solltest du einen zusammenhängenden Datenstrom von IP-Paketen haben.

    Null-Bytes rausnehmen? Die könnten genauso gut in der Payload sein, was dich aber nicht interessiert, da du ja nur Strings suchst. Wäre also eine - wenn total unsaubere - Lösung.. aber nur für dich. ;)
    Von meinem iPhone gesendet

    nikeee13 schrieb:

    Wäre also eine - wenn total unsaubere - Lösung

    Ja, wird ja nicht verkauft, soll einfach nur mal funktionieren.
    Ist halt immer so wenn man neu in der Materie ist, ist man froh, wenn es irgendwie läuft. Egal, ob das dann unsauber ist.
    Wie kann ich herausfinden, ob ein Byte ein Nullbyte ist?
    Ich habe so probiert. Klappte aber nicht:

    VB.NET-Quellcode

    1. If Barr(i) <> &H0 Then
    2. 'In neues Array, das dann zu String konvertiert wird
    3. End If


    EDIT: Oh. Fehler in meiner Schleife. Ich kann nun die ersten Erfolge verzeichnen. Habe einen Link in einem Paket gefunden :) Hatte zwar die Nullbytes gelöscht, aber im Array entstanden dadurch Lücken, die automatisch wieder zu Nullbytes wurden 8o Konnte jetzt den Username aus dem "FTP-Frame" herausfiltern ... :thumbsup:

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „mrwebber“ ()

    Ethernet ist irgendwie sehr verwirrend, was den Header angeht. Ich habe jetzt einfach mal in das Wireshark-Wiki geschaut und mir den Paketaufbau von dort geholt. Dann kann man mit der LINQ da schnell was hinklatschen:

    VB.NET-Quellcode

    1. 'Option Infer On
    2. 'frame ist der Frame als Bytearray
    3. Dim destination = frame.Skip(8).Take(6).ToArray() ' preamble usw überspringen und destination holen
    4. Dim source = frame.Skip(8 + 6).Take(6).ToArray() ' preamble und destination überspringen und source holen
    5. Dim payloadLengthOrType = frame.Skip(8 + 6 + 6).Take(2).ToArray() ' preamble, destination und source überspringen und länge der payload holen
    6. Dim payload = frame.Skip(8 + 6 + 6 + 2).Take(payloadLengthOrType).ToArray() ' preamble, destination, source und länge überspringen und payload holen
    7. Dim checksum = frame.Skip(8 + 6 + 6 + 2 + payloadLengthOrType).Take(4).ToArray() ' alles andere überspringen und checksum holen

    Bei Wikipedia steht, dass das LSB vorne ist (also Big-Endian):

    Wikipedia schrieb:

    Since octets are transmitted least-significant bit first[...]
    Dann brauchst du wahrscheinlich noch etwas, was die Reihenfolge umkehrt. Vielleicht kann dir da der BitConverter helfen.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nikeee13“ ()

    Danke dasa du dich da nochmal so schön mit beschäftigt hast! :) Sieht alles logisch aus was du da machst. Habe "leider" kein PC für ein paar Wochen, um das Projekt gerade fortzuführen ;) Trotzdem danke!

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup: