Hola escafandra
Gracias por tu respuesta. La DLL que quiero inyectar es esta:
Código:
library Sumar;
{$APPTYPE CONSOLE}
uses
SysUtils,Windows;
Var
i: Integer;
Cuenta: String;
begin
{ TODO -oUser -cConsole Main : Insert code here }
Cuenta := '';
For i:=0 To 10 Do
Begin
Cuenta := Cuenta + IntToStr(i);
End;
MessageBox(0,PAnsiChar(Cuenta),'Cuenta',64);
end.
Llevo tiempo leyendo tutoriales, tanto los que mencionas como otros, pero no tengo muy claro el funcionamiento.
Ahora mismo estoy trabajando con este codigo, que me funciona en Windows XP:
Código:
procedure InjectDll(PID: dword; DLL: pChar);
var
BytesWritten, hProcess, hThread, TID: Cardinal;
Parameters: pointer;
pThreadStartRoutine: Pointer;
begin
// Abrimos el proceso
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
// Creamos espacio en el proceso
Parameters := VirtualAllocEx( hProcess, nil, Length(DLL)+1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
// Escribimos en el proceso la ruta de nuestra DLL
WriteProcessMemory(hProcess,Parameters,Pointer(DLL ),Length(DLL)+1,BytesWritten);
// Obtenemos la direccion de LoadLibrary con GetProcAddress
pThreadStartRoutine := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA');
// Creamos un Thread en el proceso remoto que ejecute nuestra dll
hThread := CreateRemoteThread(hProcess, nil, 0, pThreadStartRoutine, Parameters, 0, TID);
// Cerramos el hProcess abierto
CloseHandle(hProcess);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InjectDll(Aqui pongo el PID del notepad o de la calculadora,PAnsiChar('C:\Sumar.dll'));
end;
He probado este codigo tanto con el PID de un notepad y con el de la calculadora y con los dos me ha funcionado.
Tengo unas dudas, ¿porque obtenemos la dirección de LoadLibrary?
He leido el algun tutorial, pero no se porque motivo es, que este codigo no funciona en Sistemas Operativos de 64 bits. ¿Por que razon no funciona? Yo no le podido probar en sistemas operativos de 64 bits porque no tengo.
Muchisimas gracias de antemano.
Saludos