![]() |
Zydis - X86/X86-64 Disassembler Library
Liste der Anhänge anzeigen (Anzahl: 6)
Hallo zusammen,
Was ist Zydis? Die Zyan Disassembler Library (Zydis) ist eine plattformunabhängige X86/X86-64 Disassembler Library geschrieben in C. Bei der Entwicklung wurde neben Korrektheit (des Disassemblys) auch insbesondere auf Performance und eine kleine Codegröße Wert gelegt. Die Bibliothek unterstützt hierbei alle zum heutigen Tage existierenden ISA-Extensions. Der gesamte Code beinhaltet eine umfassende Doxygen Dokumentation. Detailierte Informationen über das Zydis Projekt und die dazugehörigen C-Sourcen (MIT Lizenz) gibt es auf GitHub (Englisch): ![]() Zydis Pascal: Hierbei handelt es sich um die Pascal-Bindings (Low-Level Übersetzung und Top Level Wrapper Klassen) für Zydis. Ein Kompilat der .DLL und die .OBJ-Dateien für statisches Linken (32- und 64-Bit), sowie ein paar Beispiele liegen dem Archiv ebenfalls bei. Die aktuellste Version der Bindings und die dazugehörigen ![]() ![]() Readme: Die Pascal Bindings unterstützen sowohl dynamisches, als auch statisches Linken:
Roadmap:
Viele Grüße Zacherl |
AW: Zydis - X86/X86-64 Disassembler Library
Super, dankesehr für deine Mühe :thumb:
Ich stecke jetzt nicht so tief im Assembler, weil ich versuche das möglichst zu Vermeiden. Aber falls ich da mal was suche weiss ich wo man nachschauen muss. Rollo |
AW: Zydis - X86/X86-64 Disassembler Library
Herzlichen Dank für beides, den Link zu Zydis und Deine Header!
In Sachen Zukunftspläne: ich fände eine FreePascal-Unterstützung auch toll, da ich schon seit Jahren von Delphi weg bin ;) Dürfte auch eigentlich kein Problem sein, wenn ich Montag wieder am Rechner bin, probiere ich das vielleicht mal aus. Ich verwende schon seit Jahren einen selbstgeschriebenen Disassembler, der hört aber bei den diversen Extensions auf, da fehlte mir immer Zeit bzw. waren die Prioritäten anders. Deshalb freue ich mich jetzt, mal was neues ausprobieren zu können :) |
AW: Zydis - X86/X86-64 Disassembler Library
Vielen Dank für eure Rückmeldung :)
FPC Support sollte kein Problem sein. Muss mich da allerdings erstmal einlesen (auch bezüglich des Supports älterer Delphi Versionen), da ich bisher keine Erfahrung in diesem Bereich habe. Ich meine unter anderem im JEDI Projekt hatte ich mal eine Reihe von Compiler-Direktiven gesehen, mit denen man verschiedene Delphi bzw. FPC Versionen unterscheiden und auf bestimmte Features testen kann. Könnte sogar sein, dass der Code ohne Änderungen funktioniert, da ich bewusst schon auf Generics, Initializer Lists für dynamische Arrays, etc. verzichtet habe. Muss auch schauen, ob ich die Header nochmal ein wenig abändere im Bezug auf Naming-Conventions. Momentan habe ich Typen mit
Delphi-Quellcode:
geprefixt, Enums in Scoped-Enums umgewandelt und Felder bzw. Parameter nach CamelCase konvertiert. Bin nicht ganz sicher, was hier die Best-Practice für C-Bindings ist (wenn ich nochmal so drüber nachdenke, ist eine 1 zu 1 Benennung mit zusätzlichem
T
Delphi-Quellcode:
-Alias vermutlich sinnvoller). Auch musste ich einige reservierte Begriffe mit
T
Delphi-Quellcode:
prefixen und hatte an einer Stelle zudem Probleme, weil ich im C-Code sowohl ein Feld groß-
&
Delphi-Quellcode:
, als auch ein Feld klein-
B
Delphi-Quellcode:
habe (nicht lynchen bitte, das hat die Intel Dokumentation so vorgegeben :wink:).
b
Wenn wir in den nächsten Tagen die Final Version von Zydis releasen, werde ich für die Pascal Header auch ein Repository auf GitHub anlegen. |
AW: Zydis - X86/X86-64 Disassembler Library
Wollte mich ja schon viel früher rückmelden, klappt aber leider erst jetzt :)
Offensichtliche Änderungen für FreePascal sind marginal. Statisches Linken klappt in FPC nicht, da es Eigenheiten der Obj-Dateien nicht unterstützt. Ich musste die Array-Größe der Konstante X86DATA festlegen, da kann FPC scheinbar keine konstanten dynamischen Arrays. FreePascal ist mit Namespaces noch nicht so weit, daher IFDEFs für System.SysUtils. Für Unterschiede in Methoden-Deklarationen in implementation und interface muss in den Delphi-Kompatibilitätsmodus geschaltet werden. Mit 64 bit kompiliert klappt SimpleDemo so super. In 32 bit haut mir aktuell leider ein "File not open" als Fehler raus (in Formatter.FormatInstruction). ZydisFormatterFormatInstructionEx liefert ZYDIS_STATUS_INVALID_PARAMETER. Hier mein diff:
Delphi-Quellcode:
Examples/SimpleDemo.dpr | 8 ++++----
Zydis/Zydis.Decoder.pas | 7 ++++++- Zydis/Zydis.Exception.pas | 3 ++- Zydis/Zydis.Formatter.pas | 11 ++++++++--- Zydis/Zydis.pas | 5 +++++ 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Examples/SimpleDemo.dpr b/Examples/SimpleDemo.dpr index c2b81fe..4917731 100644 --- a/Examples/SimpleDemo.dpr +++ b/Examples/SimpleDemo.dpr @@ -31,7 +31,7 @@ program SimpleDemo; {$R *.res} uses - System.SysUtils, + {$IFDEF FPC} SysUtils, {$ELSE FPC} System.SysUtils, {$ENDIF FPC} Zydis in '../Zydis/Zydis.pas', Zydis.Exception in '../Zydis/Zydis.Exception.pas', Zydis.Decoder in '../Zydis/Zydis.Decoder.pas', @@ -42,9 +42,9 @@ uses {* ============================================================================================== *} const - X86DATA: array of Byte = [$51, $8D, $45, $FF, $50, $FF, $75, $0C, $FF, $75, - $08, $FF, $15, $A0, $A5, $48, $76, $85, $C0, $0F, - $88, $FC, $DA, $02, $00]; + X86DATA: array[0..24] of Byte = ($51, $8D, $45, $FF, $50, $FF, $75, $0C, $FF, $75, + $08, $FF, $15, $A0, $A5, $48, $76, $85, $C0, $0F, + $88, $FC, $DA, $02, $00); var Formatter: Zydis.Formatter.TZydisFormatter; diff --git a/Zydis/Zydis.Decoder.pas b/Zydis/Zydis.Decoder.pas index 1ec0d80..ed06371 100644 --- a/Zydis/Zydis.Decoder.pas +++ b/Zydis/Zydis.Decoder.pas @@ -28,8 +28,13 @@ unit Zydis.Decoder; interface +{$IFDEF FPC} +{$MODE Delphi} +{$ENDIF FPC} + uses - System.SysUtils, Zydis, Zydis.Exception; + {$IFDEF FPC} SysUtils, {$ELSE FPC} System.SysUtils, {$ENDIF FPC} + Zydis, Zydis.Exception; type TZydisDecoder = class sealed(TObject) diff --git a/Zydis/Zydis.Exception.pas b/Zydis/Zydis.Exception.pas index b23bc90..e5c45ca 100644 --- a/Zydis/Zydis.Exception.pas +++ b/Zydis/Zydis.Exception.pas @@ -29,7 +29,8 @@ unit Zydis.Exception; interface uses - System.SysUtils, Zydis; + {$IFDEF FPC} SysUtils, {$ELSE FPC} System.SysUtils, {$ENDIF FPC} + Zydis; type TZydisException = class(Exception) diff --git a/Zydis/Zydis.Formatter.pas b/Zydis/Zydis.Formatter.pas index 1922910..3e5d61c 100644 --- a/Zydis/Zydis.Formatter.pas +++ b/Zydis/Zydis.Formatter.pas @@ -28,8 +28,13 @@ unit Zydis.Formatter; interface +{$IFDEF FPC} +{$MODE Delphi} +{$ENDIF FPC} + uses - System.SysUtils, Zydis, Zydis.Exception; + {$IFDEF FPC} SysUtils, {$ELSE FPC} System.SysUtils, {$ENDIF FPC} + Zydis, Zydis.Exception; type TZydisFormatter = class(TObject) @@ -383,7 +388,7 @@ begin Data := @Buffer[0]; end; if (not ZydisSuccess(Status)) then TZydisException.RaiseException(Status); - Result := String(PAnsiChar(Data)); + Result := String(AnsiString(PAnsiChar(Data))); end; function TZydisFormatter.FormatOperand(const Instruction: TZydisDecodedInstruction; @@ -410,7 +415,7 @@ begin Data := @Buffer[0]; end; if (not ZydisSuccess(Status)) then TZydisException.RaiseException(Status); - Result := String(PAnsiChar(Data)); + Result := String(AnsiString(PAnsiChar(Data))); end; class function TZydisFormatter.InternalFormatInstruction(const Formatter: Zydis.TZydisFormatter; diff --git a/Zydis/Zydis.pas b/Zydis/Zydis.pas index 41695f7..6c839de 100644 --- a/Zydis/Zydis.pas +++ b/Zydis/Zydis.pas @@ -30,6 +30,11 @@ interface {$DEFINE ZYDIS_DYNAMIC_LINK} +{$IFDEF FPC} +{$DEFINE ZYDIS_DYNAMIC_LINK} +{$MODE Delphi} +{$ENDIF FPC} + {* ============================================================================================== *} {* Constants *} {* ============================================================================================== *} |
AW: Zydis - X86/X86-64 Disassembler Library
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Struct. Vielleicht läuft da irgendwas mit dem Alignment schief. Notfalls muss ich mir mal FPC/Lazarus besorgen und es selbst testen.
TZydisDecodedInstruction
|
AW: Zydis - X86/X86-64 Disassembler Library
Um das mit Delphi zu testen habe ich nur Delphi XE zur Verfügung. Da lässt sich die SimpleDemo-Projektdatei gar nicht mehr öffnen; in einem Klon musste ich CPUX86 definieren, kam dann aber nicht weiter, da XE einige record helper auch noch nicht kann. Insofern konnte ich mit Delphi gar nicht testen, aber da habe ich ja auch nur noch diese Uralt-Version. Muss mir wohl noch ne VM mit ner aktuellen Starter aufsetzen irgendwann mal.
Noch eine Erkenntnis: FPC 3.0.4 (aktuelle stable, der Kompiler zum aktuellen Lazarus 1.8.4) stolpert über strict private class var Callbacks. Die 3.1er Entwicklungszweige verdauen das aber (ich nutze fpcupdeluxe, um mir mit einem Klick einen aktuellen trunk zu installieren). Zum Alignment habe ich mal nachgelesen, dass $Z zumindest kompatibel existieren soll: ![]() Ich habe die Variable Instruction (aus SimpleDemo) sowohl in 32 als auch 64 bit aus der Watch im Debugger kopiert (nach Decoder.DecodeBuffer) - beide Inhalte sind exakt identisch (Textrepresentation des records jeweils in Textdatei gespeichert, beide Textdateien byteweise verglichen). Auch als unstrukturierter Speicherdump sind sie identisch. SizeOf(Instruction) ist auch beide Male 896 byte. Das statische Linken ist mir persönlich gar nicht wichtig, aber der Vollständigkeit halber hier die Fehlermeldungen:
Code:
SimpleDemoFPC.lpr(94,1) Error: Associative or exact match COMDAT sections are not yet supported (symbol: .xdata)
SimpleDemoFPC.lpr(94,1) Error: Associative or exact match COMDAT sections are not yet supported (symbol: .pdata) |
AW: Zydis - X86/X86-64 Disassembler Library
Zitat:
Zitat:
|
AW: Zydis - X86/X86-64 Disassembler Library
Liste der Anhänge anzeigen (Anzahl: 2)
Klar kann ich das, beide sind angehängt.
Die letzte Zeile ist jeweils der direkte Memory Dump, den Teil davor hatte ich angefangen, zu strukturieren, bin dann aber einfach auf Binärvergleich der Dateien umgestiegen ;) Danke für Dein Reinschauen, FreePascal ist ja doch nicht gerade mainstream ;) |
AW: Zydis - X86/X86-64 Disassembler Library
Soo, habe einfach mal dein Memory Dump genommen und damit ein
Delphi-Quellcode:
Struct gefüllt. Werte sehen alle gut aus (sowohl in deiner Textdatei, als auch bei mir im Debugger) und auch damit schlägt
TZydisDecodedInstruction
Delphi-Quellcode:
bei mir nicht fehl. Denke mal damit ist dann auf jeden Fall schonmal sicher, dass es sich um ein Problem im Zusammenhang mit FPC handelt. Ich schaue mal, ob ich die Lazarus IDE irgendwie gescheit auf meiner VM aufgesetzt bekomme, sonst ist das hier eher ein Ratespiel :?
ZydisFormatInstructionEx
Edit: Leider bekomme ich es nichtmal hin für 32-bit zu compilen ^^ Edit: Okay, das wird immer komischer. Auf meiner Win10 1607 VM erhalte ich direkt beim Start den Fehler 0x7B
Code:
aber auf meinem 1709er Produktivsystem startet die Anwendung, aber schmeißt dann direkt die
ERROR_INVALID_NAME
123 (0x7B) The filename, directory name, or volume label syntax is incorrect.
Delphi-Quellcode:
mit
ZydisException
Delphi-Quellcode:
.
ZYDIS_STATUS_INVALID_PARAMETER
Edit: Interessant. Auf der VM weigert sich auch z.b.
Delphi-Quellcode:
oder OllyDbgs
rundll32.exe
Delphi-Quellcode:
die
loaddll.exe
Delphi-Quellcode:
als valide Win32 PE-Datei anzuerkennen :gruebel: Auf dem Produktivsystem funktioniert auch dies. Erstellt wurde die DLL mit Visual Studio 2017 (MSVC).
Zydis32.dll
Edit: Okay, das lag daran, dass ich ausversehen nicht statisch gelinkt hatte und mir auf der VM die 32-bit C-Runtimes fehlten.
Delphi-Quellcode:
tritt nach wie vor auf. In OllyDbg kann ich sehen, dass FPC statt eines Zeigers leider das komplette Struct auf den Stack pusht.
ZYDIS_STATUS_INVALID_PARAMETER
|
AW: Zydis - X86/X86-64 Disassembler Library
Ahh, habe das Problem endlich finden und beheben können. Delphi übergibt Structs, welche mit
Delphi-Quellcode:
gekennzeichnet sind standardmäßig als Zeiger. FPC pusht unter 32-Bit anscheinend lieber den kompletten Inhalt auf den Stack :wall: Habe das Interface manuell auf Zeigertypen geändert. Ist so im Grunde eh näher am C-Original.
const
|
AW: Zydis - X86/X86-64 Disassembler Library
Ja, CONST ist wie VAR, nur halt "schreibgeschützt" ... das gilt für Typen über 32 Bit. (bis 32 Bit wird meistens optimiert und dann doch der Wert, anstatt einem Zeiger übergeben)
Und gemanagte Typen, ala String, Interface usw. sind eh immer bissl anders. Mit einer anderen Aufrufkonvention könnte sich das Verhalten eventuell auch ändern. |
AW: Zydis - X86/X86-64 Disassembler Library
Zitat:
Delphi-Quellcode:
jetzt explizit
const TType
Delphi-Quellcode:
verwendet wird.
PType
Edit: Wobei scheinbar
Delphi-Quellcode:
auch bei Delphi keine Garantie für "pass by reference" ist. In neueren Versionen gibt es hierfür wohl den
const
Delphi-Quellcode:
Decorator. Für FreePascal kann man
[Ref]
Delphi-Quellcode:
verwenden. Um einheitlich zu bleiben habe ich mich jetzt aber für die expliziten Zeigertypen entschieden.
constref
|
AW: Zydis - X86/X86-64 Disassembler Library
Hi,
da ist ein kleiner Fehler in der GitHub Beschreibung... Extract the Zydis32.dll or Zydis64.dll from the Bin32/Bin64 folder to the directory that contains your application or install the library to your C:\Windows\System32\ (64-bit) / C:\Windows\SysWOW64\ (32-bit) directory Extract the Zydis32.dll or Zydis64.dll from the Bin32/Bin64 folder to the directory that contains your application or install the library to your C:\Windows\System32\ (32-bit) / C:\Windows\SysWOW64\ (64-bit) directory Cracks&Nerds wissen es - aber Neulinge eher nicht... |
AW: Zydis - X86/X86-64 Disassembler Library
Zitat:
|
AW: Zydis - X86/X86-64 Disassembler Library
Jupp, es heißt im Printip "Windows 32-Subsystem on Windows 64"
Ja, die Namen sind schon etwas krank verwirrend. System32 = 64 Bit WoW64 = 32 Bit :freak: Außerdem heißt die API weiterhin Win32, auch wenn sie 64 Bit sein kann. (Vorteil, weil wäre noch verwirrender, wenn 64 Bit eine eigene API hätte, so wie damals Win16) Der Grund ist aber nicht Microsoft, sondern weil man versuchte die Fehler bescheuerter Programmierer auszumerzen, welche selbst heute immernoch mit hartcodierten Pfaden arbeiten. Und auch der Grund, warum die SystemPartition seit 'ner Weile immer C ist, auch wenn sie nicht die erste Partition der Festplatte ist. (ursprünglich wurden Partitionen standardmäßig einfach durchgezählt. zwei mögliche Diskettenlaufwerke und dann C die erste Partition der ersten Festplatte) |
AW: Zydis - X86/X86-64 Disassembler Library
Zitat:
Ich persönlich lege den DLL-Pfad sogar im Manifest fest. Sicher ist sicher :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz