PDA

Visualizza la versione completa : [C++] Inniettare una dll e liberare la memoria


kirakira93
18-03-2010, 22:12
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.




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

}

oregon
18-03-2010, 22:17
La discussione di questo tipo di programmi non è molto tollerata nel forum, a prescindere da ciò che vuoi fare (di cui comunque non possiamo sapere nulla).

kirakira93
18-03-2010, 22:20
ok avete perfettamente ragione, a questo punto dico: se non volete rispondere va bene lo stesso vi capisco bene, se vi fidate vi ringrazio, fate come vi sembra più giusto.

kirakira93
18-03-2010, 22:31
Comunque..... in questo link (http://forum.html.it/forum/showthread/t-1065178.html) si parla del mio stesso problema... riguardo a
A parte il fatto che, anche dalla nuova discussione che hai aperto (DLL injection) penso sempre di più che stai seguendo una "strada" poco utile il codice mi può servire per caricare tread negli exe, solo che con quello che ho trovato carico solo una dll in un exe, mentre io ne volevo di più.
Se c'è un'altro modo per usare i tread altrettanto semplice lo accetto, perchè possono tornare molto utili.

oregon
18-03-2010, 22:39
T'ho già detto che sono argomenti non tollerati in questo forum. Oggi molto più di tempo fa (era una discussione del 2006) ... sono solo utilizzati per "malware" e "cheat" per giochi (ti dice nulla War Rock ... ?) ...

Dato che ritengo, in maniera definitiva, che siano, inutili (quando non dannosi), non parlo più di questo tipo di codici.

kirakira93
18-03-2010, 22:43
ok, ho guardato qualche video su warrock, adesso ho visto, vabbè fa niente.

oregon
18-03-2010, 22:45
Originariamente inviato da kirakira93
adesso ho visto

Adesso?

Mi riferivo a questo

http://www.gamehack.it/members/226356.html

kirakira93
18-03-2010, 23:00
Oregon sei un mito..... beh dico la verità... mi sono inscritto in quel forum per due motivi: uno scaricare le hack per warrock quando ci giocavo (infatti se magari pensi che il codice di sopra serva per warrock ti sbagli perchè l'ho eliminato, lo dimostra anche il fatto che non scarico hack da tempo, penso ci sia scritta la cronologia dei download nel sito); secondo motivo, mi sono inscritto sperando che ci fossero persone capaci di aiutarmi in problemi legati al C++ e mi spiegasse come è organizzata la memoria (visto che usano gli address per le loro hack), ma nessuno.
Comunque sei un buon osservatore, non vorrei aver fatto una brutta impressione.... :bhò:

oregon
18-03-2010, 23:04
Originariamente inviato da kirakira93
Comunque sei un buon osservatore, non vorrei aver fatto una brutta impressione.... :bhò:


beh ... il fatto di chiedere circa codice che esegue delle "dll injection" non depone a tuo favore ... Ovviamente sei padronissimo di chiedere, ma non ti meravigliare se non avrai molte risposte. Al contrario, se vuoi imparare il linguaggio e le normali tecniche, avrai tutti i suggerimenti del caso.

kirakira93
18-03-2010, 23:08
ok grazie, lo farò..... adesso io mi corico, grazie comunque.

Loading