Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.291 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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat