Ver Mensaje Individual
  #9  
Antiguo 27-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Reputación: 18
aeff Va camino a la fama
mira aqui el código del que te hablé usando un programa con "interfáz gráfica":
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
CM_MANDA_TECLA  = WM_USER + $1000;
CM_MANDA_SHOW   = WM_USER + $1001;


implementation

{$R *.DFM}

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;
var
x: integer;
begin


  //si en vez de ExitThread, ponemos ExitProcess, no solo nos descargaria el archivo
  //si no que también terminaría el proceso en el que estamos inyectados
    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; //Case
    End; //While


//  ExitThread(0);
  ExitProcess(0);

  Result := 0;
  //PostThreadMessage
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(3000);
  PostThreadMessage(TID,CM_MANDA_TECLA,0,0);
end;


procedure TForm1.Button1Click(Sender: TObject);
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;

end.

al pulsar el único botón que situo en el formulario para inyectar el proceso no lo logra,
¿por que?, he probado hacer miles de modificaciones pero no doy con la correcta para esto

¿sabes algo de lo que hablo compadre?
Responder Con Cita