Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.199 Beiträge
 
Delphi 12 Athens
 
#4

Re: Procedure umbiegen

  Alt 25. Jan 2009, 21:49
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat