Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Mensaje iniciado por: Borito30 en 26 Noviembre 2016, 19:28 PM

Título: inyeccion dll c++ ayuda
Publicado por: Borito30 en 26 Noviembre 2016, 19:28 PM
Hola estoy intentando hacer un programita básico para inyectar en dll pero me da algunos errores el código es el siguiente:
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>

void error(char *err);

HANDLE myProc = NULL;

int main(int argc, char *argv[])
{
HANDLE processList = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;
BOOL st = TRUE;
pInfo.dwSize = sizeof(PROCESSENTRY32);
Process32First(processList, &pInfo);
int myPid = 0;
do
{
if (strcmp(pInfo.szExeFile, "test.exe") == 0)
{
myPid = pInfo.th32ProcessID;
break;
}
Process32Next(processList, &pInfo);
} while (st != FALSE);

// Abrir el proceso
printf("[+] Opening process %i\n", myPid);
myProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, myPid);
if (myProc == NULL) error("[-] Error abriendo proceso.\n");
else printf("[+] Proceso abierto.\n");

// Reservar memoria para el argumento (ruta de la DLL)
char thData[] = "dll.dll";
LPVOID dirToArg = VirtualAllocEx(myProc, NULL, strlen(thData), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (dirToArg == NULL)
error("[-] Error reservando memoria para argumento.\n");
else
printf("[+] Memoria reservada para argumento (%i bytes).\n", strlen(thData));
// Escribir la ruta de la DLL en la memoria reservada
SIZE_T written = 0;
if (WriteProcessMemory(myProc, dirToArg, (LPVOID)&thData, strlen(thData), &written) == 0)
error("[-] Error escribiendo memoria.\n");
else
printf("[+] Memoria escrita (arg %i bytes).\n", written);

// Lanzar un hilo con LoadLibrary
HANDLE rThread = CreateRemoteThread(myProc, NULL, 0,
(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("Kernel32.dll"), "LoadLibraryA"),
dirToArg, 0, NULL);
if (rThread == NULL)
error("[-] Error creando el hilo.\n");
else printf("[+] Hilo creado.\n");

CloseHandle(myProc);
}

void error(char *err)
{
if (myProc != NULL) CloseHandle(myProc);
printf("%s", err);
exit(0);
}


Lo que estoy intentando es hacer un inyector que inyecte una dll y aqui donde esta la chica que busque por el proceso dado su nombre. Si alguien tiene un ejemplo mejor. En este caso lo extraí de otro sitio y por lo que parece el que lo hizo no sabía ni lo que hacia. Entonces si tienen un ejemplo sencillito para entenderlo en python es facil pero en c++ no consigo hacer ninguno en condiciones.

Fuente: https://blog.ka0labs.net/post/8/
Título: Re: inyeccion dll c++ ayuda
Publicado por: MCKSys Argentina en 26 Noviembre 2016, 19:36 PM
Mirándolo muy por encima parece que hace lo correcto. En qué parte te da error?

Saludos!
Título: Re: inyeccion dll c++ ayuda
Publicado por: Borito30 en 26 Noviembre 2016, 20:08 PM
Cita de: MCKSys Argentina en 26 Noviembre 2016, 19:36 PM
Mirándolo muy por encima parece que hace lo correcto. En qué parte te da error?

Saludos!

Estos son:
(https://i.imgsafe.org/9dcf4a6ca0.png)

Pienso que será porque me faltará alguna librería. Creo.
Perdona que no sabía poner la imagen!
Título: Re: inyeccion dll c++ ayuda
Publicado por: MCKSys Argentina en 26 Noviembre 2016, 23:08 PM
Y porqué no los corrijes? Sólo son errores de argumentos en las APIs. El mismo IDE te dice qué vá en cada lugar.

Saludos!
Título: Re: inyeccion dll c++ ayuda
Publicado por: Borito30 en 26 Noviembre 2016, 23:53 PM
solucionado pero ahora tengo un problema cuando inyecto el proceso se buguea y se cierra.


Cita de: MCKSys Argentina en 26 Noviembre 2016, 23:08 PM
Y porqué no los corrijes? Sólo son errores de argumentos en las APIs. El mismo IDE te dice qué vá en cada lugar.

Saludos!

El problema esta al lanzar el hilo supongo que algo habra mal. en load library , tambien cambiando el proceso por handle pero no parece haberlo solucionado,
algo de aqui:
LPCWSTR a;
std::string s = "Kernel32.dll";
a = (LPCWSTR)s.c_str();
HANDLE rThread = CreateRemoteThread(myProc, NULL, 0,
(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary(a), "LoadLibraryA"),
dirToArg, 0, NULL);


(https://i.imgsafe.org/a2e50739c0.png)

Se supone que en el handle deberia cerrar el hilo. No? Aun así tambien da lo mismo.
CloseHandle(myProc); --> CloseHandle(rThread);

Habria alguna manera de indicarle que recorriera o inyectara en todos mis procesos de mi usuario? de usuario no de sistema.
MOD:Imagen adaptada a lo permitido. No hacer doble post. Usa el botón modificar.
Título: Re: inyeccion dll c++ ayuda
Publicado por: fary en 27 Noviembre 2016, 10:06 AM
Supongo que inyectaras versiones de 32 bits en 32 y lo mismo con 64...

Título: Re: inyeccion dll c++ ayuda
Publicado por: Borito30 en 27 Noviembre 2016, 12:52 PM
perdon por el duplicado.