Die hier vorgestellte Library dient zum Disassemblieren von binären Programm-Code. Die Library ist frei konfigurierbar, das heißt das Programm-Code von den verschiedensten Prozessoren dargestellt werden kann. Für jeden Prozessortyp gibt es eine eigene Konfigurationsdatei (*.acf). Zum jetzigen Zeitpunkt werden vier Typen unterstützt.
- 16-Bit x86 Code AsmInit("I386.acf",1,0)
- 32-Bit x86 Code AsmInit("I386.acf",0,0)
- 64-Bit AMD Code AsmInit("EM64.acf",0,0)
- 8051 Microcontroller AsmInit("8051.acf",0,0)
Mit der Funktion AsmInit wird eine Prozessorkonfiguration geladen. Danach muss mit AsmSetFormat das Zeilenformat eingestellt werden. Der erste Parameter gibt an wie viele Zeichen die Adresse am Zeilenanfang breit sein soll. Der zweite Parameter bestimmt wie viele Bytes des Programm-Codes als Hex-Dump maximal ausgegeben werden sollen.
Danach kann mit AsmDecode beliebiger Programm-Code disassembliert werden. Der erste Parameter ist ein Zeiger auf den Code-Bereich. Danach folgt ein Zeiger auf eine AsmEntryInfo Struktur. In ihr wird der Ausgabetext und weitere Informationen über den dekodierten Befehl gespeichert. Die beiden letzten Parameter sind die Adresse des Code-Abschnittes, geteilt in untere 32 und obere 32-Bit.
#include "AsmDecoder.h" ... AsmEntryInfo info; unsigned long offs; unsigned long addr=0x00400000; unsigned char data[]={0x12,0x34,0x12,0x67,0xAA,0x34,0x98,0x12,0xFF,0xE3,0x00};
AsmInit("I386.acf",0,0); // Instruction-Set laden AsmSetFormat(8,6); // Zeilenformat einstellen
for(offs=0;offs<sizeof(data);) { offs+=AsmDecode(data+offs,info,addr+offs,0); printf("\n%s",info.line_text); }
Das Demoprogramm erzeugt folgende Ausgabe:
00400000 12 34 12 ADC DH,[EDX+EDX] 00400003 67 AA STOSB 00400005 34 89 XOR AL,98 00400007 12 FF ADC BH,BH 00400009 E3 00 JEXCZ 0040000B
Und hier ist die etwas verbesserte Version des Disassemblers.
Mit dem ExeEditor können EXE, DLL, SYS und BIN Dateien disassembliert werden. Hier ist der oben beschriebene Disassembler in ein Framework gepackt. Bei binär Dateien kann der ExeEditor 16/32-Bit x86 Code anzeigen, außerdem werden 64-Bit AMD Modi und 8051 Codes unterstützt. Bei Windows EXE-Dateien werden zusätzlich die Namen aller DLL-Einsprungpunkte gespeichert.
Extrahiere alle Zip-Dateien in deinem Verzeichnis MyProjects.
Bevor du das Programm kompilieren kannst musst du zuerst die Bibliotheken AZ_Lib, AZ_Image, AZ_Archive und AZ_Controls erstellen.
Dazu lade erst einmal den Quellcode der Bibliothek herunter
und dann das Projekt selber.
Anschließend kompilierst du die Bibliotheken, das dauert einige Zeit.
(mit dem Menü "Erstellen/Erstellen in Stabelverarbeitung" )
Du musst es aber nur einmal machen oder wenn du etwas an der Bibliothek verändert hast.
Eine Beschreibung zu den Funktionen in der Bibliothek findest du in den Dateien:
.\Allgemein\*.chm
Jetzt sind noch 2 Einstellungen im Visual C++ zu machen:
Im Menü Extras/Optionen/Verzeichnisse/Include-Dateien den Pfad:
....\MyProjects\Allgemein einfügen
Im Menü Extras/Optionen/Verzeichnisse/Bibliotheks-Dateien den Pfad:
....\MyProjects\AZ_Lib einfügen
Quellcode der Bibliothek
Projektdateien der Bibliothek
Hilfedateien der Bibliothek
Anton Zechner |