Alt-F4 #32 – Operation Wireshark  23.04.2021

Geschrieben von The-Kool, Hornwitser, editiert von stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
übersetzt von EDLEXUS, lektoriert von BluePsyduck, Nanogamer7

Inhaltsverzeichnis

Herzlich willkommen zur Ausgabe Nummer #2⁵, diesmal aber mit Haien! In diesen gefährlichen Gewässern zeigt uns The-Kool wie man Lautsprecher praktisch einsetzen kann, möglicherweise sogar als Haiwarnsystem. Danach gehen wir mit Hornwitser auf echte Haijagd mit Wireshark, und erfahren so, wie er Netzwerkprobleme im Spiel gefunden hat. Also schnapp dir eine Harpune und sei auf unserer wilden Jagd mit dabei!

Komplexitäts-Ecke: Lautsprecher The Kool

Willkommen zurück in der Komplexitäts-Ecke, in der wir uns mit komplexen Mechaniken des Spiels befassen, um denen, die sich damit nicht auskennen, einen Einstieg zu ermöglichen. In diesem Artikel stellen wir drei Fragen: „Was ist das?“, „Welche Ergebnisse kann ich damit erzielen?“ und „Wo sollte ich soetwas verwenden?“

Was ist das?

Der Programmierbare Lautsprecher ist ein „Gebäude“, welches nur einen Kachel benötigt. Wenn er mit einem Schaltungsnetzwerk verbunden ist, kann er als Reaktion zu den Signalen im Netzwerk Töne erzeugen, die dann im Spiel zu hören sind. Einstellbar ist dabei die Lautstärke, der spezifische Ton, eine extra Alarmbenachrichtigung auf der Karte und ob man den Ton unabhängig von der Entfernung zwischen Lautsprecher und Spieler hören kann. Der Lautsprecher wird mit der Schaltungsnetzforschung freigeschalten, welche so früh im Technologiebaum vorkommt, dass es deine erste grüne Forschung sein könnte.

Programmierbarer Lautsprecher
Dort steht er, in all seiner majestätischen Schönheit. Quelle: Factorio Wiki.

Welche Ergebnisse kann ich damit erzielen?

Er macht Geräusche! Nagut, das war jetzt irgendwie klar. Obwohl Lautsprecher hauptsächlich für die musikalischen Meisterwerke, die man damit errichten kann, bekannt sind, haben sie auch einen praktischen Nutzen. Wenn man einen Lautsprecher mit seiner Fabrik verbindet und einen globalen Alarm einstellt, kann man Alarme für praktisch alles selbst erstellen. Du kannst (und solltest!) ihm ein eigenes Icon und einen Titel zuordnen, weil du mit Sicherheit vergessen wirst, was die Bedeutung dieser lärmenden Hupe war. Das stellt einen einfachen Weg dar, um Alarme in deiner ganzen Fabrik zu verteilen, um Probleme zu beheben, bevor sie zu Katastrophen werden.

Wo sollte ich soetwas verwenden?

Hast du jemals deine Energieversorgung so überstrapaziert, dass alle deine Kohleförderer langsamer produzierten, und du so in einen Brownout-Kreislauf geraten bist, während deine Heizkessel keine Kohle bekommen? Versuche einen Lautsprecher nebem dem Kohlefließband aufzustellen und verbinde ihn mit einem Kabel. Auf einem vollen Band liegen 8 Gegenstände, wenn du also den Lautsprecher so einstellst, das ein Alarm ausgelöst wird, wenn weniger als 8 Kohle vorhanden sind bekommst du bei jeder Lücke in deiner Kohleversorgung ein Alarmsignal. Stelle diesen Alarm als globalen Alarm ein und gebe ihm einen Namen wie „Überprüfe deine Kohleförderung!“ und du bekommst eine Warnung, egal wo du gerade bist und was du gerade machst.

Kohle-Alarmsystem
Wenn dieser Alarm auslöst, lass alles andere stehen und liegen und repariere deine Kohleversorgung. Blaupause

Eine völlig andere Alarmart ist ein Zugalarm. Verbinde einen Lautsprecher mit einem Signal an einer Stelle, an der du häufig die Schienen überquerst, und jeweils einem weiteren Signal in jede Richtung (denk daran, beide Fahrtrichtungen zu beachten). Sage ihm, er soll einen lokalen Alarm auslösen, wenn eines der Signale gelb ist (Anzahl der gelben Signale > 0). Das nächste Mal, wenn du auf die Schienen zurennst und ein Zug kommt, wirst du eine schöne laute Warnung bekommen, dass du noch einen kleinen Moment warten solltest, bevor du die Schienen überquerst!

Bahnübergangsalarmsystem
Wenn ich das nur vor ein paar hundert Stunden herausgefunden hätte... Blaupause

Wie mit vielen anderen Dingen in Factorio sind die Möglichkeiten unbegrenzt, sowohl in der Kreativität als auch in der Anzahl der praktischen Anwendungen. Aufbauten reichen von solch simplen Konstrukten wie oben beschrieben, bis hin zu unglaublich komplexen MIDI-Systemen und noch viel weiter. Ich hoffe, dieser Artikel konnte dich etwas dazu inspirieren, einige eigene Anwendungen zu entwerfen und dir so einiges an Kopfschmerzen zu ersparen. Bis zum nächsten Mal, wenn wir uns wieder in der Fabrik treffen, pass auf dich auf und lass dich nicht überfahren!

Wireshark-Dissector für Factorio Hornwitser

Dieses Projekt begann etwa zur selben Zeit wie das Gridlock Cluster-Event. Ich erforschte, warum einige Clients zufällig vom Spiel fallen gelassen wurden und untersuchte deswegen Packet Traces mit Wireshark. Diese Packet Traces sind im Prinzip binäre Logs von allen Paketen, die von der Netzwerkkarte des Rechners gesendet oder empfangen werden. Um diese Binärdaten zu verstehen zerlegt Wireshark diese mit sogenannten Protokoll Dissectoren, eine Technik, die für fast alle Arten von Netzwerkprotokollen eingebaut ist. Aber leider gibt es keinen für Factorio, weswegen ich nur hexadezimalen Kauderwelsch sehen konnte, als ich Wireshark für Factorio-Traffic zwischen Client und Server verwendet habe.

Nachdem ich mir die Bytes angeschaut hab, die zwischen Client und Server ausgetauscht werden, dachte ich mir: Wie schwer würde es sein, einen Dissector für Factorio-Daten für Wireshark zu schreiben. Der einfachste Weg, dafür Code zu schreiben, ist in Lua, welcher dann einfach als Plugin in Wireshark geladen werden kann, ähnlich zu Factorio-Mods. Und so begann ich, mich mit den Bytes zu beschäftigen und Stück für Stück die Struktur dieses Protokolls zu erforschen. Es wurde zu einer persönlichen Herausforderung von mir, die Bedeutung der einzelnen Bytes herauszufinden und in Wireshark zu dekodieren. Ich habe wahrscheinlich ungefähr zwei Wochen lang am Dissector gearbeitet, bevor ich irgendwie aufgab.

Es war nicht so, dass ich es nicht hätte schaffen können, es war nur den Aufwand nicht wert. Der Output meines Dissectors war nicht sehr hilfreich, um herauszufinden, was wirklich vor sich geht. Es sah in etwa so aus:

Bildschirmfoto des alten Wireshark-Dissectors.

Klar, es dekodierte den Rahmen und fügte fragmentierte Pakete zusammen, aber außer du weißt genau was diese bunten unverständlichen Buchstabenkombinationen bedeuten, war die ganze Sache eher wenig hilfreich. Das ist auch der Grund, warum ich diesen Dissector nicht veröffentlicht habe: Es ist zwar besser als nur auf Hex-Daten zu schauen, aber nicht viel. Er schafft nicht die tiefen Einblicke in die Funktionsweise des Factorio-Protokolls, so wie man es von Dissectoren für andere Protokolle kennt. Und so endete das Projekt in einer Schublade, aus der es nie wieder hervor kam.

In der Vergangenheit schrieb der Factorio-Entwickler Twinsen in FFF #196 darüber, einen Dissector für Wireshark zu schreiben. Der Post enthält eine Menge nützlicher Informationen, die ich hätte nutzen können, aber ich wollte es schaffen, ohne auf internes Material des Factorio-Quellcodes zurückzugreifen. Eine offensichtliche Frage, die sich da nun stellt: Warum verwende ich nicht einfach Twinsen´s Dissector, anstelle meinen eigenen zu schreiben? Nun, zuerst ist er nicht öffentlich zugänglich, aber viel wichtiger ist, dass er nie öffentlich zugänglich gemacht werden darf. Die Art und Weise, wie Twinsen´s Dissector funktioniert, ist, dass er Factorio als Shared Library erstellt hat, und dann eine eigene Version von Wireshark erstellte, die auf diese Shared Library verweist. Nun ist aber Wireshark unter der GPL-Lizenz veröffentlicht, was bedeutet, dass der GPL-Code nicht öffentlich zugänglich gemacht werden darf, wenn dieser auf proprietäre Inhalte verweist. Um den Dissector öffentlich zugänglich zu machen, müsste also Factorio öffentlich zugänglich gemacht werden, und das wird einfach nicht passieren.

Vor einigen Wochen viel mir aber etwas auf. Die Windowsversion von Factorio kommt mit einer .pdb-Datei, welche Debugsymbole enthält. Die Entwickler verwenden diese um symbolisierte Stapelpfade zu hinterlassen, wenn das Spiel abstürzt, um ihnen so zu zeigen, an welcher Stelle im Code es zum Fehlerfall kam. Glücklicherweise für mich enthält diese Datei auch jede Menge andere Daten, zum Beispiel Daten die benötigt werden, um einen Debugger an Factorio anzuschließen und die gespeicherten Daten im RAM auszulesen. Das bedeutet es enthält Typinformationen, welche vorgeben, wie Daten im Code strukturiert sind und auch alle Namen für Felder und Enums. Die Feldnamen sind sehr nützlich, da sie die Namen darstellen, die die Entwicklern dem Datenstück gegeben haben, um Referenzen dazu im Code unterzubringen. Ähnlich dazu stellen die Enums Verbindungen zwischen logischen Namen und numerischen Werten dar.

Ich habe es geschafft, diese Daten aus den .pdb-Dateien mit Hilfe des cvdump.exe-Werkzeugs in etwas Lesbares zu extrahieren. Sobald ich das hatte, war es einfach, die Namen der Strukturen aus der .pdb-Datei zu finden und alle Felder in meinem Dissector umzubenennen, um diese Felder zu verwenden. Ich habe es auch geschafft, die Enums zum Übersetzen von numerischen Werten in logische Namen zu verwenden, in Feldern wo dies verwendet wird. Nachdem ich meinen Code etwas aufgeräumt und den Datenausgang etwas verschönert habe, sah das Ergebnis wie folgt aus:

Bildschirmfoto des neuen Wireshark-Dissectors.

Man muss sich nicht länger fragen, was ein „komisch blauer“ Wert ist, es ist ganz klar die id eines InputActionSegment. Jetzt sind die Typen von einem Maschienencode 0xa2 in ein deutlich besser lesbares ServerCommand übersetzt. Das einzige Problem damit, einen Dissector aus Daten zu errichten, die mit dem Spiel mitgeliefert wurden, ist, dass es jetzt ganz klar nicht mehr vollständig meine eigene Arbeit ist, was die Legalität der Distribution in Frage stellt. Anstatt selbst herauszufinden, ob die Urheberrechtsgesetze jetzt auf meiner Seite waren oder nicht, habe ich einfach bei den Entwicklern nachgefragt, die kein Problem damit haben, dass ich den Dissector öffentlich zugänglich mache. Wenn ihr das also selber ausprobieren und diese Technik eurem Werkzeugkasten hinzufügen wollt, findet ihr ihn in meinem GitHub-Repo.

Persöhnlich habe ich es verwendet, um Netzwerkprobleme mit Factorio zu beheben, von Clients, die sich nicht verbinden können zu NAT-Punching-Problemen. Ich habe auch einige Bugreports geschrieben, welche zu Bugfixes im Spiel führten. Mit der Technik, Namen aus den Factorio-Debugsymbolen zu verwenden, wurden die Daten leserlicher und verständlicher, zumindest verglichen mit dem, was vorher zu sehen war. Es ist immernoch hauptsächlich ein Werkzeug für Leute mit Erfahrung in Computernetzwerktechnik und Factorio-Code-Grundlagen, also erwarte nicht, alles zu verstehen, falls du dich mit diesen Themen nicht auskennst.

Beitragen

Wie immer suchen wir nach Leuten, die zu Alt-F4 beitragen wollen, sei es mit einem Artikel oder durch Hilfe bei Übersetzungen. Wenn du etwas Interessantes im Kopf hast, das du mit der Community in einer eleganten Art teilen möchtest, hier kannst du das tun. Falls du dir unsicher bist, beantworten wir gerne Fragen zu Inhalt und Struktur. Falls das nach etwas klingt, woran du interessiert bist, tritt unserem Discord bei, um es nicht zu verpassen!