Thema: Delphi MessageBox ersetzen

Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 

Re: MessageBox ersetzen

  Alt 4. Jul 2006, 11:58
nach "etwas" rumprobieren hab ichs hinbekommen die MessageBox zu ersetzen.
Dazu hab ich folgende Funktion geschrieben (die Funktion "ersetzt" die ursprungsfunktion):
Delphi-Quellcode:
function ReplaceFunktion(AOldFunction, ANewFunction: Pointer): Boolean;
var lProcess,
    lWritten : Cardinal;
    lBuffer : Array[0..(1 + 4 + 1)-1] of Byte;
begin
  lProcess := OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION, True, GetCurrentProcessId);
  if (lProcess <> 0) then
  begin
    PByte(@lBuffer)^ := $68;
    PPointer(@lBuffer[1])^ := ANewFunction;
    PByte(@lBuffer[5])^ := $C3;
    if WriteProcessMemory(lProcess, AOldFunction, @lBuffer, SizeOf(lBuffer), lWritten) then
      result := lWritten = SizeOf(lBuffer)
    else
      result := False;
  end
  else
    result := False;
end;
Die Alte Funktion und die neue Funktion müssen zu 100 Identisch sein.
Für dein Beispiel würde der Aufruf wie folgt aussehen (MessageBoxB ist meine neue Funktion):
Delphi-Quellcode:
//Messagebox-Ausgaben in Applicationtitle ausgaben
function MessageBoxB(AHandle: HWND; AMsg, ATitle: PChar; uType: Cardinal): Integer; stdcall;
begin
  Application.Title := String(AMsg);
end;

[...]
begin
  ReplaceFunktion(@MessageBox, @MessageBoxB);
  //Und siehe da, der Fehler wird nicht mehr als herkömliche Messagebox angezeigt
  StrToInt('abc');
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat