dll inject by c3r0x..

Iniciado por c3r0x, 5 Agosto 2007, 02:59 AM

0 Miembros y 1 Visitante están viendo este tema.

c3r0x

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




InjDLL.c

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

#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

MazarD

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.
-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

Stakewinner00

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

Anvil

No sé mucho de esto pero ¿para que sirve la inyección dll?
\\::_--__!!ss"1122

anonimo12121

Cita de: Anvil en  2 Julio 2012, 01:07 AM
No sé mucho de esto pero ¿para que sirve la inyección dll?
Gran pregunta, esperamos respuestas.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

david_BS

Cita de: Dr.Hacker++ en  2 Julio 2012, 01:12 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)

Anvil

Pero una vez que inyectas la DLL ¿cómo sacas la información? no me queda muy claro ... :D
\\::_--__!!ss"1122

Foxy Rider

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

x64core

Cita de: vertexSymphony 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.
en realidad se crea un hilo en un proceso distinto desde donde se llamo la funcion no inyecta codigo en un hilo

Foxy Rider

Cita de: RHL en  2 Julio 2012, 11:52 AM
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