AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Zur laufzeit Bytecode disassemblen?
Thema durchsuchen
Ansicht
Themen-Optionen

Zur laufzeit Bytecode disassemblen?

Ein Thema von Memnarch · begonnen am 4. Apr 2013 · letzter Beitrag vom 4. Apr 2013
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 09:18
Tag allerseits,
Ich beschäftige mich gerade mit dem lustigen Thema des Laufzeitpatches von Routinen in Delphi.
Vorneweg: Das mach ich nur aus interresse, und wird in keinem Produkt aktiv genutzt. Egal wie schmutzig, alles ist also erlaubt .

Ich gehe dabei wie folgt vor:
Ich kopiere die komplette zu patchende Routine in einen ByteArray und setze dann an den Anfang der ursprünglichen Routine einen jump in meine. SO kann ich dann in meiner routine was machen und schlussendlich die originale aufrufen.

An sich kein Problem. Der "Fehler" liegt im Detail. Nämlich die relativen CALLs in der kopierten Routine(Opcode $E8). Diese müssen neu berechnet werden. Momentan nutze ich die Disassembly-View von Delphi, um die stellen im Bytearray zu suchen, die auch tatsächlich CAlls sind, und keine zufälligen $E8(Wobei ein naiver ansatz überraschend oft funktioniert^^). Dies teil ich beim patchen mit und dann werden die routinen angepasst. Klappt einwandfrei.

Viel interressanter wäre es, wenn ich den Bytearray disassemblen könnte, um die CALLs selbst rauszufiltern und das ganze zu automatisieren.

Gibts einen einfachen X86 Disassembler den ich zur laufzeit in Delphi nutzen kann?

Andersrum würde es theoretisch schon helfen herauszufinden, wie groß ein Opcode ist und wieviel Bytes die angehängten Daten belegen um im Bytearray von opcode zu Opcode zu springen.

MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch ( 4. Apr 2013 um 09:21 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 09:34
Wie wäre es mit madDisAsm? Dürfte Dir schon einen Teil der Infos liefern - auswerten, etwa nach CALLs, dürfte dann ja nicht mehr so schwer sein.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 09:36
Oder bringt dir vielleicht OllyDbg etwas?
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 09:55
Sehr Geil. Danke für die Antworten. Gerade MadShi scheint da perfect zu sein, um den Source Opcode für Opcode zu iterrieren o.O
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 11:13
Ich beschäftige mich gerade mit dem lustigen Thema des Laufzeitpatches von Routinen in Delphi.
Schau dir mal an was hierzu in den TNTWare-Controls implementiert ist.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#6

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 15:07
@Bernhard Geyer werde ich später mal nen Blick reinwerfen.

Aktuel funktioniert mein Vorhaben blendend. Bisher konnte auch jede API funktion(und Non-Virtual Method) ohne probleme automatisch gehooked werden.

MFG
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 15:54
Wenn du nur APIs hookst und diese eine Standard Strackframe-Generierung durchführen, brauchst du nicht einmal die API kopieren, sondern einfach die ersten paar Bytes (Stackframe-Generierung) mit einem Jmp zu deinem Code patchen und bei deinem Code am Schluss den Stackframe generieren.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#8

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 16:11
@Aphton: Eben nicht nur API calls. Generell procedures/functions etc deren aufrufkonvention bekannt ist.

Meine Methodik klappt unabhängig vom Stackframe, dank MadShi sehr einfach, und universeller.
DU kannst auch jederzeit(sagen wir mal ich hook was von dir) deine implementation ändern und mein Hook geht immernoch(Bis du parameter/aufrufkonvention) änderst.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 16:20
Jo klar ist deine Variante universeller, jedoch wollte ich dir die Arbeit nur vereinfachen. Dachte mir es geht eventuell um etwas spezifisches.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#10

AW: Zur laufzeit Bytecode disassemblen?

  Alt 4. Apr 2013, 16:30
Nope, es geht lediglich um meine experimentierwüterei^^
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  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 17:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz