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;