Grundsatztutorial zum Thema "Wdasm" oder auch Disassembler meines Vertrauens

Autor:ZeroJump
Datum:17.07.2002
Target:
Size:0 Bytes
Tools:WDasm
Art des Cracks:Grundlagen


Einleitung

Hallo,

ihr solltet mich inzwischen kennen. Ich bin ZeroJump, der Leader von CIP. In meinem heutigen Tutorial werde ich Euch an den Disassembler WDasm heranführen. Dabei erkläre ich, was man mit dem Teil eigentlich macht und erläutere auch wichtige Funktionen des Tools.

Zum Spass üben wir am Beispiel Notepad, allerdings werden wir nichts sinnvolles damit anstellen :D


Was ist ein Disassembler?

Diese Frage werden sich wohl schon viele von Euch gestellt haben. Die grobe Erklärung findet sich in dem Grundsatztutorial Nr.1. Da steht: "...zerlegt eine beliebige Datei in Assembleranweisungen!" -Aha, werden sich die meisten jetzt denken. Deshalb kommt jetzt eine tiefergehende Erklärung dazu:

WDasm macht im Prinzip nichts anderes, als eine beliebige Datei anzuzeigen. Da das jetzt sehr komisch klingt, eine weitere Analyse: Kompilierte Programme bestehen aus puren Prozessoranweisungen. Diese stehen in der Datei in Form von hexadezimalen Werten. So werden sie jedenfalls für uns sichtbar gemacht. Natürlich arbeitet der Prozessor auf Binärebene. Damit der Prozessor weiß, wann er was zu machen hat, ergibt eine bestimmte Abfolge von Hex-Werten eine Anweisung. Alle Anweisungen ergeben dann das komplette Programm. Die Abfolgen von Werten, die eine Anweisung ergeben ist durch die "Opcodes" definiert. Opcodes sind also die entsprechenden Hex-Werte, die die Prozessor-Anweisungen ergeben. OpCodes = OperationCodes. Gleichzeitig ergibt sich daraus die Assembler-Sprache. Der Prozessor arbeitet nur mit Binärwerten, man kann ihm keine Anweisungen im Text-Format übergeben. Um es aber dem Menschen zu erleichtern -keiner kann ein Programm aus Binärwerten schreiben- gibt man den Anweisungen Namen, songenannte Mnemonics
WDasm zeigt uns eine beliebige Datei an, nur dass sie in Opcodes und damit in Assembleranweisungen dargestellt wird. Die Ausgabe in Wdasm ist meistens Tausende von Zeilen lang, da Funktionen, wie printf (aus C), in viele, viele Assembleranweisungen zerlegt werden. Das benötigt entsprechend Platz.

Das WDasm aber mehr kann, als nur Assemblerlistings ausgeben, zeige ich jetzt.


Beispiel Notepad

Ein Programm beinhalted nicht nur Assembleranweisungen. Beispielsweise werden ja auch Textvariablen definiert. Überschriften, Dialogtexte, Warnungen, all das steht (meistens) auch in einem Programm. WDasm ist in der Lage diese Strings zu finden, herauszufiltern und kann uns sogar zu der Stelle im Programm führen, wo die Zeichenkette ver/bearbeitet wird.

Ein praktisches Demo-Programm zum Demonstrieren ist das gute alte Notepad.

Zunächst laden wir die Notepad.exe in WDasm: Disassembler --> Open File to Disassemble

Nachdem Wdasm die Datei vollständig geladen hat, kann es eventuell sein, dass ihr nur wirres Zeug seht. Das kann daran liegen, dass ihr eine falsche Schriftart eingestellt habt oder daran, dass ihr einfach noch nicht durchsteigt. :-))

Die Schriftart ändert ihr mit Disassembler --> Font --> Select, anschließend macht ihr sie noch zur Standardschrift, im gleichen Menu.

Im folgenden gehe ich von der Win2k-Version von Notepad aus. Ich weiss nicht, ob und wie sich die Versionen unterscheiden, aber das ist auch nicht so wichtig für den Moment.

Ganz oben in WDasm stehen Informationen über die exe selber. Bis man das versteht dauert es eine Weile. deshalb richten wir uns auf die nächsten Zeilen aus.

"MENU-INFORMATION": Zunächst zeigt uns WDasm da die in dem Programm verwendeten Menus und ihre einzelnen Elemente.

"DIALOG INFORMATION": Danach folgen sämtliche Dialoge, die das Programm mit dem Benutzer führt. Zu Dialogen gehören auch Schaltflächen, etc.

