PDA

Ver la Versión Completa : Formas de inyección de procesos


aeff
25-10-2007, 19:55:00
saludos, bueno, he podido ver en algunos posts como explican la llamada "inyeccion de procesos" ¿no?, bueno, he podido entender las que se hacen usando DLLs, ahora, *seoane* me hablaba hace un tiempo de que existen otras formas de hacerlo,

¿alguien me puede explicar otras formas de inyectar un proceso?

muchas garcias de antemano,

saludos!
aeff!

ArdiIIa
25-10-2007, 20:39:19
Puedes echar un vistazo al código que puse aquí (http://www.clubdelphi.com/foros/showthread.php?t=39112&highlight=inyectar) si no lo viste ya.
Sin DLL ni nada de nada.
Las explicaciones, ya sabes... Al amigo seoane... que es el maestro. :D:D

aeff
25-10-2007, 21:28:22
genial Ardilla, ese método está super bello, me gustó a mi también, solo que no lo entiendo al 100%, quisiera que me dieras o seoane una explicación de como es que funciona esto, es decir, que se logra con cada linea de y el ¿por que?,

muchas gracias colegas,

saludos!

aeff

ArdiIIa
25-10-2007, 21:42:35
Creo que el hilo, mas o menos explica el como y el porque... ahora es cuestión de aplicarlo, creo que mas explicaciones es abundar sobre algo que ya está "documentado".
Experimenta y plantea dudas puntuales.

aeff
26-10-2007, 22:14:35
saludos compañero ArdiLLa, mira colega, aún me corren dudas por la cabeza,

este es tu código:


program Inyector_Proceso;

{$IMAGEBASE $13140000}

uses
Windows,
SysUtils,
Messages;

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

var
ctn: pChar;

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
//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;

var
ProcessHandle, PID: longword;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin

CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);

Sleep(500);

GetMem(ctn, 200);

GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);


end.


ahora, pienso que lo que haces es inyectar un proceso dentro del proceso que creas al abrir el notepad ¿no?, es decir, reservas un lugar dentro de este proceso Notepad y colocas la funcion Main dentro de este ¿no?,

ahora, esa funcion solo se activa si se le manda un mensaje a su "hilo",

mi siguiente quiestion es:

¿si yo inyecto esta funcion Main dentro del Proceso TaskMgr.exe que yo cree puedo eliminar/obtener información de los Items de SysListView que muestra los procesos?

muchas gracias de antemano,

saludos!

ArdiIIa
27-10-2007, 08:21:57
ahora, pienso que lo que haces es inyectar un proceso dentro del proceso que creas al abrir el notepad ¿no?, es decir, reservas un lugar dentro de este proceso Notepad y colocas la funcion Main dentro de este ¿no?,

ahora, esa funcion solo se activa si se le manda un mensaje a su "hilo",



Correcto..


mi siguiente quiestion es:

¿si yo inyecto esta funcion Main dentro del Proceso TaskMgr.exe que yo cree puedo eliminar/obtener información de los Items de SysListView que muestra los procesos?

muchas gracias de antemano,

saludos!

Eso es harina de otro costal. En ese mismo hilo y en otros, ya se habla algo del taskmgr, y probablemente no sea tan sencillo esa cuestión de meterle mano.

Ahora bien, para que obtener informarción del taskmgr, si tienes funciones que te proveen de esa información...

Eliminar información del Taskmgr, para que hacerlo si puedes inyectar un proceso en otro... Seguramente que existen técnicas de ocultación de procesos, mas versátiles que tratar de interceptar al taskmgr.


Supongo que tu pregunta iba por ahí ??

aeff
27-10-2007, 15:37:08
Supongo que tu pregunta iba por ahí ??


seguro que si, por ahi mismo va mi pregunta, solo que quiero lograr hacer esto desde un .EXE solamente, sin DLL, pero con un programa que no sea en Consola,

porque tus cógido funcionan perfectamente en un Porgrama hecho para Consola, pero cuano lo pruebo/modifico para un programa con ventana etc... es decir, un programa con ambiente gráfico no funciona nada,

¿por que compadre?, ¿como logro esto usando básicamente tu código?

gracias de antemano,

saludos!

ArdiIIa
27-10-2007, 18:36:11
porque tus cógido funcionan perfectamente en un Porgrama hecho para Consola, pero cuano lo pruebo/modifico para un programa con ventana etc... es decir, un programa con ambiente gráfico no funciona nada,

¿por que compadre?, ¿como logro esto usando básicamente tu código?


Bueno, siento discrepar, pero la inyección funciona de cualquier modo.
Otra cosa es que te refieras a que quieres introducir un medio ejecutable con sus ventanas y todo dentro de un proceso. Para eso tendrías que estar jugando con manejadores de ventana, etc, etc, etc.....

aeff
27-10-2007, 19:25:25
mira aqui el código del que te hablé usando un programa con "interfáz gráfica":

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?