Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: c3r0x en 5 Agosto 2007, 02:59 am



Título: dll inject by c3r0x..
Publicado por: c3r0x en 5 Agosto 2007, 02:59 am
Bueno me encontrada en mi pc sin nd q hacer y de mis anteriores code encontre uno dll inj q lo aplique a una tool q habia codeado (era especia de consola  de comandos programada por mi) al caso q decidi sacar parte del codigo y pegarlo..


Editado: pongo un screen

(http://img295.imageshack.us/img295/1209/injdt3.jpg)


InjDLL.c
Código:
/*
Name: InjDll
Autor:c3r0x

*/

#include <windows.h>
#include <Tlhelp32.h>
#include <string.h>
#include <stdio.h>

#define PID 10     //definimos PID cone l valor 10

     
int Procesos ()  //funcion muestra procesos
{
    HANDLE cap;
    PROCESSENTRY32 p;
    int i;
    int pid;
    int l=1;
   
    printf("[+] Cargando Procesos..\n");
    cap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //obtenemos una captura de los procesos (cap)
    Process32First(cap,&p); //guardamos el primero proceso
    printf(" 1 proceso - %s", p.szExeFile); //lo printeamos
    do //bucle para ir recorriendo proceso a proceso
    {   
      printf ("%i proceso - %s\n ", l,p.szExeFile);
      l++;
     
       
    }while( Process32Next(cap,&p)); //terminamos hasta llegar al ultimo
   CloseHandle(cap); //cerramos el handle
   return 0; //retornamos a 0
   
}

int Buscap(char *proc)  //funcion q busca pid segun sus parametros introducidos
{
    PROCESSENTRY32 p;
    HANDLE cap;
    int pid = 0;
   
    cap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    Process32First(cap,&p); //nuestro primer proceso
    //bucle comparamos proceso a proceso y guardamos su pid en "pid"
   
       do
    {   
       if( strcmp(proc,p.szExeFile)==0)
        {
            pid = p.th32ProcessID;       
        }
    }   
    while( Process32Next(cap,&p)); //no abra q decirlo
    CloseHandle(cap); //igual mente
    return pid;
   
     }
   
int Injectar(char dll[]) //funcion q inyectar
{
    //declaramos
    HANDLE cap;
    HANDLE proc1;
    HANDLE hThread;
    PROCESSENTRY32 p;
    DWORD pid ;
    char pid2[PID];
    int i;
    HMODULE hKernel;
    LPVOID loadl;
    PVOID amem;
   
       
    int dll2 = strlen(dll) + 1;  //sacamos los bytes de la dll y lo guardamos en dll2
    printf("Introduce el Pid: ");
    gets(pid2); //guardamos entrada del teclado
    pid = (DWORD)atoi(pid2); // lo pasamos como int y lo convertimos a DWORD guardandolo en pid

     
    if((proc1=OpenProcess(PROCESS_ALL_ACCESS, false, pid))== NULL) //abrimos el proceso, si no..
    {
      printf("Error: No se Pudo Abrir el Proceso o no Existe!\n");
  return 1;
    }
   
     //abrimos el proceso
    if((hKernel=GetModuleHandle("kernel32.dll"))== NULL) //obtenemos el handle de la libreria si no..
    {
      printf("Error: No se Pudo Allar el Handle");
      return 1;
    }
   
     
    if((loadl = (LPVOID)GetProcAddress(hKernel, "LoadLibraryA"))== NULL) //obtenemos la dir de la funcion LoadLibraryA en el kernel32.dll
    {
      printf("Error: No se Pudo Obtener la Direccion de LoadLibraryA ");
      return 1;
    }
   
     //reservamos memoria  de la dll  en el proceso remoto
   
    if((amem = (LPVOID)VirtualAllocEx(proc1,NULL, dll2, MEM_COMMIT,PAGE_READWRITE))== NULL)
    {
      printf("Error: No se Pudo Reservar Memoria en el Proceso");
      return 1;
    }                                       
   
    //escribimos en memoria ( donde reservamos)
    WriteProcessMemory(proc1,(LPVOID)amem,dll,dll2,NULL);
    //ejecutamos donde habiamos escrito en memoria
    hThread=CreateRemoteThread(proc1,NULL,0,(LPTHREAD_START_ROUTINE)loadl,(LPVOID) amem,0,NULL);
    CloseHandle(proc1);
    return 0;
}
   


int main (int argc, char** argv)
 {
         
         int pid;
       
   
   
    if(argc < 2) //si los argumentos son mayores a 2
{
      printf("\n--------InjDll by c3r0x---------\n");
      printf("InjDll -p Listar Procesos \n");
      printf("InjDll -pid <proceso> Buscar Pid");
          printf("InjDll -inj <dll> Dll\n\n");
          printf("Ejemplo: InjDll -i  midll.dll\n");
          printf("Ejemplo: IndDll -pid explorer.exe\n");
         
return 0;

}
     if(!strcmp(argv[1],"-p")) //si comparamos y es iguao (-p) entonces
     {
        Procesos();
        return 0;
     }
          if(!strcmp(argv[1],"-pid"))
     {
        pid= (DWORD)Buscap(argv[2]);
     
                 if( pid<9999)
     {
         
        printf("[+]Proceso = %s  \n",argv[2]);
         
        printf("[+]PID = %d\n",pid);
       
     }
        return 0;
     }
     
         if(!strcmp(argv[1],"-i"))
     {
        printf("\n--------InjDll by c3r0x---------\n");
        printf("[+]Procesando informacion...\n");
        printf("Dll a Inyectar =  %s\n\n",argv[2]);
        Injectar(argv[2]);
       
        return 0;
     }

       
     
       
       
        return 0;
     }

libreria mi dll.c

Código:
#include <windows.h>



BOOL APIENTRY DllMain (HINSTANCE hmodule,     //hmodule recibe la direccion base donde esta cargada la dll
                       DWORD reason,          //bueno la reason para eso usamos swtich para poner en alguna de las 4
                       LPVOID reserved    )  //
{
    switch (reason)  //la razon son 4 vamos una a una
    {     
      case DLL_PROCESS_ATTACH: //se llama cuando la dll esta cargada en el proceso
             MessageBoxA(NULL, "Pasa viejo toche", "Pasa viejo toche", MB_OK); //cuando estemos cargados ejecutamos MessageBox depliega mensaje
        break;

      case DLL_PROCESS_DETACH: // lo contrario  a lo de arriba ( no importante)
        break;

      case DLL_THREAD_ATTACH:  //su nombre lo dice cuando estamos cargado (dll) y se alla creado un thread ejecutamos lo q pongamos
        break;

      case DLL_THREAD_DETACH: //lo contrario de arriba ( no importante)
        break;
    }
    return TRUE;
}

luego pongo la tool completa, ya q la estoy actualizando con el code inject es un poco mas compleja

No es nd pero espero q les sirva ;)

salu2


Título: Re: dll inject by c3r0x..
Publicado por: MazarD en 5 Agosto 2007, 17:42 pm
Inyectando con createremotethread es tan típico que lo detectan casi todos los firewalls y antivirus, pero de todos modos felicidades por el código está completo ahí mostrando su lista de procesos, el menú bonito y tal.

Saludos.


Título: Re: dll inject by c3r0x..
Publicado por: Stakewinner00 en 1 Julio 2012, 23:08 pm
intentando compilakr me sale

dllinject.c: In function `Injectar':
dllinject.c:83: `false' undeclared (first use in this function)
dllinject.c:83: (Each undeclared identifier is reported only once
dllinject.c:83: for each function it appears in.)


Título: Re: dll inject by c3r0x..
Publicado por: Anvil en 2 Julio 2012, 01:07 am
No sé mucho de esto pero ¿para que sirve la inyección dll?


Título: Re: dll inject by c3r0x..
Publicado por: anonimo12121 en 2 Julio 2012, 01:12 am
No sé mucho de esto pero ¿para que sirve la inyección dll?
Gran pregunta, esperamos respuestas.


Título: Re: dll inject by c3r0x..
Publicado por: david_BS en 2 Julio 2012, 01:30 am
Gran pregunta, esperamos respuestas.

vieron lo que es un proceso?, ustedes saben que los procesos cargan DLL's de las cuales dependen para realizar algunas cosas. pueden ser DLL's del sistema o particulares. inyectar una DLL es cargar una DLL en un proceso, pero el tema es que hay muchas formas de cargarla. si les interesa busquen por el foro acerca de "métodos de inyección de DLL" o algo así. esto se hace porque desde una dll se tiene acceso a toda la memoria del proceso, ya que la dll misma pasa a ser parte del proceso (un módulo)


