Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Ist im Prozedurzeiger eine Klasse drin?

  Alt 4. Feb 2011, 14:37
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
$2B or not $2B
  Mit Zitat antworten Zitat