Delphi-Quellcode:
unit Unit1;
interface
uses
classes;
type
TMyClass =
class
strict private
procedure BuggyMethod;
end;
TMyClassHack =
class helper
for TMyClass
public
function GetBuggyMethodAddress: Pointer;
end;
procedure Test;
implementation
uses
SysUtils;
{ TmyClassHack }
function TMyClassHack.GetBuggyMethodAddress: Pointer;
asm
lea eax, [0+TMyClass.BuggyMethod]
end;
{ TMyClass }
procedure TMyClass.BuggyMethod;
begin
writeln('
hello');
end;
procedure Test;
var
Obj: TMyClass;
Addr: Pointer;
begin
Obj := TMyClass.Create;
writeln(format('
%p',[Obj.GetBuggyMethodAddress]));
Addr := Obj.GetBuggyMethodAddress;
asm
call Addr
end;
Obj.Free;
end;
end.
Das funktioniert bei mir. Ich weiß allerdings nicht genau was du damit meinst:
Zitat:
Eine "Hack"/"Dummy"-Klasse kommt in diesem Fall nicht in Frage, da der Code für mehrere Versionen der Klasse arbeiten soll.
Jawoll
. Das Zusammenspiel aus Classhelper und Zugriff via Assembler macht es Möglich.
Mit Hack-Klasse meinte ich eine Klasse, die exakt gleich deklariert ist, aber die entsprechende Methode als public deklariert. Somit liegt im Speicher alles an der gleichen Stelle und der Zugriff ist auch Möglich.
Grüße,
Win32.API