Codice PHP:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
BOOL Inietta(DWORD pid, LPCTSTR 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 pid, LPCTSTR dllname)
{
LPVOID remaddr;
HANDLE hproc, rthread;
HMODULE kmodh;
//Apre il processo firefox.exe dal Pid
if((hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)) == 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(hproc, NULL, strlen(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(hproc, remaddr, (LPVOID)dllname, strlen(dllname), NULL))
{
VirtualFreeEx(hproc, remaddr, strlen(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(hproc, remaddr, strlen(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(hproc, remaddr, strlen(dllname), MEM_RELEASE|MEM_DECOMMIT);
CloseHandle(hproc);
return TRUE;
}