AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Zydis - X86/X86-64 Disassembler Library
Thema durchsuchen
Ansicht
Themen-Optionen

Zydis - X86/X86-64 Disassembler Library

Ein Thema von Zacherl · begonnen am 23. Feb 2018 · letzter Beitrag vom 1. Nov 2022
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Zydis - X86/X86-64 Disassembler Library

  Alt 23. Feb 2018, 01:54
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):
https://github.com/zyantific/zydis

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 Binaries (.DLLs und .OBJ Dateien), finden sich auch immer in unserem GitHub Repository (Englisch):
https://github.com/zyantific/zydis-pascal

Readme:
Die Pascal Bindings unterstützen sowohl dynamisches, als auch statisches Linken:
  • Dynamisch
    • Zydis32.dll bzw. Zydis64.dll aus Bin32 bzw. Bin64 in das Verzeichnis der eigenen Anwendung, oder nach C:\Windows\System32\ (64-Bit) bzw. C:\Windows\SysWOW64\ (32-Bit) kopieren
    • Die Compilerdirektive {$DEFINE ZYDIS_DYNAMIC_LINK} in der Zydis.pas aktivieren (standardmäßig an)
  • Statisch
    • Die Verzeichnisse Bin32 bzw. Bin64 in den Root-Ordner der Pascal Bindings kopieren (bereits erledigt, wenn ihr das Archiv hier aus dem Thread herunterladet)
    • Die Compilerdirektive {$DEFINE ZYDIS_DYNAMIC_LINK} in der Zydis.pas deaktivieren
    • Wenn statisch gelinkt wird, sollte die Bibliothek neben Windows auch auf allen Unixoiden bzw. mobilen Systemen vollständig lauffähig sein, da keine Plattformspezifischen Funktionen importiert werden

Roadmap:
  • Doxygen Dokumentation für die Bindings
  • Unterstützung für ältere Delphi Versionen und FreePascal

Viele Grüße
Zacherl
Miniaturansicht angehängter Grafiken
zydisinfo.png   logo.png  
Angehängte Dateien
Dateityp: rar zydis-pascal.rar (671,2 KB, 20x aufgerufen)
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (10. Apr 2018 um 20:15 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.159 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 23. Feb 2018, 07:44
Super, dankesehr für deine Mühe

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
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 23. Feb 2018, 08:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 23. Feb 2018, 15:26
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 T 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 -Alias vermutlich sinnvoller). Auch musste ich einige reservierte Begriffe mit & prefixen und hatte an einer Stelle zudem Probleme, weil ich im C-Code sowohl ein Feld groß-B , als auch ein Feld klein-b habe (nicht lynchen bitte, das hat die Intel Dokumentation so vorgegeben ).

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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 9. Apr 2018, 14:22
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                                                                                      *}
 {* ============================================================================================== *}
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 9. Apr 2018, 22:53
Wollte mich ja schon viel früher rückmelden, klappt aber leider erst jetzt
Hey, kein Problem Vielen Dank schonmal!

Statisches Linken klappt in FPC nicht, da es Eigenheiten der Obj-Dateien nicht unterstützt.
Oh, kann ich da was tun, oder geht das generell nicht? Musste auch für Delphi schon einige Linker-Optionen anpassen, damit es die OBJ-Files schluckt.

In 32 bit haut mir aktuell leider ein "File not open" als Fehler raus (in Formatter.FormatInstruction). ZydisFormatterFormatInstructionEx liefert ZYDIS_STATUS_INVALID_PARAMETER.
Ouh, das ist seltsam Tritt das Problem bei dir auch unter einem "normalen" Delphi auf? Die einzige Möglichkeit, weshalb dieser Status zurückgeliefert werden könnte, ist ein fehlerhaftes TZydisDecodedInstruction Struct. Vielleicht läuft da irgendwas mit dem Alignment schief. Notfalls muss ich mir mal FPC/Lazarus besorgen und es selbst testen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
MAXON

Registriert seit: 28. Aug 2009
15 Beiträge
 
#7

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 31. Okt 2022, 10:43
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...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 31. Okt 2022, 12:19
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...
Vielleicht überdenkst Du nochmal Deine Aussage, WOW64 = Windows-On-Windows 64 (dieser Ordner enthält ein 32bit Subsystem um 32bit Prozesse zu starten)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#9

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 31. Okt 2022, 13:10
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


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)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (31. Okt 2022 um 13:18 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 1. Nov 2022, 11:57
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...
Wenn's um Cracks vs. Nerds geht, sollten Cracks wissen, dass man besser gar keine Bibliotheken in den Systemordner installiert. Gibt nur Versionschaos, Probleme mit schlechten Uninstallern (ggfls. auch anderer Produkte mit gleicher DLL), Sicherheitsprobleme (Suchpfad DLLs).

Ich persönlich lege den DLL-Pfad sogar im Manifest fest. Sicher ist sicher
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 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 by Thomas Breitkreuz