
|
30. Januar 2001
|
IDA Pro for Newbiez by medardus (Version 2.0)
|
Basic Tutorials
|
|
1. Einleitung |
|
Normalerweise ist eines der ersten Tools, mit denen sich ein Newbie auseinandersetzt, W32DASM. Dieses Tool ist sowohl leicht zu erlernen als auch einfach zu bedienen. |
|
2. Was ist IDA Pro? |
|
IDA Pro (im Weiteren nur noch "IDA" genannt) ist ein Disassembler und wurde von der Firma DataRescue entwickelt. |
|
3. Woher bekommt man IDA Pro? |
|
Eine Demo der aktuellsten IDA-Version (ca. 10,9 MB) erhält man direkt bei DataRescue. Diese hat den Vorteil, daß sie alle
aktuellen Features, wie z. B. Automatic Parameter Identification beherrscht. Dafür kann man aber nicht speichern (was bei den teilweise sehr langen Disassemblierungszeiten
ein echtes Manko ist) und irgendwann kommt ein Timeout.
http://www.8bn.com/hambo/tools.html |
|
4. Installation |
|
Wenn man sich die Vollversion besorgt hat, muß man nichts installieren. Einfach die ZIP-Dateien entpacken und "Idag.EXE" aufrufen. |
|
5. Grundlegende Bedienung anhand eines Beispiels |
|
Um die ganze Sache anschaulicher zu machen, habe ich ein Crackme von einem Cracker namens "CoSH" beigelegt, welches schön klein ist, so daß man recht gut
die Arbeitsweise mit IDA nachvollziehen kann. ![]() Wenn wir nun unseren Namen (ich nehme "medardus") und eine beliebige Serial (ich: "123456789") eingeben und auf den "CHECK"-Button klicken, erscheint folgende Meldung: ![]() Wir haben jetzt einen Ansatzpunkt, nämlich einen String, den wir im Sourcecode suchen können. Also starten wir IDA (ich beziehe mich auf die Vollversion 4.04, wobei natürlich alles bis aufs Speichern auch mit der Demo-Version funktioniert), indem wir "IDAG.EXE" aufrufen: ![]() Um ein Programm zu disassemblieren, ziehen wir es einfach in das IDA-Fenster oder öffnen es manuell über das File-Menü. In beiden Fällen erscheint folgendes Fenster: ![]()
Hier können wir einstellen, um was für eine Art von Datei es sich handelt, welcher Prozessor zugrunde gelegt werden soll usw. Wir können aber alle Einstellungen
übernehmen (natürlich stimmt das System DLL directory nicht, falls man unter Win9x arbeitet - aber das versteht sich ja von selbst) und klicken auf "OK".
IDA beginnt nun mit der Analyse und dem Disassemblieren der EXE, was - je nach Größe und Komplexität des Programms - eine Weile dauern kann (ich habe schon von Leuten gehört, die IDA über Nacht disassemblieren lassen, was mich sehr an frühere Raytracing-Sessions erinnert :-). ![]()
IDA ist hochgradig kontextabhängig, d. h. es sind immer nur die Features möglich, die für diesen Kontext Sinn machen. Aber alles der Reihe nach! In W32DASM
würden wir nun in den String References nach unserem String suchen, doch wo sind in IDA die String References? Die Antwort ist, es gibt keine expliziten String References!
Der Newbie wird nun die Krise kriegen und sagen, daß IDA einfach schlecht ist usw. Keine Angst, es gibt sowas Ähnliches wie die String References, nämlich die
"Names". ![]() In diesem Fenster sind alle Referenzen - nicht nur auf Strings sondern auch auf Code usw. - enthalten. Strings wird defaultmäßig ein kleines "a" vorangestellt. Um unseren String "One of the Details you entered was wrong" zu suchen, wechseln wir in das Names-Fenster und tippen "aO" ein (da IDA hier nicht case-sensitive ist, würde auch "ao" funktionieren). Wir sollten nun folgendes sehen: ![]() Aha! Wir sehen den Text "aOneOfTheDetail". Das ist unsere String Referenz! Und was für ein Zufall: direkt darüber finden sich gleich noch zwei interessante Strings: "aYouDidIt" und "aWellDone". Wir wollen nun sehen, wo diese String Referenz benutzt wird, also machen wir einen Doppelklick auf unseren "aOneOfTheDetail"-String. ![]() Doch das ist nicht das, was wir erwartet haben. Wir befinden uns nun korrekterweise dort, wo der String definiert und deklariert wird. IDA macht es uns aber leicht, indem es uns - ganz in W32DASM-Manier - die Stelle(n) anzeigt, wo die Variable "aOneOfTheDetail" (deren Inhalt der String "One of the Details you entered was wrong" ist) verwendet wird (eine sogenannte Crossreferenz, abgekürzt "XREF"): ![]() Wie wir sehen können, wird die Variable nur an einer einzigen Stelle verwendet: in der Section ".text" an Adresse 0040153D, welche sich oberhalb der aktuellen Position befindet, was der Pfeil nach oben andeutet. Das kleine "o" gibt die Verwendung an. Hierbei steht "o" für "offset", "j" für "jump" und "p" für "procedure". Wir möchten nun sehen, wo die Variable verwendet wird, deshalb machen wir einen Doppelklick auf die XREF ".text:0040153D": ![]()
IDA ist ähnlich wie ein Browser aufgebaut. Wenn man also zurück zur letzten Position springen möchte, klickt man einfach auf den
![]()
Soweit sogut. Lernen wir nun etwas über die Kommentarfunktionen von IDA. ![]() In dem erscheinenden Dialog geben wir einen möglichst sinnvollen Kommentar ein und klicken auf "OK". Der eingegebene Kommentar erscheint nun neben der Zeile. ![]()
IDA bietet die Möglichkeit, Daten verschieden anzuzeigen. Hier wird standardmäßig die "6" als "36h" angezeigt. Da wir aber nun wissen, daß es sich
hierbei eigentlich um den ASCII-Wert des Zeichens "6" handelt, wäre es schöner, wenn dieses Zeichen dargestellt werden würde. Hierzu klicken wir mit der
rechten Maustaste auf "36h" und wählen aus dem erscheinenden Popup-Menü die Zeile aus, in der '6' steht. Alternativ können wir den Cursor auf
"36h" setzen und den ![]() Das Ergebnis dieser Aktion sieht so aus: ![]() Kommen wir nun zu einem weitern, sehr netten Feature von IDA: das Umbenennen von Referenzen. Wie wir sehen können, wird bei einem fehlgeschlagenen Vergleich zur Stelle "loc_401536" gesprungen, welche nachfolgend die Meldung anzeigt, daß eine Eingabe falsch war (die sogenannte "beggar-off"- oder auch "bad-cracker"-Meldung). Nun ist die Bezeichnung "loc_401536" nicht gerade sehr aussagekräftig. Viel schöner wäre es, wenn da etwas wie "bad_cracker" stehen würde. Klar könnte man einen Kommentar einfügen, aber der wäre ja nur lokal für diese Zeile sichtbar. Was wir bräuchten, wäre eine Möglichkeit, alle Referenzen von "loc_401536" umzubenennen. Hierzu machen wir einen Doppelklick auf "loc_401536" (egal auf welche Referenz), worauf wir uns hier wiederfinden sollten: ![]() Wir klicken nun mit der rechten Maustaste auf die Adresse "00401536" so daß folgendes Popup-Menü erscheint: ![]()
Hier wählen wir "Rename" aus was uns zu folgendem Dialog führt (alternativ hätten wir auch einfach mit dem Cursor auf die Adresse "00401536"
gehen und "n" drücken oder den ![]() Wir geben einen sinnvollen Namen wie z. B. "bad_cracker" ein und drücken auf "OK" Sofort sehen wir, daß alle Referenzen auf "loc_401536" in unseren neuen Namen geändert wurden: ![]() Zur Übung sollte das Gleiche mit entsprechend anderem Namen (z. B. "good_cracker") mit der Referenz "loc_40154D" gemacht werden.
Als kurzer Einschub behandeln wir jetzt, wie man IDA konfiguriert. ![]()
Wer z. B. gerne die Hexopcodes sehen möchte, trägt bei "Number of opcode bytes" die Anzahl der Bytes ein, die angezeigt werden sollen (6 ist hier ein guter Wert). Das ist vor allem zum Patchen sinnvoll, da man gleich die zu patchenden Bytes sehen kann. ![]() Wer gerne mehr als nur zwei Crossreferences angezeigt haben möchte, kann dies unter "Cross-references" beim Punkt "Number of displayed xrefs" einstellen.
Wenn man möchte, daß IDA längere Variablennamen generiert, muß direkt die Datei "ida.cfg" editieren. Der Eintrag hierfür lautet:
Wer den File-Offset des aktuellen Befehls wissen möchte (zum Patchen beispielsweise), schaue in die Info-Zeile ganz unten am IDA-Fenster: ![]() Der gelbe Kringel zeigt den File Offset und der rote Kringel die RVA (relative virtual address).
Weiter oben habe ich erwähnt, daß man mit dem ![]()
Hier muß man eine Bezeichnung für die zu setzende Marke angeben. Ich habe als Beispiel "patch_1" eingegeben, um zu kennzeichnen, daß hier zu patchen ist. ![]()
Es kann vorkommen, daß IDA nicht die Sprache erkennt, in der das zu analysierende Programm geschrieben wurde, und dadurch nicht die verfügbaren FLIRT-Signaturen einsetzt. Ist das der Fall, kann man die Signaturen manuell einbinden. Angenommen, das zu analysierende Programm wurde in Delphi 4 geschrieben. Wir rufen, nachdem IDA fertig disassembliert hat, aus dem Menu "View" den Punkt "Signatures" auf (alternativ mit dem ![]() |
|
6. Plug-Ins |
|
Wer W32DASM kennt und dessen String References (oder auch Imports/Exports) bei IDA schmerzlich vermißt, dem kann geholfen werden. Der Cracker "Amante4" der
Gruppe Immortal Descendants hat Plug-Ins für IDA in IDC, der Script-Sprache von IDA, geschrieben, welche genau die
genannten Features bietet. Die Plug-Ins können auf der o. g. Homepage unter der Rubrik "The Database/Releases" runtergeladen werden. Die Installation ist relativ
leicht und ist gut beschrieben im README.NFO in der ZIP-Datei, ebenso die Bedienung.
Aktuelle IDA-Versionen bieten ein schönes Feature namens "Automatic Parameter Recognition", was bewirkt, daß bei API-Funktionen die Parameter benannt werden (statt "push eax" steht als Kommentar eben noch dahinter, um welchen Parameter es sich handelt, z. B. "hWnd"). |
|
7. Schlußwort |
|
Ich denke, daß die grundlegende Bedienung von IDA Pro hiermit abgehandelt ist. Natürlich gibt es noch Unmengen an Features und Funktionalitäten, die hier
unerwähnt geblieben sind, aber schließlich handelt es sich auch "nur" um ein Newbie-Tutorial!
Schlußendlich hoffe ich, daß dieses Tutorial dem Newbie die Bedienung von IDA Pro etwas näherbringen konnte. Nehmt doch einfach ein kleines Crackme oder eine
kleine EXE-Datei, laßt sie von IDA disassemblieren, spielt dann mit den verschiedenen Knöpfen und Einstellungen herum und schaut, was passiert. Bleibt mir nur noch, ein paar Greetings (in unbestimmter Reihenfolge) loszuwerden und zwar an: |
Tutorial von:
medardus
Page gestaltet: 29. Mai 2000 von ArturDent