Das geht aber nur, da der Speicher der Application-Instanz zufällig hinter dem Programmcode und der Speicher für die zu testende Instanz zufällig hinter der Application.Instanz im "
RAM" liegt ... davor ist aber auch noch genug Platz.
Hab jetzt erstmal das hinbekommen.
(Zum Glück sollte es sich bei mir immer um gültige Klassenzeiger oder Objektinstanzen handeln.)
Delphi-Quellcode:
var
P, P2: Pointer;
C: LongWord;
X: array[1..vmtCreateObject - vmtSelfPtr] of Byte;
Proc: procedure of object;
// IsClass(TTest)
P := PAnsiChar(TMethod(Proc).Data) + vmtSelfPtr;
if (ReadProcessMemory(GetCurrentProcess, P, @X, SizeOf(X), C))
and (C = SizeOf(X)) and (PPointer(P)^ = TMethod(Proc).Data)
and (TClass(TMethod(Proc).Data).InheritsFrom(TTest)) then
Beep;
// IsObject(TTest)
P := TMethod(Proc).Data;
if ReadProcessMemory(GetCurrentProcess, P, @X, SizeOf(Pointer), C) and (C = SizeOf(Pointer)) then begin
P2 := PPointer(P)^;
P := PAnsiChar(P2) + vmtSelfPtr;
if ReadProcessMemory(GetCurrentProcess, P, @X, SizeOf(X), C)
and (C = SizeOf(X)) and (PPointer(P)^ = P2)
and (TObject(TMethod(Proc).Data) is TTest) then
Beep;
end;
//ReadProcessMemory als Ersatz für IsBadReadPtr