"IMPORTED FUNCTIONS": Diese Sektion zeigt uns sämtliche Dateien an, aus denen das Programm zusätzlich Methoden und Funktionen aufruft.

"IMPORT MODULE DETAILS": Hier erfahren wir ganz genau, welche Funktionen aus den Dateien aufgerufen werden.

"ASSEMBLE CODE LISTING": Der eigentliche Programmcode im Assemblerformat.

Uhrsprünglich wollte ich Euch aber zunächst zeigen, wie man von dem Programm verwendete Strings im Code wiederfindet. Zunächst sollte man sich alle Strings ansehen können. Das geht entweder über das Menu "Refs" --> String Data References oder über die Toolbar mit dem Symbol links neben dem Druckerbutton. Es öffnet sich ein neues Fenster, dass alle von WDasm gefundenen Strings auflistet. Manchmal entdeckt ihr merkwürdige Zeichen, zum Beispiel Prozentzeichen in einem String:

"Die Datei %% kann nicht gefunden werden"

Das zeigt an, dass dieses String-Stück variabel ist, die Prozentzeichen dienen als Art Platzhalter.

Doppelklickt man jetzt auf einen String, so springt WDasm an die Stelle im code, an der der String gebraucht wird. Versucht es: Klickt doppelt auf " - Editor". Wdasm ist ein bisschen nach unten gesprungen und zeigt euch die Stelle. Scrollt wieder ein wenig nach oben und ihr seht "Possible Reference...".

Eine der wichtigsten Eigenschaften von WDasm ist das Verfolgen von Sprung- und Call-Anweisungen. Ein Progamm läuft nicht einfach von oben nach oben runter. Es werden ständig sprünge durchgeführt, die an eine andere Stelle im Code führen. Sprunganweisungen in Assembler beginnen immer mit einem "j". Beispielsweise: "je (jz), "jne (jnz)", "jg", "jl" oder auch "jmp".

In WDasm finden wir einen Jump in der Nähe der Stelle im Code, an der der String " - Editor" benötigt wurde. 4 Codezeilen tiefer steht ein "jne" Wenn ihr mit dem Balken in Wdasm direkt auf den Jump scrollt, wird dieser grün. Das zeigt an, dass man an eine andere Stelle im Code gelangen kann, wenn man dem Jump folgt. Um dem Jump zu folgen drückt man in Wdasm den Button "Jump to" aus der Toolbar. Wdasm springt dann an die Stelle im Code zu der der Sprung führt. Welche das ist, braucht euch erst einmal nicht zu kümmern. Gleichzeitig merkt sich WDasm aber auch, wo ihr hergekommen seid. Einmal gesprungen, könnt ihr mit dem button "ret" wieder an den Ursprungsort zurückkehren. Ihr könnt auch mehreren sprüngen folgen und auch wieder mehrfach zurückgeleitet werden.

Ebenfalls nützlich ist die "Goto Code Location"-Anweisung im "Goto"-Menu. Damit kann an an jede beliebige Adresse im Programm springen. Die Dialogbox erwartet die Eingabe einer Adresse. Die Adressen der Codezeilen stehen als erstes in jeder Zeile des Assembler-Listings. Eingeben muss man sie ohne den Doppelpunkt.

Das sind die wichtigsten Funktionen von WDasm, ich empfehle dringend viel mit Notepad und den gelernten Aktionen zu experimentieren, da ihr so lernt euch in einem Assembler-Listing zu bewegen und zurechtzufinden.


Ebenfalls wichtig ist die Statusleiste. Dort wird eine wichtige Information ausgegeben, das Offset der aktuellen Code-Zeile. Damit kann man eine Zeile Code in einem Hexeditor wiederfinden. Das ist für das sogenannte Patchen wichtig, wenn man bewusst Anweisungen tauscht, löscht, etc. In Tutorials werdet ihr wahrscheinlich immer den Begriff Offset hören, also merken.


Abschließendes

Wie die gelernten Techniken zu gebrauchen sind und welchen Nutzen sie haben, kann in diesem Tut nicht deutlich geworden sein und sollte es auch gar nicht. Das lernt ihr in den eigentlichen Cracking-Tutz, die sich speziell mit einem Programm beschäftigen.

Soviel zu Wdasm, ich hoffe ihr konntet etwas dazulernen.

Vielen Dank für die Aufmerksamkeit, ZeroJump




Hast Du noch Fragen oder Probleme mit dem Tutorial? Zögere nicht mir eine EMail zu schicken, ich werde versuchen zu helfen: Contact

Besuch uns wieder unter http://cip.katz.ws

oder unser Board: http://cip-board.katz.ws