Accueil > > > INJECTER UNE DLL DANS UN PROCESSUS
INJECTER UNE DLL DANS UN PROCESSUS
Information sur la source
Description
Ce petit prog montre comment injecter une dll dans un processus avec les fonctions de l'api WIN32, ça permet donc d'executer du code dans un autre processus.
Voici les étapes de l'injection :
On ouvre d'abord le processus avec OpenProcess,
on alloue de la mémoire pour écrire le nom de la DLL à charger dans le processus avec VirtualAllocEx,
on écrit le nom de la dll avec WriteProcessMemory,
on recherche la fonction LoadLibrary qui permet de charger une DLL avec GetProcAddress,
on lance le thread qui va s'executer dans l'espace mémoire du processus et charger la dll avec CreateRemoteThread,
on libère la mémoire allouée avec VirtualFreeEx,
on ferme l'handle du thread ouvert avec CloseHandle().
L'injection est impossible dans certains processus(système, av...)(c'est possible en passant par les privilège de debug).
Voilà c'est tout :).
Source
- public static bool StartInjection(string DllName, uint ProcessID)
- {
- try
- {
- IntPtr hProcess = new IntPtr(0); //openprocess
- IntPtr hModule = new IntPtr(0); //vritualAllocex
- IntPtr Injector = new IntPtr(0); //getprocadress
- IntPtr hThread = new IntPtr(0); //createremotethread
- int LenWrite = DllName.Length + 1;
-
- //on ouvre le processus avec tout les droits d'accés
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
-
- //si il a bien été ouvert
- if (hProcess != IntPtr.Zero)
- {
- //on va allouer de la mémoire
- hModule = VirtualAllocEx(hProcess, IntPtr.Zero, (UIntPtr)LenWrite, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
-
- //si on a bien alloué de la mémoire
- if (hModule != IntPtr.Zero)
- {
- //on va écrire le nom de la dll dans le process
- ASCIIEncoding Encoder = new ASCIIEncoding();
-
- //nombre de bytes écrits
- int Written = 0;
-
- //si on a bien écrit dans le process
- if (WriteProcessMemory(hProcess, hModule, Encoder.GetBytes(DllName), LenWrite, Written))
- {
- //on va rechercher la fonction LoadLibrary qui va charger la dll
- Injector = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
-
- //si on a bien trouvé l'adresse
- if (Injector != IntPtr.Zero)
- {
- //on lance le thread qui va s'executer dans l'espace mémoire du processus et charger la dll
- hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, Injector, hModule, 0, 0);
-
- //pas d'erreur avec le lancement du thread
- if (hThread != IntPtr.Zero)
- {
- //10 secondes
- uint Result = WaitForSingleObject(hThread, 10 * 1000);
-
- //...
- if (Result != WAIT_FAILED || Result != WAIT_ABANDONED
- || Result != WAIT_OBJECT_0 || Result != WAIT_TIMEOUT)
- {
- //on désalloc la mémoire allouée
- if (VirtualFreeEx(hProcess, hModule, 0, MEM_RELEASE))
- {
- //on regarde si l'handle du thread retourné n'est pas null
- if (hThread != IntPtr.Zero)
- {
- //injection réussie :]
- CloseHandle(hThread);
- MessageBox.Show("Injection réussie !", "Succés", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- return true;
- }
- else throw new Exception("Mauvais Handle du thread...injection échouée");
- }
- else throw new Exception("Problème libèration de mémoire...injection échouée");
- }
- else throw new Exception("WaitForSingle échoué : " + Result.ToString() + "...injection échouée");
- }
- else throw new Exception("Problème au lancement du thread...injection échouée");
- }
- else throw new Exception("Adresse LoadLibraryA non trouvée...injection échouée");
- }
- else throw new Exception("Erreur d'écriture dans le processus...injection échouée");
- }
- else throw new Exception("Mémoire non allouée...injection échouée");
- }
- else throw new Exception("Processus non ouvert...injection échouée");
-
- }
- catch (Exception e)
- {
- //en cas d'erreur on affiche l'erreur et on arrête la fonction(pas d'injection)
- MessageBox.Show(e.Message, e.Source);
- return false;
- }
- }
public static bool StartInjection(string DllName, uint ProcessID)
{
try
{
IntPtr hProcess = new IntPtr(0); //openprocess
IntPtr hModule = new IntPtr(0); //vritualAllocex
IntPtr Injector = new IntPtr(0); //getprocadress
IntPtr hThread = new IntPtr(0); //createremotethread
int LenWrite = DllName.Length + 1;
//on ouvre le processus avec tout les droits d'accés
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
//si il a bien été ouvert
if (hProcess != IntPtr.Zero)
{
//on va allouer de la mémoire
hModule = VirtualAllocEx(hProcess, IntPtr.Zero, (UIntPtr)LenWrite, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//si on a bien alloué de la mémoire
if (hModule != IntPtr.Zero)
{
//on va écrire le nom de la dll dans le process
ASCIIEncoding Encoder = new ASCIIEncoding();
//nombre de bytes écrits
int Written = 0;
//si on a bien écrit dans le process
if (WriteProcessMemory(hProcess, hModule, Encoder.GetBytes(DllName), LenWrite, Written))
{
//on va rechercher la fonction LoadLibrary qui va charger la dll
Injector = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
//si on a bien trouvé l'adresse
if (Injector != IntPtr.Zero)
{
//on lance le thread qui va s'executer dans l'espace mémoire du processus et charger la dll
hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, Injector, hModule, 0, 0);
//pas d'erreur avec le lancement du thread
if (hThread != IntPtr.Zero)
{
//10 secondes
uint Result = WaitForSingleObject(hThread, 10 * 1000);
//...
if (Result != WAIT_FAILED || Result != WAIT_ABANDONED
|| Result != WAIT_OBJECT_0 || Result != WAIT_TIMEOUT)
{
//on désalloc la mémoire allouée
if (VirtualFreeEx(hProcess, hModule, 0, MEM_RELEASE))
{
//on regarde si l'handle du thread retourné n'est pas null
if (hThread != IntPtr.Zero)
{
//injection réussie :]
CloseHandle(hThread);
MessageBox.Show("Injection réussie !", "Succés", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return true;
}
else throw new Exception("Mauvais Handle du thread...injection échouée");
}
else throw new Exception("Problème libèration de mémoire...injection échouée");
}
else throw new Exception("WaitForSingle échoué : " + Result.ToString() + "...injection échouée");
}
else throw new Exception("Problème au lancement du thread...injection échouée");
}
else throw new Exception("Adresse LoadLibraryA non trouvée...injection échouée");
}
else throw new Exception("Erreur d'écriture dans le processus...injection échouée");
}
else throw new Exception("Mémoire non allouée...injection échouée");
}
else throw new Exception("Processus non ouvert...injection échouée");
}
catch (Exception e)
{
//en cas d'erreur on affiche l'erreur et on arrête la fonction(pas d'injection)
MessageBox.Show(e.Message, e.Source);
return false;
}
}
Conclusion
J'ai aussi mis une dll que j'ai programmée en c++ que vous pouvez utiliser pour tester le prog.
J'ai modifié la DLL, toujours en c++ mais elle affiche juste une messagebox
"Hello World" lorsque elle est injectée et lorsque elle est détachée.
Source dll ici : http://misugipr0ject.free.fr/myDll.rar
En aucun cas je n'incite au hacking / cracking, l'injection de dll permet de faire plein d'autre choses.
Bonne prog :).
Historique
- 28 décembre 2007 18:48:21 :
- Changement de la dll et ajout de sa source c++.
- 28 décembre 2007 18:50:48 :
- Changement de la dll + ajout de sa source c++.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
dll... help... [ par kmizol95 ]
j'ai un chti probleme... avec les dll... je sais pas comment faire pour en créée une en C#... qu'est ce qu'on peut ecrire dedans comment la déclarée d
problème avec dll [ par pipicaca ]
Bonjour!Voila je dois faire une application en C# utilisant des dll écrites en C. Les fonctions de ces dll ont en paramètres d'entrée/sortie des struc
?Gros problème avec dll [ par pipicaca ]
Bonsoir,Voila je dois utiliser une dll écrite en C dans un programme écrit en C#. COmment faire??? Les fonctions contenues dans la dll et que je dois
.lib et .net [ par Schad ]
J'ai récupéré des dll que je dois incorporer dans un programme que je développe actuellement. Avec ces dll est fourni un exemple Visual C++ 6 qui poss
DLL necessaires??? [ par temp456026 ]
Bonjour,je viens de compiler et d'excuter un programme sous visual .net, sur ma machine il marche, mais des que j'essai d'executer l'exe sur une machi
Acces aux éléments ajoutés [ par Online ]
Re-BonjourVoila, cette fois ci, j'ai joins à mon programme 2 éléments ( une application et une DLL mais je ne sais pas comment y faire appel.La questi
exe c# sans framework.net ? [ par KaViDee ]
Je voulais savoir si il était possible de lancer une application compilée en c#.net sans avoir la framework.net d'installée sur son ordinateur, qu'on
DirListBox [ par temp456026 ]
Bonjour...voila je suis en train de developper une application sous visual.net en C# (sous XP)....dans mon Form il y a une DirListBox, des que je veut
Connexion à une bd, manque une dll ! [ par gouin ]
Auriez-vous l'amabilité de me dire ou je peux trouver cette dll : system.data.oledb.dll qui est légèrement indispensable et qui très étonnament n'est
DLL et Services Web [ par rafraf ]
Salut à tous ! J'ai un petit pb avec les DLL en code non managé, en mode Service Web, J'essaye de faire appel à une DLL dans un service web, j
|
Derniers Blogs
MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril SHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KITSHAREPOINT 15 TECHNICAL PREVIEW MANAGED OBJECT MODEL SOFTWARE DEVELOPMENT KIT par Matthew
http://www.microsoft.com/download/en/details.aspx?id=28768&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+MicrosoftDownloadCenter+(Microsoft+Download+Center) ...
Cliquez pour lire la suite de l'article par Matthew
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|