Archive for März, 2010

Warum ich nicht antworte

Dienstag, März 30th, 2010

Es soll Situationen geben, in denen man mich nicht erreicht. In jüngster Zeit höre ich immer öfter von Betroffenen, dass sie mich im MSN und ICQ angeschrieben hätten, ohne eine Antwort zu bekommen. Sogar über Skype angerufen haben sie – und trotzdem kam keine Antwort! Seltsam…
Gehen wir das Problem einmal ganz simpel an: Um auf Textnachrichten erfolgreich zu antworten, müssen folgende Bedingungen erfüllt sein:

  • Die eingehende Nachricht muss bei meinem Messenger ankommen
  • Ich muss dies realisieren
  • Ich muss mich dazu entscheiden, darauf zu reagieren
  • Die Antwort muss ihren Weg zurück finden

Den ersten und letzten Punkt können wir in Zeiten des TCP Protokolls vernachlässigen. Wenn mein Rechner ACK sagt, dann ist ACK. FIN.

1. Realisierung der eingehenden Nachricht
Problemquelle: Ich bin nicht immer am Rechner!
Mein Rechner ist in der Regel durchgehend online. Dies hat den simplen Grund, dass er seit einiger Zeit den alten Linux Fileserver abgelöst hat und somit als Storage für dem gesamten Haushalt dient – welcher nicht nur aus mir besteht. Manchmal mache ich MSN und ICQ aus, aber normalerweise bleiben beide Programme einfach geöffnet und empfangsbereit. Heißt: Wenn ich im MSN online bin, heißt das noch lange nicht, dass ich auch wirklich online und anwesend bin. Wenn ich wieder da bin, werde ich wichtige Nachrichten schon beantworten:

2. Reaktion auf eigehende Nachricht
Problemquelle: Ich bin nicht gewillt, auf jede Nachricht sofort zu antworten.
Wer mich im MSN oder ICQ finden will, der wird dies recht schnell schaffen. Wer einen Grund hat mit mir zu reden, darf und soll das bitte auch tun.
Die meisten Leute kontaktieren mich aufgrund von eAthena oder RO-Client bezüglichen Fragen. Sofern es mir möglich ist helfe ich gerne bei Problemen, die man nicht binnen 5 Minuten im eAthena Forum lösen kann. Aber wenn jemand bei den einfachsten Dingen scheitert habe ich auf Dauer auch keine Lust, immer wieder beim Urschleim anzufangen. Wer das nicht akzeptiert, wird auch keine Antwort bekommen.

Doch die wohl beliebteste Methode, keine Antwort zu erhalten: Alle 10 Minuten nachfragen.
Niemand leistet hauptberuflich MSN Support für ein GPL Projekt. Und dementsprechend kann auch niemand gezwungen werden, irgendjemandem zu antworten. Es ist nicht die feine englische Art, aber wenn jemand nicht akzeptieren will, dass man gerade keine Zeit oder Lust hat, sich mit etwas zu beschäftigen, dann muss er damit leben, ignoriert zu werden.
Mittlerweile ist diese Community an einem Zustand angelangt, an dem man öffentlich nichts mehr in Aussicht stellen darf. Denn es endet zwangsläufig darin, dass man die Hälfte seiner Zeit damit beschäftigt ist, irgendwelchen Leuten klar zu machen, dass man sich nicht 24 Stunden am Tag mit ihren Problemen befassen kann und möchte.
Je penetranter man versucht eine Antwort zu bekommen, desto höher ist die Wahrscheinlichkeit im Endeffekt auf der Blockliste zu landen oder einen Blogpost wie diesen zu provozieren und danach auf der Blockliste zu landen. Im Endeffekt hat niemand gewonnen und jeder ein wenig zu viele Nerven verloren.

Was diesen Blogpost inspiriert hat? Folgende Unterhaltung “mit” einem Mitglied der deutschen eAthena Szene. Wenn ich nach Hause komme und einen derartigen Spamblock sehe, werde ich ganz bestimmt nicht mehr antworten:

[18:21] huhu
[19:05] biste nun da?
[19:05] oder noch nicht
[19:47] und wer da?
[20:18] da?
[20:48] da?
[21:26] biste nun da?
[21:52] da?
[22:25] da?
[22:57] da?’
[23:01] keiner schade =(
[23:08] wo isser denn eingepennt
[23:18] meld dich bitte egal wie spät wir haben echt nen problem und muss das dringend lösne
[23:53] ich hoffe du kommst heute nich >.<
[23:53] noch
[00:17] da?
[00:42] nun da?
[01:00] jetzt da?
[01:19] da?
[11:24] huhu
[12:30] nun jemand da?
[22:25] huhu
[22:26] da?
[01:43] huhu
[10:49] huhu
[10:53] jemand da?
[12:12] huhu
[12:16] hallii
[20:10] huhu
[22:44] huhu
[23:12] da?
[00:29] da?

Party plzzzz!

Freitag, März 26th, 2010

… oder: “Verschwinde aus meinem Kopf, Gravity!”

Ich bin fast aus allen Wolken gefallen, als Yommy (yomanda) mir folgenden Link über Gravitys neues Party Booking & Recruiting System präsentierte: Click meh.

Meine Antwort war folgende:

DAMNIT

I WANTED TO DO THAT

FUCK YOU GRAVITY

Bedarf wahrscheinlich keiner Übersetzung. Der Grund für meinen leicht ausfallenden Ton war, dass ich seit mehreren Wochen und Monaten die Idee gehegt hatte, irgendwann ein solches System mit Harmony zu realisieren. Das Timing von Gravity ist natürlich perfekt, denn Harmony ist gerade jetzt in einem Stadium, in dem ich durchaus hätte anfangen können, die ersten Windows zu entwerfen und das Backend zu programmieren. Aber nein, Gravity war mal wieder schneller! Aber mir macht das natürlich nichts aus, ich bin ja ein friedliches, und zartbesaitetes Wesen …..

Ich habe mich dann die letzten Tage daran gemacht, das System mal auseinander zu nehmen – was erstmal gar nicht so einfach war, da sich bisher noch niemand bequemt hat, das Interface zu übersetzen. Also mal schnell die aktuelle msgstringtable generiert, Google Translate drüber gejagt und nachgebessert. Nach getaner Arbeite öffne ich also meinen Client und freue mich auf ein nicht-koreanisches Booking Interface und – werde bitter enttäuscht. Es wurden vielleicht 2 oder 3 “Stringlein” genutzt, der Rest war wie vorher. Super.

Ein kurzer Blick in den ASM Code lässt böses erahnen: Es reicht Gravity anscheinend nicht, mir meine Idee zu klauen – nein! Irgendein Gravity Praktikant hat es anscheinend als unheimlich witzig empfunden, 90% der benutzten Strings hardcoded im Client zu verankern. Sicher, natürlich. Nachdem ich dann alle Strings per Hand im Hexeditor gesucht und übersetzt hatte, konnte ich dann tatsächlich mit einem englischen Booking Interface arbeiten. Bis auf ein paar Schönheitsfehler machte das Interface erstmal einen gar nicht mal so schlechten Eindruck:

Als ich dann anfing, die Packets zusammenzusuchen und zu analysieren, ist mir das wahrscheinlich beste Feature des ganzen Systems in die Hände gefallen: Die LSD Videos! Diese “Videos”, eher Foto Slideshows, bekommt man zu sehen, sobald man ein Party Recruit aufmacht, und auf antworten wartet. Sechs verschiedene Slideshows zum Thema Party, die wirklich nur in Verbindung mit Lysergsäurediethylamid entstanden sein können – herrlich!

Mein anfängliches Packet-Abenteuer ist dann im Laufe des Tages ausgeartet und schließlich haben White und ich alle möglichen neuen RE Packets im Client auseinander genommen und dokumentiert, die eAthena noch nicht unterstützt und haben sie dann im eA Forum gepostet. Sind ein paar wirklich interessante – und auch kuriose – Packets dabei gewesen, aber hat definitiv viel Spaß gemacht :)

Ach, und ja, ich blogge hier jetzt neuerdings mit :P

See ya,

Lighty

Unde venis?

Montag, März 22nd, 2010

Modulare Programme haben in der Regel zentrale Loggingfunktionen. Nun lässt sich zwar alles wunderschon loggen, doch die wichtigste Information fehlt in der Regel – welches Plugin hat diesen Logeintrag erzeugt?

Ich bin auf die Problematik gestoßen, als mich Timo gefragt hat, wie man herausfinden könnte, von welcher DLL ein Call kommt. Da ich zu dem Zeitpunkt selber gerade dabei war, die Modulfunktionen von Harmony zu entwerfen, habe ich mir darüber ein wenig Gedanken gemacht.

Man kann man natürlich den Log Aufruf mit einem weiteren Parameter ausstatten, um den Pluginnamen anzugeben. Simpel und funktioniert natürlich auch. Aber es geht noch eleganter!

Einige Theorie vorweg:
Um herauszufinden von welcher Dll ein Call kommt benötigt man die Speicheradresse, von der der Aufruf kommt. Wenn man dann noch eine Liste aller geladenen Module hat, lässt sich der Name relativ leicht herausfinden. Die Frage ist daher: Wie kommt man an die Adresse des “Aufrufers”?
Windows (im 32-Bit Modus) und somit auch Ragnarok basieren auf der x86 Prozessorarchitektur. Auch wenn man ein 64-Bit Windows verwendet, denn dann wird über WOW64 eine 32 Umgebung “emuliert”.
Ein Funktionsaufruf wird über den call Befehl ausgeführt, ein Rücksprung über ret. Ein call schreibt die Speicheradresse des Befehls nach dem Aufruf auf den Stack und springt zur Funktionsadresse. Ein ret holt sich den obersten Wert vom Stack und springt dorthin zurück. Soweit ganz simpel.
Lokale Variablen innerhalb der Funktion werden ebenfalls über den Stack realisiert. Man kann folglich nicht davon ausgehen, dass das oberste Element die Rücksprungadresse ist und braucht eine Möglichkeit, diese von jeder Position aus zu finden. An dieser Stelle kommt das ebp Register ins Spiel: Das ebp verweist auf die Stackposition, an der sich die Funktion am Anfang befunden hat. Über den Wert von ebp sollte man daher doch relativ leicht an die Rücksprungadresse kommen…?
Mir war der Aufbau eines C(++) Calls bereits bekannt, aber solche Informationen lassen sich auch über Wikipedia oder normale Google Recherche herausfinden.

Testcode:

Die Ausgabe sieht schonmal vielversprechend aus. Die Rücksprungadressen liegen im Bereich der main() Funktion. Dass sich die Adressen immer ändern hängt mit der Address Space Layout Randomization (ASLR) zusammen, wodurch die Basisadresse des Programms sich bei jedem Start verändert. Nichtsdestotrotz haben wir nun eine gültige Rücksprungadresse!

Nun müssen wir dieser Basisadresse den Namen eines Plugins zuordnen. In der Regel sind Plugins eigenständige Dll Dateien. Über die Compilerdokumentation findet man relativ schnell heraus, dass Dlls im Speicher auf 64Kb Adressen alignt sind – die Basisadresse also ein Vielfaches von 64Kb ist.
Eine 32 Bit Applikation kann maximal 4Gb Speicher adressieren. Normalerweise stehen dem Programm nur 2Gb zur Verfügung, da 2Gb für den Kernel reserviert sind. Allerdings gibt es die /3GB Option und unter 64-Bit Windows sieht das Ganze wieder anders aus. Wir müssen also davon ausgehen, dass wir 4Gb / 64Kb = 65536 mögliche Dll Basisadressen haben. Wenn wir im Programm ein Array verwenden, wo für jede mögliche Basisadresse ein Pointer auf den Namen hinterlegt ist, benötigt dieses array 64Kb * 32 Bit = 256 Kb. Durchaus vertretbar.

Problematisch könnte es nun werden, wenn eine Dll größer als 64Kb ist, also effektiv mehrere Basisadressen einnehmen würde. Um diesen Fall abzuhandeln muss beim Laden der Dll aus dem PE Header die SizeOfImage ausgelesen werden:

The size (in bytes) of the image, including all headers, as the image is loaded in memory.

Mit dieser Information kann man einfach ausrechnen wie viele Basisadressen belegt werden.

