Einzelnen Beitrag anzeigen

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