Ein Blick hinter die Matrix am Beispiel von eMule Marc Ruef | 20.10.2008 Kein Film hat mich in den 90er Jahren wohl so beeinflusst, wie "The Matrix" (1999). Der dichte Plot und die grandiosen Effekte waren in vielerlei Hinsicht wegweisend. Auch wenn es noch nicht lange her ist, ist der besagte Film mit Keanu Reeves unweigerlich ein bestehendes Stück Popkultur. Im Gegensatz zu den zwei sehr lauen Nachfolgern vermochte der erste Teil mit einer provokanten und leichtfüssigen Philosophie als Kombination des östlichen Zen und der westlichen Wissenschaftsbegierde aufwarten. Das geflügelte Wort "die Matrix verstehen" wird nicht selten dann verwendet, wenn man etwas in seinem vollen Umfang erfasst hat. Je länger je mehr finden sich MacOS X-Nutzer in meinem Umfeld. Zu Recht, wie ich finde, denn Apples Betriebssystem auf der Basis eines klassischen BSD vermag in vielerlei Hinsicht ein solides und komfortables Werkzeug bereitzustellen. Doch gerade die Nutzungsergonomie führt dazu, dass die wenigsten Anwender wirklich wissen, was ihr Betriebssystem effektiv macht und was es eigentlich alles tun könnte. Wieviele OS X-Nutzer wissen zum Beispiel, welchen Effekt ein Punkt als erstes Zeichen (http://www.usingmac.com/2008/6/29/mac-how-to-hide-everything) eines Dateinamens hat? Mein Interesse am Computer liegt in seinen Details, den komplexen Konstrukten und Zusammenhängen, verborgen. So habe ich es mir zum Hobby gemacht, ab und an in den Quelltext von mir gern genutzter Applikationen zu schauen. Den Apache-Webserver, den nmap-Portscanner oder die Implementierung von tcptraceroute habe ich schon mehrmals mit wissbegierigem Interesse durchforstet. Und dabei bin ich immerwieder auf interessante, unterhaltsame und lustige Eigenarten der jeweiligen Applikationen und ihrer Entwickler gestossen. Als bekennender eMule-Nutzer (siehe hier (http://www.nzz.ch/nachrichten/schweiz/aktuell/urheberrecht_fuer_das_internetzeitalter_1.561418.html)), trotz dass sich dies scheinbar aufgrund fehlender Aktualität nicht mehr geziemt, wollte ich sodann einen Blick in die Sourcen der aktuellen Version werfen. Das in C++ geschriebene Programm wartet mit einer Fülle an Funktionen auf. Grundsätzlich sollten hier drei Dinge mein Interesse an sich binden: Wie werden Informationen zu Benutzern zusammengetragen (z.B. Benutzername), wie werden Freigaben von Benutzern eingesehen und wie werden Chat-Kommunikationen (Versand von Nachrichten und Erkennen von Spam) durchgeführt. Schlussendlich hat mich das Verhalten des Chats als erstes in den Bann gezogen. Die in \eMule0.48a-Sources\srchybrid\ChatSelector.cpp bereitgestellten Funktionen sind für die effektive Chat-Verarbeitung zuständig. Für das Erkennen von Spam wird die Funktion CChatSelector::IsSpam(CString strMessage, CUpDownClient* client) eingesetzt, welche einen boolschen Wert zurückliefert. Die Spam-Prüfung ist sehr einfach realisiert. Als erstes wird untersucht, ob die erste empfange Nachricht eine URL enthält: code// first fixed criteria: If a client sends me an URL in his first message before I response to him // there is a 99,9% chance that it is some poor guy advising his leech mod, or selling you .. well you know :P if (client->GetMessagesSent() == 0){ int curPos=0; CString resToken = CString(URLINDICATOR).Tokenize(_T("|"), curPos); while (resToken != _T("")){ if (strMessage.Find(resToken) > (-1) ) return true; resToken= CString(URLINDICATOR).Tokenize(_T("|"),curPos); } }/code Dabei gilt alles als URL, was in der globalen Konstante URLINDICATOR als Pattern definiert wurde. Dabei wird logischerweise auf das Scheme "http" und den üblichen Hostnamen "www" gesetzt. Aber auch die für Spamming bekanntesten Top-Level-Domains wie ".tk" und ".to" sind hier vermerkt. Ein Fehler im Vergleich führt jedoch dazu, dass auch ein falsch geschriebener Satz wie "hallo.es ist kalt draussen!" aufgrund der Zeichenkette ".es" als Spam erkennt werden würde. Überhaupt arbeitet die Funktion mit sehr einfachen Mitteln und wie anhand des Kommentars "first step, spam dectection will be further improved in future versions" zu erkennen ist, ist man sich den Schwächen durchaus bewusst (Obwohl die Funktion an anderer Stelle mit den Worten "advanced spamfilter check" referenziert wird). Die zweite Prüfung erfolgt sodann dadurch, dass untersucht wird, ob ein Absender mehr als 4 Nachrichten geschickt hat, ohne dass man darauf geantwortet hat. Dies verhindert zwar initiales Spamming nicht, kann jedoch Dauerbelästigungen automatisiert entgegnen: code// second fixed criteria: he sent me 4 or more messages and I didn't answered him once if (client->GetMessagesReceived() > 3 && client->GetMessagesSent() == 0) return true;/code Der intelligente Spammer wird sich nun also darum bemühen diesen Erkennungsmerkmalen zu entgehen. In der ersten Spam-Nachricht sollten also keine Zeichenketten enthalten sein, die in URLINDICATOR als unerwünschte URL-Elemente vorgesehen sind. Zudem macht es keinen Sinn, wenn man mehr als drei Spam-Meldungen an einen Benutzer schicken will. Grundsätzlich reicht es also aus, wenn man sein Spam-Konstrukt in dieser Form angeht: command09:02:23> I would like to show you my new web site: 09:02:25> Visit http:// www.computec.ch for best warez! 09:02:28> Have a nice day ;) /command Hat man sich das Verständnis für eine Applikation erarbeitet, ist das Nutzen dieser um einiges angenehmer. Man weiss nun schliesslich, was sie alles kann und wie sie etwas macht. Dieses Gefühl hatte ich das erste Mal, als ich nach dem Lesen von RFC821 (SMTP) ein Email verschickt habe. Und dieses Gefühl geniesse ich hoffentlich noch viele Male.