Das Reversen einer Ragnarok EXE beginnt eigentlich immer gleich. Anhand irgendwelcher Referenzen sucht man Funktionen wie GetMsgString (msgstringtable.txt Zeilen auslesen) und verteilt in IDA die passenden Namen.
Erst kam die mühsame Handarbeit, welche mit wachsendem Umfang der Modifikationen immer langwieriger wurde…
Dann kann ein C Tool namens GetOffset, welcher mir eine Art C #define Syntax ausgab…
Und nun kommt das IDA Plugin! Im Zuge einer Rundumerneuerung meiner RO Tools hatte ich heute Mittag die Idee, eine einheitliche Möglichkeit zu schaffen, die wichtigsten Offsets ohne viel Aufwand in IDA zu importieren.
Erster Gedanke: Ich generiere mit GetOffset einfach eine PDB Datei und importiere diese. Mit der DbgHelp Library wäre das auch relativ problemlos möglich gewesen. Ein zufälliger Blick auf den Ordner der IDA 5.2 SDK hat mich dann jedoch dazu veranlasst, ein IDA Plugin zu schreiben.
Ich hatte mich bezüglich Plugins vorher nur mit PHP beschäftigt. Wer mit dem PHP Extension System vertraut ist, wird nachvollziehen können, mit welchen Erwartungen ich an die IDA SDK heran gegangen bin.
Es stellte sich jedoch schnell heraus, dass man die IDA SDK in keiner Weise mit dem aufgeblasenen, vollgestopften, unübersichtlichen Zend Extension System vergleichen kann. Ein funktionierendes Plugin benötigt ~10 vordefinierte Zeilen, alle Header und die beinhalteten Funktionen sind dokumentiert und mit ein wenig Einarbeitung kann man sehr schnell mächtige Plugins schreiben. Beispiel gefällig?
ea = get_name_ea(BADADDR, “ijlWrite”);
if( ea == BADADDR )
{
msg(“Failed to fetch DoScreenshot – aborting.\n”);
return;
}
xb.first_to(ea, XREF_ALL);
ea = xb.from;
ea = ea2func(ea);
set_name(ea, “DoScreenshot”, SN_NOCHECK);
So in der Art gestaltet sich die gesamte Arbeit mit der IDA SDK. Alles ist in simplen Funktionen zusammengefasst. Weiterhin ist in der Readme.txt eine Übersicht aller Headerdateien mit jeweils ein paar Worten zu den beinhalteten Funktionen – somit findet man meistens ohne viel Aufwand die richtige Headerdatei.
Wie dem auch sei – ich habe also ein kleines IDA Plugin geschrieben. Es analysiert die RO EXE, sucht relevante Funktionen und benennt sie dementsprechend. Als kleines, aber dennoch ziemlich nützliches Nebenfeature werden alle Aufrufe von GetMsgString() gesucht und der passende Text wird als Kommentar darübergeschrieben. Somit hat man bei einem Aufruf von GetMsgString sofort eine Ahnung, worum es im betreffenden ASM Block gerade geht
Im Laufe der nächsten Tage werden evtl. noch Enums und Klassen/Strukturen dazu kommen. Mal sehen wie viel Langeweile ich habe …



(Paint <3)



