Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicher überwachen (https://www.delphipraxis.net/143931-speicher-ueberwachen.html)

Neutral General 26. Nov 2009 09:14


Speicher überwachen
 
Hi,

Gibt es eine Möglichkeit einen bestimmten Speicherbereich zu überwachen und dann auf Änderungen reagieren zu können?

Gruß
Neutral General

himitsu 26. Nov 2009 09:51

Re: Speicher überwachen
 
- diesen Speicherbereich schützen
- auf Exception warten
- diese abfrangen und Speicher entschützen aka Zugriff gewähren
- prüfen ob sich was geändert hat

oder pollen und regelmäßig schauen ob sich was geändert hat

oder einen Emulator schreiben ... dann bekommst'e sowas auch mit :roll:

Neutral General 26. Nov 2009 12:16

Re: Speicher überwachen
 
Polling wäre in meinem Fall zu unzuverlässig...

Wie bekomme ich denn mit wenn in so einem Fall, wie du ihn zuerst beschrieben hast, eine Exception geworfen wird?

Luckie 26. Nov 2009 13:11

Re: Speicher überwachen
 
Und wieder fehlt die entscheidende Information: Ist es ein eigener Prozess oder ein fremder?

Neutral General 26. Nov 2009 13:16

Re: Speicher überwachen
 
Es ist ein eigener Prozess.

Also ich habe gerade mal etwas rumprobiert und war auch theoretisch recht erfolgreich:

Delphi-Quellcode:
TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    n: Integer;
  end;

implementation

function GetExceptionStackInfoProc(P: PExceptionRecord): Pointer;
begin
  PInteger(p^.ExceptObject)^ := 20;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Exception.GetExceptionStackInfoProc := GetExceptionStackInfoProc;
end;

procedure TForm1.Button1Click(Sender: TObject);
var op: Cardinal;
begin
  n := 10;
  VirtualProtect(@a,4,PAGE_EXECUTE_READWRITE or PAGE_GUARD,op);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Caption := IntToStr(n); // n = 20, falls vorher auf Button1 geklickt wurde
end;
Generell ist das also super. Allerdings scheint es dieses Exception.GetExceptionStackInfoProc-Feature erst in neueren Delphi Versionen zu geben. Wäre ganz gut wenn das auch in älteren ginge.

Gruß
Neutral General

Apollonius 26. Nov 2009 17:32

Re: Speicher überwachen
 
Kannst du eine bestimmte Windows-Version voraussetzen? Wenn du mindests XP hast, kannst Vectored Exception Handling verwenden.

brechi 26. Nov 2009 18:42

Re: Speicher überwachen
 
Delphi-Quellcode:
var
  RtlDispatchExceptionNext: function(excRec: PExceptionRecord; excCtxt:
    PContext): integer; stdcall = nil;

function RtlDispatchExceptionCallback(excRec: PExceptionRecord; excCtxt:
  PContext): integer; stdcall;
begin
  result := RtlDispatchExceptionNext(excRec, excCtxt);
  // Exception Handling
end;

procedure InstallExcDispatchHook;
var
  c1, c2: dword;
begin
  c1 := dword(GetProcAddress(GetModuleHandle('ntdll.dll'),
    'KiUserExceptionDispatcher'));
  if Byte(pointer(c1)^) = $FC then
    inc(c1);
  if (dword(pointer(c1)^) = $04244C8B) and // mov ecx, [esp+4] ; PContext
  (dword(pointer(c1 + 4)^) and $00FFFFFF = $241C8B) and
    // mov ebx, [esp+0] ; PExceptionRecord
  (byte(pointer(c1 + 7)^) = $51) and // push ecx
  (byte(pointer(c1 + 8)^) = $53) and // push ebx
  (byte(pointer(c1 + 9)^) = $E8) and // call RtlDispatchException
  VirtualProtect(pointer(c1 + 10), 4, PAGE_EXECUTE_READWRITE, c2) then
  begin
    RtlDispatchExceptionNext := pointer(c1 + 14 + dword(pointer(c1 + 10)^));
    dword(pointer(c1 + 10)^) := dword(@RtlDispatchExceptionCallback) - c1 - 14;
    VirtualProtect(pointer(c1 + 10), 4, c2, c2);
  end;
end;
Sollte ab Windows2k funktionieren.

ReadProcessMemory verursacht übrigens keine Exception. Und mit VirtualProtectEx wirst du nichts mitbekommen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz