Injection de dll dans n'importe quel process

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

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.