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
/*
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
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.
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.)
No sé mucho de esto pero ¿para que sirve la inyección dll?
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.
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)
Pero una vez que inyectas la DLL ¿cómo sacas la información? no me queda muy claro ... :D
@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.
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
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
Alguien me puede ayudar con el error al compila
Cita de: Stakewinner00 en 2 Julio 2012, 17:13 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
Cita de: vertexSymphony en 2 Julio 2012, 15:19 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.