Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INJECTION DE DLL DANS N'IMPORTE QUEL PROCESS


Information sur la source

Catégorie :Système Classé sous : dll, inject, injection, processus, assembleur Niveau : Initié Date de création : 13/04/2007 Date de mise à jour : 13/04/2007 10:21:58 Vu / téléchargé: 10 400 / 741

Note :
9,4 / 10 - par 5 personnes
9,40 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
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

  • // 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;
  • }
// 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 :)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

13 avril 2007 10:21:58 :
Petite modification du code :)

Commentaires et avis

signaler à un administrateur
Commentaire de deck_bsd le 13/04/2007 11:14:11

Yop,

Source très intéressante, je vai l'étudié de plus près :D

signaler à un administrateur
Commentaire de Ombitious_Developper le 13/04/2007 14:01:27

Salut:

Pas mieux, surtout j'apprécie l'explication des différentes étapes nécessaires pour comprendre comment faire l'injection de DLL. (8/10)

signaler à un administrateur
Commentaire de Pamaury le 13/04/2007 19:28:32

Il y a une manière beaucoup plus subtile d'injecter une dll dans un processus, c'est d'utiliser les Hook globaux de windows.

signaler à un administrateur
Commentaire de Xilofeon le 14/04/2007 12:49:50

Comment peut on faire ensuite pour utiliser ou récupérer des fonctions dans cette dll ? Car la si j'ai bien compris la dll est juste injecté mais rien ne ce passe, sauf celle ci a un code à l'atachement d'un thread(ou process).??

Sinon très bonne source. ;)

signaler à un administrateur
Commentaire de Pamaury le 14/04/2007 13:16:04

En fait, lorsque l'on crée une DLL de hook, celle-ci reçoit des messages du shell mais on peut aussi envoyer manuellement des messages donc il suffit d'envoyer un message de ce type au processus: celui sera intercepté par le hook et il pourra alors faire ce qu'il veut:
-soit il charge une autre dll
-soit le code est déjà inclue dans le DLL de hook.

C'est une méthode bien documentée, il suffit de chercher sur Google.

signaler à un administrateur
Commentaire de apxa le 14/04/2007 15:01:58

Salut,
C'est très intérressant en effet.
Crois tu que de la même maniere on puisse decharger une DLL en cours d'utilisation par un processus?

Have Fun.

signaler à un administrateur
Commentaire de Pamaury le 14/04/2007 16:13:18

En théorie, en utilisant cette technique tu peux faire un FreeLibrary sur n'importe qu'elle DLL mais il doit falloir faire attention à ce que l'on fait pour ne pas planter le processus, quoique en suspendant les autres thread du processus il doit y avoir moyen de bidouiller pas mal.

signaler à un administrateur
Commentaire de Taron31 le 14/04/2007 23:13:42

+1 pour Pamaury, effectivement tu places la fonction hook dans une dll, puis la dll sera chargée par les processus qui font appel à ces fonctions APIs hookées, c'est une bonne méthode.

Celle que tu présentes est aussi très connue, mais j'apprécie l'injection du shellcode asm, c est assez sympa, clairement expliqué en plus..

Good.

signaler à un administrateur
Commentaire de MaxSoldier le 20/05/2007 19:58:54

C'est propre, c'est simple, c'est ce que je voulais !
10/10.

signaler à un administrateur
Commentaire de lenanttais44 le 25/01/2008 08:57:42

ca a l'air bien
je cherche un code qui fait la même chose ou presque sous linux
si quelqu'un avait des indices, ca serait gentil

signaler à un administrateur
Commentaire de max12 le 05/02/2008 03:45:18 administrateur CS 10/10

10/10 car même moi j'ai compris :P

signaler à un administrateur
Commentaire de max12 le 06/02/2008 05:36:03 administrateur CS

Ce que je ne comprend pas trop c'est que si je crée un DLL qui fait un messagebox a son chargement il le fait plusieurs fois alors que le process a été threaded une seule fois. Quelqu'un a une petite explication ? :)

A+

signaler à un administrateur
Commentaire de ratala le 11/06/2008 14:44:31

Tres bien expliqué, merci pour ce code qui ma rendu service

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

PATCH DLL NT/9X [ par ouranos ] Bonjour à tous,J'ai réalisé un programme fonctionnant sous win NT/XP/2000 qui détourne des APIwindows afin de pouvoir contrôler le système (limitation Données dans DLL accessibles à divers processus (sous dev-C++) [ par graig2 ] Salut &#224; tous, Voici ma toute premi&#232;re question sur ce forum, merci pour votre aide : Est ce qu'une DLL appel&#233;e par divers processus d Injection de Richter ? [ par albert0 ] Bonjour, Voila, j'ai lut le chapitre 22 du bouc. de Richter, qui parle des Injections (methode avec CreateRemoteThread) Comme d'hab, j'aime bien tes Injection et DirectX [ par wxccxw ] Salut, voila j'ai une scene directX genre jeu, qui utilise des models.... et j'aimerai Injecter dedans un Dll qui change l'opaciter des models.quel st tutos injection de DLL ? [ par XenonGP ] Bonjour tout le monde, j'aimerais avoir quelques liens vers des tutos sur l'injection de DLL(en anglais ou en fran&#231;ais). Ce qui m'int&#233;resse, Plantage CreateRemoteThread [ par NeoUmbrella ] Bonjour, j'ai un soucis avec l'API CreateRemoteThread. Je m'en sert pour décharger de force une dll d'un processus. Pour se faire, j'injecte une fonct Injection dll et systray ? [ par mayti ] Hello, Voil&#224; j'injecte une dll dans un exe et je voudrais afficher une bulle dans le systray (balloon tip) mais en utilisant l'icon de cet exe. message de la pile [ par cyber_al ] bonjoursj'ai une petitte question a poser concernant les messages de la pile ,explications:mon application principale me permet de lancer une dll avec Objet COM [ par mayouma ] Bonjour &#224; tous;je suis entrain d'implementer des DLL en VC++.Net, je voudrais connaitre comment faire un appel d'une methode d'une DLL &#224; une DLL [ par polo3 ] &nbsp;Bonjour, Je recherche une personne capable de faire une dll (pour 3d game studio ) qui permetterait d'effectuer une liaison de type TCP/IPmerci


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.