Netter Trick mit TCallDispatcher. Nur solltest du noch sicherstellen, das der Speicherbereich auch ausführbar ist. Ein VirtualProtect wäre also angebracht.
Delphi-Quellcode:
procedure InitDispatcher(var Dispatcher: TCallDispatcher; Self, Method: Pointer);
var
OldProtect: Cardinal;
AlignedAddress: Cardinal;
begin
Dispatcher.POP_EAX := $58;
Dispatcher.PUSH_CONST := $68;
Dispatcher.Self := Self;
Dispatcher.PUSH_EAX := $50;
Dispatcher.JMP_RELATIVE := $E9;
Dispatcher.Offset := PChar(Method) - PChar(@Dispatcher) - SizeOf(Dispatcher);
if IsBadCodePtr(@Dispatcher) then
begin
// @Dispatcher auf Speicher-Seite ausrichten (4 KB)
AlignedAddress := Cardinal(@Dispatcher) and $FFFFF000;
VirtualProtect(Pointer(AlignedAddress), 4096, PAGE_EXECUTE_READWRITE, OldProtect);
end;
end;