Os pongo un ejemplo de como:......
Este como lanza el notepad e inyecta el contenido de la función main en él...
y esta función lo que hace es leer la cola de mensajes....
A partir de aquí la imaginación es libre....
Código Delphi
[-]
program Inyector_Proceso;
{$IMAGEBASE $13140000}
uses
Windows,SysUtils,Messages;
const
CM_MANDA_TECLA = WM_USER + $1000;
CM_MANDA_SHOW = WM_USER + $1001;
function Main(dwEntryPoint: Pointer): longword; stdcall;
Var Zeta : String;
Msg : TMsg;
Procedure M_Tecla;
Begin
MessageBox(0, 'Esto Funciona de Maravilla, MARAVILLOSAMENTE', 'M_Tecla', 0);
End;
Procedure M_Show;
Begin
Zeta := 'Esto Form ha sido llamado mediante el envio de un mensaje y cerramos el proceso';
MessageBox(0, PChar(Zeta), 'M_Show', 0);
End;
begin
while GetMessage(Msg,0,0,0) do
begin
Case MSg.message Of
CM_MANDA_SHOW:
M_Show;
CM_MANDA_TECLA:
Begin
M_Tecla;
ExitProcess(0);
End;
End; End; ExitProcess(0);
Result := 0;
end;
procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
Sleep(2000);
MessageBox(0, 'Mando Mensaje CM_MANDA_SHOW', 'Inject', 0);
PostThreadMessage(TID,CM_MANDA_SHOW,0,0);
Sleep(5000);
PostThreadMessage(TID,CM_MANDA_TECLA,0,0);
end;
var
ProcessHandle, PID: longword;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
Sleep(500);
GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
end.