Ciao ragazzi, questo sorgente l'ho copiato da un sito che spiega come creare virus, ma non temete, il mio intento è un altro.

Questo codice carica un dll nella ram di un processo servendosi dell Pid del processo
Questo codice funziona perfettamente, l'unico problemuccio è che una volta caricata la dll in memoria non riesco più a liberare la ram per la dll e riutilizzare questo eseguibile per inniettare la dll nello stesso processo, come la prima volta che lo eseguo.

Codice PHP:

#include "stdafx.h"
#include <iostream>
#include <windows.h>

BOOL Inietta(DWORD pidLPCTSTR dllname);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{


//Fase1: Registrare il PID del processo "firefox.exe"

DWORD Explorer;
Explorer 3184;

//Fase2: Iniezione della dll in firefox.exe

if(Inietta(Explorer"C:\\Users\\Niko\\Desktop\\dll.dll"))
return 
0;
else
MessageBox(NULL"Errore"""0);


}




BOOL Inietta(DWORD pidLPCTSTR dllname)
{

LPVOID remaddr;
HANDLE hprocrthread;
HMODULE kmodh;

//Apre il processo firefox.exe dal Pid
if((hproc OpenProcess(PROCESS_ALL_ACCESSFALSEpid)) == NULL)
{
MessageBox(NULL,"Apre il processo explorer.exe dal Pid","Errore",0); return FALSE; } //Fallisce se non riesce ad aprirlo

//Alloca la dll nella memoria Ram di firefox.exe e fisicamente
if((remaddr VirtualAllocEx(hprocNULLstrlen(dllname),MEM_COMMIT,//>>
PAGE_READWRITE))== NULL)
{
MessageBox(NULL,"Alloca la dll nella memoria Ram di explorer.exe e fisicamente","Errore",0); return FALSE; }



//Scrive i dati della dll nell'area di memoria di firefox.exe
if(!WriteProcessMemory(hprocremaddr, (LPVOID)dllnamestrlen(dllname), NULL))
{
VirtualFreeEx(hprocremaddrstrlen(dllname), MEM_RELEASE|MEM_DECOMMIT);
{
MessageBox(NULL,"Scrive i dati della dll nell'area di memoria di explorer.exe","Errore",0); return FALSE; }
}

//Prende l'Handle del Kernel32, serve solo per chiamare la funzione LoadLibraryA
kmodh GetModuleHandle("KERNEL32.DLL");

//Crea un Thread (mini processo) in explorer.exe passando per argomenti
//la LoadLibraryA che caricherà la dll
//Nb. per supporto Unicode, usare la LoadLibraryW invece che LoadLibraryA
rthread CreateRemoteThread(hproc,NULL,0,//>>
(LPTHREAD_START_ROUTINE)GetProcAddress(kmodh,"LoadLibraryA"),//>>
remaddr,0,NULL);
//rthread = NULL;
//Se ha fallito, lasciamo perdere e liberiamo la memoria
if(rthread == NULL) {
VirtualFreeEx(hprocremaddrstrlen(dllname), MEM_RELEASE|MEM_DECOMMIT);
{
MessageBox(NULL,"Se ha fallito, lasciamo perdere e liberiamo la memoria","Errore",0); return FALSE; }
}

//Se abbiamo avuto successo, liberiamo lo stesso la memoria però, e chiudiamo l'handle
VirtualFreeEx(hprocremaddrstrlen(dllname), MEM_RELEASE|MEM_DECOMMIT);
CloseHandle(hproc);

return 
TRUE;