Die einfachste Methode is meiner Neinung nach einen Denkanstos werfe ich einfach einen Hook in den Raum.
Vorraussetzung: Ich kenne den Namen der EXE in die Injiziert werden soll.
Verfahren:
1. Einen Messagehook aufsetzen:
Code:
Irgendwas := SetWindowsHookEx(WH_GETMESSAGE, @MsgHook, hInstance, 0);
2.1 Im Hook selbst wird bereits gemacht
Code:
function MsgHook(Code: Longint; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
if (extractexename(getcommandline)='MEINEXENAME.EXE') then
begin
:
code hier
:
end;
Result := CallNextHookEx(msghookc, Code, wParam, lParam);
2.2 Im Hook wird der zu injizierende Code nachgeladen.
Code:
function MsgHook(Code: Longint; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
if ((extractexename(getcommandline)='MEINEXENAME.EXE')) and (pruefung=false) then
begin
hinstance := Loadlibrary ('INJIZIERTE.DLL');
end;
Result := CallNextHookEx(msghookc, Code, wParam, lParam);
Als Schmankerl stelle ich dann noch folgende Procdeduren zur Verfügung.
Code:
Procedure WriteSecureBuffer(Addr: DWord; Data: Pointer; Len: Word);
Var
Written: DWord;
ToPos : Pointer;
begin
ToPos:= Pointer(Addr);
WriteProcessMemory(GetCurrentProcess, ToPos, Data, Len, Written);
end;
procedure MakeJump(ZielAddr, JumpAddr, NOPS: DWord);
Var
Buffer : Array[1..5] of Byte;
Data : DWord;
X : Byte;
begin
Data:= ZielAddr - (JumpAddr + 5);
Move(Data, Buffer[2], 4);
Buffer[1]:= $E9;
WriteSecureBuffer(JumpAddr, @Buffer, 5);
For X:= 1 to NOPS do WriteSecureByte(JumpAddr + 4 + X, $90);
end;
Gruß
Martin