Injection de dll dans n'importe quel process

Soyez le premier à donner votre avis sur cette source.

Vue 31 311 fois - Téléchargée 2 110 fois

Description

Ce prog vous permettra d'injecter une dll dans (presque) n'importe quel processus.
Pour ceux qui ne connaissent pas, injecter une dll est un moyen d'exécuter du code dans un autre exécutable (processus pour être précis). Cela a quelques avantages (ajout de fonctionnalité, détournement de certaines fonctions, h**k :), et bien d'autres).
Pour ce faire, le programme injecte une dll (contenant notre code) dans le processus. Voici les étapes :

Tout d'abord, rappelons que pour charger une dll, nous avons besoin de LoadLibrary(char * dll).
Ce que nous allons donc faire, c'est injecter du code dans le processus qui appellera cette fonction :

push offset dll_name
call LoadLibraryA
ret

Il nous faudra donc injecter le nom et le chemin complet de notre dll dans la mémoire du processus, et insérer le bout de code ci-dessus.
Pour ce se faire, on va :
- Allouer de la mémoire avec VirtualAllocEx dans le processus distant.
- Ouvrir le processus avec OpenProcessMemory.
- Ecrire dans le processus, la string du chemin de la dll, et le bout de code. (aux endroits allouer avec VirtualAllocEx).
- Utiliser CreateRemoteThread, pour lancer une nouvelle thread dans le processus distant, à l'endroit de notre code évidement.

Le code une fois executer, chargera notre dll et le tour est joué !

Note :

1) J'ai ajouter le mode "privileg" qui permet d'injecter la casi totalité des processus (En passant par les privilège de debug).
2) Pour ceux qui ne connaissent pas l'assembleur :

push offset Dll_path
'Pousse' sur la pile le pointeur vers notre string. C'est de cette manière que les arguments des fonctions son passés.

call LoadLibraryA
Appel de la fonction LoadLibraryA tout simplement. (Avec notre argument poussé précédemment).

ret
C'est le Return, en gros, c'est pour dire que la thread à fini son exécution :)

3) Il y a une méthode plus courte pour ceux qui on assimilé la matière :
Au lieu d'injecter le code assembleur, on peut simplement faire une thread, qui a pour cible, LoadLibraryA et donner directement comme argument l'addres de notre string.
CreateRemoteThread(Process,LoadLibraryA,(char *) dll_path,...);

Merci de m'avoir lu :)

Ciao !

Source / Exemple :


// Voici la fonction principale : 

// Loader assembleur.
char aloader[] =	"\xB8\x00\x00\x00\x00"  //Mov eax, LoadLibraryA
					"\x68\x00\x00\x00\x00"  //PUSH OFFSET szDLL_PATH
					"\xFF\xD0"				//Call EAX
					"\xC3";					//RETN

// Note; il y a plus simple, CreateReamoteThread(,,LoadLibraryA,OFFSET szDLL_PATH,,,);
// Mais j'avais envie de le faire avec un peu d'assembleur :)

/* DLL INJECT :
inject the dll to the target process !
1) OpenProcess
2) VirtualAlloc shellcode
3) VirtualAlloc string
4) Create Shell
5) WriteMemory Shell
6) WriteMemory String
7) CreatRemoteThread

  • /
HANDLE DllInject(DWORD PID,char * dll){ HANDLE hproc; LPVOID RStr,RShell; HANDLE RThread; DWORD RThreadId; FILE* file; int writtenbytes; if(!(file = fopen(dll,"r"))) return 0; fclose(file); /* 1 */ hproc = OpenProcess(PROCESS_ALL_ACCESS,NULL,PID); if(!hproc) return 0; /* 2 */ RStr = VirtualAllocEx(hproc,0,strlen(dll)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE); if(!RStr) return 0; /* 3 */ RShell = VirtualAllocEx(hproc,0,sizeof(aloader),MEM_COMMIT,PAGE_EXECUTE_READWRITE); if(!RShell) return 0; /* 4 */ DWORD *PTR; PTR = (DWORD*)(aloader + 1);
  • PTR = (DWORD)LoadLibrary;
PTR = (DWORD*)(aloader + 6);
  • PTR = (DWORD)RStr;
/* 5 */ WriteProcessMemory(hproc,RShell,(LPCVOID) aloader,(SIZE_T)sizeof(aloader),(SIZE_T*)&writtenbytes); if(writtenbytes < sizeof(aloader)) return 0; /* 6 */ WriteProcessMemory(hproc,RStr,(LPCVOID) dll,(SIZE_T)strlen(dll) +1,(SIZE_T*)&writtenbytes); if(writtenbytes < strlen(dll) +1 ) return 0; /* 7 */ RThread = CreateRemoteThread(hproc,NULL,0,(LPTHREAD_START_ROUTINE)RShell,0,0,&RThreadId); if(!RThread) return 0; return RThread; }

Conclusion :


Si question il y a, hésitez pas :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2493
Date d'inscription
jeudi 14 juillet 2005
Statut
Contributeur
Dernière intervention
5 juin 2016
1
Nickel comme programme !
10/10, of course.
Messages postés
1
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
28 décembre 2009

très intéressant mais comment faire pour que la dll s'exécute toute seule une fois charger ?
Messages postés
76
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
29 novembre 2009

hum, je rectifie ce que j'ai dit, avec ton code, en modifiant aussi pour appeller l'api directement, ça marche, ma fois....
Messages postés
76
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
29 novembre 2009

Je te mets le maximum, parce que comparé à d'autres injections ou l'appelle du thread se fait direct sur l'api pour charger la librairie, celle-ci fonctionne même sous WINDOWS SEVEN 64...

d'ailleurs je ne sais pas si c'est moi qui me plante, mais pour l'autre type d'injection ça foire sous seven 64
Messages postés
248
Date d'inscription
jeudi 3 février 2005
Statut
Membre
Dernière intervention
22 juin 2008

Tres bien expliqué, merci pour ce code qui ma rendu service
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.