begin process at 2010 02 09 15:32:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > INJECTER UNE DLL DANS UN PROCESSUS

INJECTER UNE DLL DANS UN PROCESSUS


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Source .NET ( DotNet ) Classé sous :dll, injection, win32, injecter, hook Niveau :Débutant Date de création :28/12/2007 Date de mise à jour :28/12/2007 18:50:48 Vu / téléchargé :10 053 / 517

Auteur : Misugii

Ecrire un message privé
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE L'API VIRTUAL DISK IMAGE DE WINDOWS 7 par Willi
Source avec Zip Source .NET (Dotnet) CHESS GAME CORE - LIBRAIRIE JEU D'ÉCHEC EN C# par Bidou
Source .NET (Dotnet) CHANGER LA RESOLUTION DE VOTRE ECRAN, UTILISATION DES API WI... par mechtaly
Source avec Zip Source .NET (Dotnet) CRÉER SON PROPRE DESIGNER COMME CELUI DE VISUAL STUDIO par ShareVB
Source avec Zip Source .NET (Dotnet) CSVSHARP. DLL D'IMPORT/EXPORT DE CONTENU AU FORMAT CSV par heriquet

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) HOOK CLAVIER EN C# par shadow1779
Source avec Zip Source .NET (Dotnet) MESSAGES PERSOS MSN par XelectroX
Source avec Zip Source avec une capture Source .NET (Dotnet) RESOURCEBINDER : INJECTER ET EXTRAIRE DES RESSOURCES par badrbadr
Source avec Zip Source .NET (Dotnet) GESTIONNAIRE DE PRESSES-PAPIER par Mr.X
Source avec Zip Source .NET (Dotnet) HOOK CLAVIER par damned3

Commentaires et avis

Commentaire de Elxior le 28/12/2007 18:13:57

GG Misu, ça masse des gazelles.
À quand le MisuWPE ? \o/

Commentaire de mickbad le 28/12/2007 18:17:39

dommage qu'on ai pas *aussi* la source de la DLL en c++
et cela n'aurait pas été hors sujet en c# ;)

pourquoi ? pour savoir ce qu'il y a dedans et le recompiler :)

.Mick.

Commentaire de Misugii le 28/12/2007 18:34:12

J'ai prog la dll en c++ car je ne sais pas comment exécuter une fonction une fois la dll attachée au processus en c#...

En c++ ça se fait avec des "case DLL_PROCESS_ATTACH" etc... je sais pas si c'est faisable en c#.

Je suis entrain d'up le projet de la DLL c++, je vous met ça vite fait.

Commentaire de mickbad le 28/12/2007 18:47:37

Je pense que tu devrais avoir la fonction DllEntry accessible par un moyen ou un autre mais j'avoue que là, je sèche un peu
http://www.google.fr/search?hl=fr&q=DllEntry+c%23&btnG=Rechercher&meta=

??

cela dit, ce n'était pas ça que je demandais en fait : c'était carrément la source c++ de ta dll ;)

ça peut toujours être intéressant.

Bon ok, ensuite tu auras des râleurs (comme moi, tiens) qui te diront : "euh t'es en c# ici" ou encore "tu pourrais nous dire comment compiler ta dll ??"

.Mick.

Commentaire de Misugii le 28/12/2007 18:55:44

J'ai changé la dll, j'ai mis une dll beaucoup plus simple qui affiche seulement une msgbox une fois injectée dans le processus, je vais chercher pour le DllEntry.

Si tu veux toujours la source de l'ancienne source, je t'envois ça en privé.

Commentaire de mounibec le 31/12/2007 11:31:05

tu dit : En aucun cas je n'incite au hacking / cracking, l'injection de dll permet de faire plein d'autre choses.

Donne moi un exemple stp

Commentaire de coq le 31/12/2007 14:14:40 administrateur CS

Salut,

Quelques petites remarques :

- Dans ta méthode main.DeleteItems, tu peux remplacer la boucle de suppression des items du ListView par un appel à la méthode Clear de la collection d'Items
- Injection.GetProcessList : le mot clé ref ne sert à rien ici, ListView est un type référence. Par ailleurs en faisant les traitement sur GUI directement dans la classe Injection, tu lie celle ci au GUI, pas forcément utile.
- Le fait que tu aie fait le choix de développer "façon API Win32" avec maintient de liste dans un champs static est plutôt dangereux si ta classe vient à être utilisée dans un contexte multi-thread, tu devrais mettre un avertissement à ce sujet.
- Je ne sais pas si tu as fait exprès de ne pas utiliser la classe Process (http://msdn2.microsoft.com/en-us/library/system.diagnostics.process.aspx), qui contient déjà des méthodes pouvant te permettre d'éviter de faire toi même certains appels de plateforme, je pense notamment à la méthode pour lister les processus.
- Méthode Injection.GetProcessList : si une erreur survient durant le traitement, l'appel à CloseHandle ne sera effectué
- Méthode Injection.GetPIDbyName : retourner 0 quand le processus n'est pas trouvé n'est pas forcément judicieux, le processus de PID 0 existant (Idle)
- Méthode Injection.StartInjection : il n'y a pas d'appel CloseHandle pour le handle obtenu de OpenProcess
- Méthode Injection.StartInjection : l'appel à VirtualFreeEx ne sera pas systématiquement effectué pour hModule
- Méthode Injection.StartInjection : l'appel à CloseHandle ne sera pas systélatiquement effectué pour hThread
- Tu as écris une définition pour GetLastError : regarde plutôt du côté de Marshal.GetLastWin32Error (http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getlastwin32error.aspx)

Commentaire de nico9111 le 17/03/2008 09:52:10

Mounibec, une utilité possible est l'ajout de fonctionnalités à un logiciel (je ne citerai pas le nom d'un célèbre add-on pour une messagerie instantanée ^^)

En ce qui concerne l'exécution de code C#, ça peut se faire en faisant charger le CLR par le processus cible (un minimum de connaissances en assembleur et en programmation Win32/COM est requis) et en lui passant une méthode de signature :
public static int TaMethode(string param);

Commentaire de meme06 le 27/01/2009 18:58:35

I have a probleme making a .dll that do the messagebox or play a sound can you please repost the corect source concerning how to built the dll.

Commentaire de meme06 le 27/01/2009 20:49:38

oups c francais ici lol
bon peu on jeter un oeil sur le source DLL ?
pasque la premiere partit et bien cool.
mais helas ca me sert pas a grand chose si je ne sais pas faire la DLL.

aussi est ce que c'est possible de faire la même DLL mais en C# ?
c'est  mon language et impossible d'appeler une message box comme toi en C#

Commentaire de zingaris le 02/12/2009 10:15:49 8/10

J'ai un excellent exemple qui utilise cette technique. Ce n'est pas du hacking, c'est simplement une manière de ne pas passer toujours par une maintenance de logiciel pas toujours réactive (attente très longue pour une demande de changements) et pas bon marché (très très chère). Pas toutes les entreprises peuvent se permettre d'avoir des logiciels sur mesure.
Voilà.

 Ajouter un commentaire


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


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales