Delphi-Quellcode:
Var OldMSG: Function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; StdCall;
Function NewMSG(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; StdCall;
Var S: AnsiString;
Begin
S := 'Test: ' + lpCaption;
Result := OldMSG(hWnd, lpText, PAnsiChar(S), uType);
End;
Procedure TForm1.FormCreate(Sender: TObject);
Var pMSG: PAnsiChar;
dwOldProtect, dw: DWORD;
JumpRec: packed Record
mov: Byte;
addr: Pointer;
jmp: Word;
End;
Begin
pMsg := @MessageBoxA;
OldMSG := PPointer(PPointer(pMsg + 2)^)^;
JumpRec.mov := $B8;
JumpRec.addr := @NewMSG;
JumpRec.jmp := $E0FF;
VirtualProtect(pMsg, SizeOf(JumpRec), PAGE_EXECUTE_READWRITE, dwOldProtect);
WriteProcessMemory(OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessID),
pMsg, @JumpRec, SizeOf(JumpRec), dw);
VirtualProtect(pMsg, SizeOf(JumpRec), dwOldProtect, dw);
MessageBoxA(0, 'der Text', 'Die Caption', MB_OK);
End;
die genaue Definition für FarJump fiel mir grad nicht ein, aber so geht's auch
jupp, $E9 = NearJump ... man könnte da natürlich auch (in gewissen Grenzen) die Differenz berechnen und doch per $E9 springen
[add]
PS:
Delphi-Quellcode:
dw := Integer(@DOIT);
Cardinal(Pointer(Integer(Buffer)+1)^) := dw;
// entspricht:
PPointer(Integer(Buffer)+1)^ := @DOIT;
warum einfach, wenn's auch kompliziert geht
außerdem lag die (erste) Adresse bei +2 und nicht +1