Wir sind also in der Lage die Rücksprungadresse einer Funktion zu ermitteln und haben ein Array in dem die Namen der Dlls hinterlegt sind. Daraus könnte dann beispielsweise das folgende Testprogramm resultieren: Klick mich.

Ziel erreicht!
Ein paar Tage nach der Entstehung dieser Zeilen bin ich über die MSDN Library auf eine sehr interessante Funktion des Microsoft Compilers gestoßen: _ReturnAddress(). Damit hätte ich mir den ganzen Aufwand sparen können – aber so ist immerhin dieser Artikel herausgekommen, der hoffentlich ein paar Anregegungen geben konnte. :)

Übrigens:
_ReturnAddress:

Meine Version:

Microsoft hat wohl den selben Ansatz verfolgt ;)

Dies und das…

Donnerstag, März 18th, 2010

Da sich in den letzten Wochen wieder einmal ein wenig was angesammelt hat, fasse ich das einfach mal in einem Artikel zusammen.

Harmony ist “fertig”! Zumindest Version 3.0. Nachdem diese mittlerweile stabil ist und auch bereits produktiv eingesetzt wird, läuft derzeit bereits die Entwicklung von Version 3.1. Bisher beschränkt sich Harmony auf allgemeine Funktionen der vorherigen Versionen, sprich WPE/RPE Erkennung, Paketverschlüsselung und einige andere Techniken sowie eine rudimentäre XRay Implementation (Headgears, Monster und Hairstyles). Ich wollte erst einmal sicher gehen, dass die derzeitige Version stabil läuft und habe daher die Features soweit es geht eingeschränkt. Mit 3.1 werden dann diverse neue Kundenfeatures hinzukommen, wie beispielsweise die einstellbare GRF Verschlüsselung.
Im Gegensatz zu bisherigen Systemen wird Harmony voraussichtlich nicht mehr an eine Exe gebunden sein. Die Core ist mittlerweile so strukturiert, dass die meisten Module keine eigenen Offsets mehr benötigen und somit unabhängig von der Exe sind. Die Harmony Core wird nun voraussichtlich jede Woche auf auf die aktuelle RagRE Exe portiert, sodass prinzipiell jede Exe unterstützt wird. Für die Portierung kommt ein PHP Skript zum Einsatz, was die Offsets über Pattern Matching ausliest. Das Skript gibt es hier zum Download. Aus wohl verständlichen Gründen sind die Harmony Offsets nicht enthalten, dafür aber 2 Beispielskripte.


Einer der Hauptgründe, warum ich Harmony so früh auf die neueste Exe portiert habe, ist folgender Changelog Eintrag:

- You can now mouse over the status icons displayed on the right side of the screen to get information about what the status does.

Wenn sich das bewahrheiten sollte, wäre das eine der besten Änderungen seit Jahren. Und tatsächlich!
Technisch sind für dieses Feature einige neue Lua Dateien hinzugekommen. Eine für die Zuordnung von Effektnamen zu ihren IDs (quasi ein Enum), eine für die Funktionen und eine für die Beschreibungen. Damit wird ein Trend fortgesetzt, dem Gravity nun schon seit einer ganzen Weile folgt: Neue Features nutzen Lua und alte “Kotzfaktoren” werden nach und nach in Lua ausgelagert. Gravitys neue Erkenntnis, dass Contenttabellen im Source irgendwie nicht mehr ganz zeitgemäß sind, kommt der pServer Community natürlich nur entgegen: Anstatt das mittlerweile verpönte XRay zu verwenden kann man nun einfach die Lua Dateien editieren.

Apropos innovative Gravity Features: Wer erinnert sich an den Chatmode?

Ist dieser aktiv, verschwindet das Chatfenster selbst bei doppeltem Enterdrücken nicht mehr – der perfekte Pronmodus eben :)

Gravity Changelog vom 09.03.2010:

Added Chat Mode to the shortcut menu. When enabled, the chat box will always remain open [...]

Das ist ja echt kreativ!


Seit einiger Zeit bin ich nun offiziell Mitglied des Diff Teams. Bedeutet: Ich bin mit dafür zuständig, dass für neue Exen so schnell wie möglich Diffs erstellt werden und mögliche Inkompatibilitäten beseitigt werden. Bisher hatte ich lediglich den “@-Fix” und einen Diff zum Deaktiven des Nagle Algorithmus‘ eingebaut. Bedingt durch meinen Entschluss, zukünftige Exen Harmony-tauglich zu machen, werde ich hier aber wahrscheinlich in Zukunft etwas mehr Zeit investieren. Die heutige Exe hat beispielsweise 5 Diffs zerschossen, die repariert werden durften… :)



Picture unrelated.
Es gibt diverse Server, die sich damit brüsten, ihre Bot Protection sei unüberwindbar, würde alles blocken und sei sowieso die beste Entwicklung seit der Erfindung des Toasters. Keine Bot Protection ist perfekt. Natürlich, aus Sicht des Marketings ist alles aus dem eigenen Hause perfekt, aber wenn selbst Techniker im Einzelgespräch diese Meinung vertreten, haben sie etwas wichtiges verpasst.
Um neue Ideen und Inspirationen für Harmony zu bekommen reverse ich ganz gerne die Bot Protections anderer Server. Das Spektrum reicht hier von “aufgeblasen, komplex und irgendwie nach dem Motto just bore the reverser long enough” bis “cool, 3 Zeilen und OpenKore funktioniert nicht mehr”. Bisher habe ich keine Protection gesehen, die sich nicht binnen 20 Minuten umgehen ließ. Das sagt allerdings relativ wenig über die allgemeine Qualität der Systeme aus – es liegt schlicht und einfach daran, dass es Mittel und Wege gibt, mit der (fast) jede Bot Protection ausgehebelt werden kann.
Nachdem V-Shield schnell für Enttäuschung gesorgt hatte, waren meine Erwartungen nicht sonderlich hoch, als mir vor einigen Tagen von einer “selbstgeschriebenen Bot Protection” auf einem deutschen Server berichtet wurde. Das System ansich war relativ schnell reverst, aber die Codequalität war vergleichsweise hoch und es wurden einige hochinteressante Ansätze genutzt, die mir bisher in der Praxis noch nie begegnet waren.
Da ich auf dem Server eh nicht spiele habe ich dann frei nach dem Holzhammer-Motto per Try&Error durchprobiert, was die Protection alles erkennt. Wie sich herausstellte hat sie den Server über die Ergebnisse informiert (zumindest über die Tatsache, dass es Ergebnisse gab) – ich wurde ins GM Haus recallt und bin dort mit dem Admin ins Gespräch gekommen.
Es stellte sich heraus, dass Godlesz ihm eine Anleitung gegeben hatte, wie man eine solche Bot Protection implementiert. Wenn man sich überlegt, dass er noch vor 2-3 Jahren von Timo Programmiernachhilfe bekommen hat, ist das eine durchaus beachtliche Leistung.

Ansonsten habe ich nun noch 7 Tage Schule — dann sind Osterferien und in der Woche darauf bekomme ich mein 12/2 Zeugnis. Ende April dann noch Abiprüfungen und ich bin mit der Schule fertig. Die Zeit vergeht schnell

Gulli Board

Dienstag, März 2nd, 2010

4chan bezeichnet sich ja selber als der Abfluss des Internets. Zu Recht. Das Gulli Board ist offenbar das deutsche Pendant dazu. Es wurde mir oft empfohlen, wirklich angeschaut habe ich es mir aber nie. Bis heute.

Bei einem ganz normalen Gespräch über uralte, eiskalte, pappige Pizza (Hallo, Anni!) mangelte es mir an einer Visualisierung. Nach kurzer Google Suche landete ich dann hier: Herrjemine, Pizza zu kross gebacken!

Wer fragt im Internet nach, ob seine Pizza zu dunkel ist?!
Offenbar gibt es Menschen. Ich würde wenigstens jemandem im Skype anrufen und um eine Webcambegutachtung bitten… ;)

Ob es da noch andere ähnlich kranke Threads gibt…? Tatsache.
Aktuellste Frage mit 55 (!) Antworten:
   Beste Atemtechnik bei der Katzenkloreinigung

Ich zitiere und unterstreiche einfach mal die erste Antwort:

Manche Leute sind einfach interessanter gestört als andere



Und jetzt entschuldigt mich. Ich habe 11 Millionen Postings zu durchwühlen… =)