Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Formas de inyección de procesos (https://www.clubdelphi.com/foros/showthread.php?t=49634)

aeff 25-10-2007 19:55:00

Formas de inyección de procesos
 
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í 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:

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;

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

Cita:

Empezado por aeff (Mensaje 241553)

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..

Cita:

Empezado por aeff (Mensaje 241553)
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

Cita:

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

Cita:

Empezado por aeff (Mensaje 241696)
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":
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?


La franja horaria es GMT +2. Ahora son las 01:26:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi