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
CCRDude

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

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
 
#2

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
CCRDude

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

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 10. Apr 2018, 11:43
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: http://wiki.freepascal.org/sPackenum/de

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)
  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 10. Apr 2018, 13:54
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 ist bei mir auch der Fall, also sollte es daran zumindest schonmal nicht liegen. Sehr komisch. Kannst du mir die besagte Textdatei eventuell mal hier hochladen? Vielleicht ist ja doch irgendwie einer der Werte komisch.

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)
Danke sehr! Bin ich auch grade unsicher, was das bedeutet und ob ich da überhaupt etwas dran schrauben kann
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 10. Apr 2018, 13:58
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
Angehängte Dateien
Dateityp: txt instruction-x64.txt (8,7 KB, 5x aufgerufen)
Dateityp: txt instruction-x86.txt (8,7 KB, 3x aufgerufen)
  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 10. Apr 2018, 16:32
Soo, habe einfach mal dein Memory Dump genommen und damit ein TZydisDecodedInstruction Struct gefüllt. Werte sehen alle gut aus (sowohl in deiner Textdatei, als auch bei mir im Debugger) und auch damit schlägt ZydisFormatInstructionEx 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

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:
ERROR_INVALID_NAME
  123 (0x7B)
  The filename, directory name, or volume label syntax is incorrect.
aber auf meinem 1709er Produktivsystem startet die Anwendung, aber schmeißt dann direkt die ZydisException mit ZYDIS_STATUS_INVALID_PARAMETER .

Edit: Interessant. Auf der VM weigert sich auch z.b. rundll32.exe oder OllyDbgs loaddll.exe die Zydis32.dll als valide Win32 PE-Datei anzuerkennen Auf dem Produktivsystem funktioniert auch dies. Erstellt wurde die DLL mit Visual Studio 2017 (MSVC).
Edit: Okay, das lag daran, dass ich ausversehen nicht statisch gelinkt hatte und mir auf der VM die 32-bit C-Runtimes fehlten. ZYDIS_STATUS_INVALID_PARAMETER tritt nach wie vor auf. In OllyDbg kann ich sehen, dass FPC statt eines Zeigers leider das komplette Struct auf den Stack pusht.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (10. Apr 2018 um 18:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Zydis - X86/X86-64 Disassembler Library

  Alt 10. Apr 2018, 20:16
Ahh, habe das Problem endlich finden und beheben können. Delphi übergibt Structs, welche mit const gekennzeichnet sind standardmäßig als Zeiger. FPC pusht unter 32-Bit anscheinend lieber den kompletten Inhalt auf den Stack Habe das Interface manuell auf Zeigertypen geändert. Ist so im Grunde eh näher am C-Original.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 01:12 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