inyeccion dll c++ ayuda

Iniciado por Borito30, 26 Noviembre 2016, 19:28 PM

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

Borito30

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/
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

MCKSys Argentina

Mirándolo muy por encima parece que hace lo correcto. En qué parte te da error?

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Borito30

#2
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:


Pienso que será porque me faltará alguna librería. Creo.
Perdona que no sabía poner la imagen!
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

MCKSys Argentina

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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Borito30

#4
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);




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.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

fary

Supongo que inyectaras versiones de 32 bits en 32 y lo mismo con 64...

Un byte a la izquierda.

Borito30

#6
perdon por el duplicado.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)