![]() |
Brauche verständnishilfe für folgenden Detourcode
Tag allerseits,
Habene ebdn durch zufall auf Stackoverflow folgenden Artikel entdeckt: ![]() Dort ist folgender code zum umleiten von methoden angegeben:
Delphi-Quellcode:
Seh ich das richtig, wird nicht die ursprüngliche Methode zerstört? Delphi-routinen haben doch keine Nops für Detours wie die WInapi, oder?.
type
THookedForm = class(TCustomForm) procedure HookedDoCreate; end; THookedFrame = class(TCustomFrame) constructor Create(AOwner: TComponent); override; end; PPatchEvent = ^TPatchEvent; /// asm opcode hack to patch an existing routine TPatchEvent = packed record Jump: byte; Offset: integer; end; var PatchForm, OriginalForm: TPatchEvent; PatchPositionForm: PPatchEvent = nil; PatchFrame, OriginalFrame: TPatchEvent; PatchPositionFrame: PPatchEvent = nil; procedure PatchCreate; var ov: cardinal; begin // hook TForm: PatchPositionForm := PPatchEvent(@THookedForm.DoCreate); OriginalForm := PatchPositionForm^; PatchForm.Jump := $E9; // Jmp opcode PatchForm.Offset := PtrInt(@THookedForm.HookedDoCreate)-PtrInt(PatchPositionForm)-5; if not VirtualProtect(PatchPositionForm, 5, PAGE_EXECUTE_READWRITE, @ov) then RaiseLastOSError; PatchPositionForm^ := PatchForm; // enable Hook // hook TFrame: PatchPositionFrame := PPatchEvent(@TCustomFrame.Create); OriginalFrame := PatchPositionFrame^; PatchFrame.Jump := $E9; // Jmp opcode PatchFrame.Offset := PtrInt(@THookedFrame.Create)-PtrInt(PatchPositionFrame)-5; if not VirtualProtect(PatchPositionFrame, 5, PAGE_EXECUTE_READWRITE, @ov) then RaiseLastOSError; PatchPositionFrame^ := PatchFrame; // enable Hook end; { THookedForm } procedure THookedForm.HookedDoCreate; var i: integer; begin // enumerate all labels, then set Transparent := true for i := 0 to Components.Count-1 do if Components[i] is TLabel then TLabel(Components[i]).Transparent := true; DoCreate; // call initial code end; { THookedFrame } constructor THookedFrame.Create(AOwner: TComponent); var i: integer; begin // enumerate all labels, then set Transparent := true for i := 0 to Components.Count-1 do if Components[i] is TLabel then TLabel(Components[i]).Transparent := true; inherited Create(AOwner); // call normal constructor end; .... initialization PatchCreate; Wenn ich dass doch rrichtig verstehe, wird ganz normal an den Anfang der zu patchenden Methode der rel-jump in die eigene gesetzt. Das überschreibt für gewönlich den Prolog einer routine. Also wie soll das funktionieren, dass er bei sich einfach DoCreate aufruft, und damit den ursprünglichen code aufruft? Eigentlich müsste dass doch nun wieder in seiner methode landen? EDIT: also zumindest die implementierung von TCustomForm.DOCreate sollte nicht mehr nutzbar sein, oder? Grüße Memnarch |
AW: Brauche verständnishilfe für folgenden Detourcode
Im "HookedDoCreate" müsste meiner Meinung nach zumindest vor dem Aufruf von DoCreate den ursprünglichen Zustand wiederherstellen und danach wieder den Patch anwenden.
Sonst wird das eine endlose Rekursion in der sich HookedDoCreate immer wieder selbst aufruft. Der Aufruf "inherited Create" ist dagegen zulässig. |
AW: Brauche verständnishilfe für folgenden Detourcode
Wenn du ein nachweislich funktionierendes Beispiel suchst: die TPngImageList in den
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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