Editado: pongo un screen
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