Título: Re: dll inject by c3r0x..
Publicado por: Anvil en 2 Julio 2012, 07:43 am
Pero una vez que inyectas la DLL ¿cómo sacas la información? no me queda muy claro ... :D


Título: Re: dll inject by c3r0x..
Publicado por: Foxy Rider en 2 Julio 2012, 09:37 am
@Anvil & @Dr.Hacker++ → Básicamente para inyectar código de tu interés en un hilo de otro proceso ... es decir, lo que vos correrías en tu proceso, lo hacés que corra en un proceso que ya está, pero en un hilo (básicamente forzás a que el proceso de tu interés llame a LoadLibraryA() en un hilo, y largás lo tuyo en el DllMain de la dll que carga esa función  ) ...  en principios puede servir para muchas cosas, como ocultarse.

Saludos.


Título: Re: dll inject by c3r0x..
Publicado por: x64core en 2 Julio 2012, 11:52 am
@Anvil & @Dr.Hacker++ → Básicamente para inyectar código de tu interés en un hilo de otro proceso ... es decir, lo que vos correrías en tu proceso, lo hacés que corra en un proceso que ya está, pero en un hilo (básicamente forzás a que el proceso de tu interés llame a LoadLibraryA() en un hilo, y largás lo tuyo en el DllMain de la dll que carga esa función  ) ...  en principios puede servir para muchas cosas, como ocultarse.

Saludos.
en realidad se crea un hilo en un proceso distinto desde donde se llamo la funcion no inyecta codigo en un hilo


Título: Re: dll inject by c3r0x..
Publicado por: Foxy Rider en 2 Julio 2012, 15:19 pm
en realidad se crea un hilo en un proceso distinto desde donde se llamo la funcion no inyecta codigo en un hilo

Te felicito por tratar de explicarme algo que ya hacía a los 14 ... el código se explica por si sólo (o con un empujón de la msdn), y te comento que no es la primera vez en mi vida que veo threading (ni laburos con procesos, IPC, locking, etc ..) ni tampoco funciones como VirtualProtectEx(), CreateRemoteThread(), LoadLibrary(), GetModuleHandle() , blablabla ...

Fue una forma un tanto más "ligera" o "metafórica" de explicarlo, soy consciente de que hay ENORME CreateRemoteThread() ahí en ese código


Título: Re: dll inject by c3r0x..
Publicado por: Stakewinner00 en 2 Julio 2012, 17:13 pm
Alguien me puede ayudar con el error al compila


Título: Re: dll inject by c3r0x..
Publicado por: Foxy Rider en 2 Julio 2012, 18:09 pm
Alguien me puede ayudar con el error al compila

¿Es el error del false? si tu compilador de C no soporta C99 (https://en.wikipedia.org/wiki/C99) y no incluís stdbool.h (pensá que C no tiene el tipo de dato "bool", sólo C++ y C99 a través de este header), entonces cambiá false por 0 y probá de nuevo ...

Saludos.

P.S → Igual, el que hizo esto seguro compiló con un compilador de C++ o algún compilador de C "raro" .. ahora que veo no está stdbool ni alguna macro definiéndolo


Título: Re: dll inject by c3r0x..
Publicado por: x64core en 2 Julio 2012, 19:24 pm
Te felicito por tratar de explicarme algo que ya hacía a los 14 ... el código se explica por si sólo (o con un empujón de la msdn), y te comento que no es la primera vez en mi vida que veo threading (ni laburos con procesos, IPC, locking, etc ..) ni tampoco funciones como VirtualProtectEx(), CreateRemoteThread(), LoadLibrary(), GetModuleHandle() , blablabla ...

Fue una forma un tanto más "ligera" o "metafórica" de explicarlo, soy consciente de que hay ENORME CreateRemoteThread() ahí en ese código

en realidad no era mi intencion explicartelo a vos, solo lo dejaba claro para talvez algun(os) novatos que lean el tema
sepan que pasa en realidad porque despues esos novatos transmiten el conocimiento erroneo a otros novatos y así sucesivamente.
no me interesa si ya lo hacías a los 5, 10.