Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi MsgBox Injection (https://www.delphipraxis.net/108259-msgbox-injection.html)

sk0r 10. Feb 2008 08:30


MsgBox Injection
 
Hallo,

ich versuche einen MessageBox Code in eine fremde Anwendung zu injizieren.
Leider erscheint einfach keine MessageBox. Der Code ansich scheint aber
zu funktionieren..

Delphi-Quellcode:
function InjectMsgbox(dwTargetProc: Cardinal; lpMessage, lpTitle: PChar; mbIcon: Cardinal):LongBool;
type
  PRemMsg = ^TRemMsg;
  TRemMsg = packed record
    bPushOp1: Byte;
    dwHandleAddr: DWord;
    bPushOp2: Byte;
    dwCaptionAddr: DWord;
    bPushOp3: Byte;
    dwTitleAddr: DWord;
    bPushOp4: Byte;
    dwIconAddr: DWord;
    bCallOp: Byte;
    dwMBAAddr: DWord;
    bRetn: Byte;
    dwHandle: HWND;
    lpCaption: array[0..250-1] of Char;
    lpTitle: array[0..250-1] of Char;
    bIcon: DWord;
  end;
var
  gRemMsg: TRemMsg;
  hProc: Cardinal;
  pAlloc: Pointer;
  dwBytesWritten: Cardinal;
  remThreadID: Cardinal;
begin
  result := false;

  SetLastError(ERROR_SUCCESS);

  hProc := OpenProcess(PROCESS_ALL_ACCESS, not true, dwTargetProc);
  if hProc <> 0 then
  begin
    pAlloc := VirtualAllocEx(hProc, nil, sizeof(TRemMsg), MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if pAlloc <> nil then
    begin

      gRemMsg.bPushOp1 := $68;
      gRemMsg.dwHandleAddr := Cardinal(pAlloc) + 26;
      gRemMsg.bPushOp2 := $68;
      gRemMsg.dwCaptionAddr := Cardinal(pAlloc) + 30;
      gRemMsg.bPushOp3 := $68;
      gRemMsg.dwTitleAddr := Cardinal(pAlloc) + 280;
      gRemMsg.bPushOp4 := $68;
      gRemMsg.dwIconAddr := Cardinal(pAlloc) + 530;
      gRemMsg.bCallOp := $E8;
      gRemMsg.dwMBAAddr := Cardinal(GetProcAddress(GetModuleHandle('user32.dll'), 'MessageBoxA')) - Cardinal(pAlloc) - 25;
      gRemMsg.bRetn := $C2;
      gRemMsg.dwHandle := 0;
      lstrcpy(gRemMsg.lpCaption, lpMessage);
      lstrcpy(gRemMsg.lpTitle, lpTitle);
      gRemMsg.bIcon := mbIcon;

      if WriteProcessMemory(hProc, pAlloc, @gRemMsg, sizeof(TRemMsg), dwBytesWritten) = true then
      begin
        CreateRemoteThread(hProc, nil, 0, pAlloc, nil, 0, remThreadID);

        if GetLastError = ERROR_SUCCESS then result := true;
      end;
    end;
  end;
end;

begin
  InjectMsgBox(dwDieProcessID, 'Hallo', 'Test', 0);
end;
Weiß jemand, wo der Fehler liegt?

Danke im Vorraus für Hilfe!

MfG: sk0r

SirThornberry 10. Feb 2008 08:38

Re: MsgBox Injection
 
scheint zu funktionieren? bist du mal durchgesteppt (mit Haltepunkten etc.)? und hast du mal den rückgabewert gecheckt?

FAlter 10. Feb 2008 09:33

Re: MsgBox Injection
 
Hi,

ich weiß nicht genau, was du willst, aber wenn du eine MessageBox anzeigen willst und es nur so aussehen soll, als stamme sie von einer anderen Anwendung, kannst du doch einfach das fremde Fenster-Handle als ersten Parameter angeben. Dann verhält sich die MessageBox eben so, als käme sie von dem anderen Programm.

Mfg
FAlter


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr.

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