Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 18
aeff Va camino a la fama
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!
Responder Con Cita
  #2  
Antiguo 25-10-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 25-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 18
aeff Va camino a la fama
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
Responder Con Cita
  #4  
Antiguo 25-10-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 26-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 18
aeff Va camino a la fama
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!

Última edición por aeff fecha: 26-10-2007 a las 22:24:27.
Responder Con Cita
  #6  
Antiguo 27-10-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por aeff Ver Mensaje

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 Ver Mensaje
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í ??
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #7  
Antiguo 27-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 18
aeff Va camino a la fama
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!
Responder Con Cita
  #8  
Antiguo 27-10-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por aeff Ver Mensaje
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.....
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #9  
Antiguo 27-10-2007
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Poder: 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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ataques de inyección de sql hogol SQL 5 17-10-2011 23:00:37
Inyeccion de sql richy08 PHP 0 19-10-2007 01:08:41
Inyección de cabeceras en función mail() kayetano PHP 4 02-01-2007 20:48:28
evitar inyeccion de html reevil PHP 2 21-12-2006 03:26:08
[Alerta] Inyección SQL remota en MySQL 4 y 5 vtdeleon Noticias 0 04-06-2006 20:31:17


La franja horaria es GMT +2. Ahora son las 01:19:41.


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
Copyright 1996-2007 Club Delphi