begin process at 2012 05 29 15:37:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

Petit probleme avec injection de dll


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Petit probleme avec injection de dll

lundi 26 janvier 2009 à 21:07:37 | Petit probleme avec injection de dll

ghostichou


Tout d'abord je tiens à vous préciser que j'ai deja regarder les autres sujets parlant de ça sur code sources mais même en les relisant je n'arrive pas à voir d'où vient mon problème.

Donc en fait en gros je souhaiterais juste me familiariser avec l'injection de dll dans des processus actifs (avec toutes les opportunités que cela ouvre).

J'ai donc fait pas mal de recherche et je pense avoir bien compris comment ça marche ... seulement au moment de tester pas moyen de faire fonctionner quoi que ce soit.

En gros, j'ai 2 fichiers .C   (dont une bonne partie est reprise de source trouvées sur le net)

-  l'injecteur qui se nomme : kInject.c

-  Mon fichier qui code mon dll  : dllmain.c  (qui va me donner injDLLl.dll )

Mon problème c'est qyue l'injection a l'air de bien marcher, pas de message d'erreur ... tout semble se passer niquel sauf que rien ne se passe :s

Je vous copie mon code :

dllmain.c ( je veux juste afficher une petite messageBox juste pour bien voir que mon injection marche !)

[CODE]#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        MessageBox(NULL , "INJECTED!" ,"bouh!",MB_OK);
        return FALSE;
    }
}[/CODE]



Et mon injecteur (que j'ai repris de quelqu'un sur le net, et qui semble marcher bien)

[CODE]    #include <windows.h>
    #include <tlhelp32.h>           // CreateToolhelp32Snapshot, ...

    #define DIE 1                 
  
    char usage[]= "kInject.exe [process path/Pid] [dll path] [--create / --runtime] [--resolve]\n"
                  "--create     : program will create the process before injecting\n"
                  "--runtime    : inject already existing process\n"
                  "--resolve    : get process id from executable name\n";

//prototypes

void DispError ( char * message, int die );
int GetPidByName ( char * nom );
int InjectDll ( HANDLE hModule, char * DLLFile );

//==============================================================================
// void DispError ( char * message, int die )
// Description
// affiche erreur si necessaire
//==============================================================================

void DispError ( char * message, int die )
{
    printf("%s\n\n", message);
    system ("PAUSE");
    if ( die ) ExitProcess ( 0 );
    return;
}

//==============================================================================
// int GetPidByName ( char * nom )
// retourne le PID depuis le nom du processus
//==============================================================================

int GetPidByName ( char * nom )
{
    HINSTANCE      hLib;                // Chargement de la DLL
    PROCESSENTRY32 PEntry;              // Informations sur les processus Win32
    HANDLE         hTool32;             // Snapshot des processus
  
    // Type des fonctions
    HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD,DWORD);
    BOOL   (WINAPI *pProcess32First)          (HANDLE,LPPROCESSENTRY32);
    BOOL   (WINAPI *pProcess32Next)           (HANDLE,LPPROCESSENTRY32);
  
    //Functions addresses :
    pCreateToolhelp32Snapshot = (HANDLE(WINAPI *)(DWORD,DWORD))             GetProcAddress ( LoadLibrary("kernel32.dll"), "CreateToolhelp32Snapshot" );
    pProcess32First           = (BOOL(WINAPI *)  (HANDLE,LPPROCESSENTRY32)) GetProcAddress ( LoadLibrary("kernel32.dll"), "Process32First" );
    pProcess32Next            = (BOOL(WINAPI *)  (HANDLE,LPPROCESSENTRY32)) GetProcAddress ( LoadLibrary("kernel32.dll"), "Process32Next" );
  
    // On fixe la taille de la structure avant utilisation
    PEntry.dwSize = sizeof(PROCESSENTRY32);
  
    // On crée notre snapshot ( TH32CS_SNAPPROCESS : inclu la liste des processus Win32 )
    hTool32 = pCreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
  
    // On récupère le premier processus
    pProcess32First ( hTool32, &PEntry );
  
    // Si le nom correspond, on retourne le PID ( Processus IDentifiant )
    if ( !strcmp ( PEntry.szExeFile, nom ) )
        return PEntry.th32ProcessID;

    // Sinon, on teste les processus suivants
    while ( pProcess32Next(hTool32,&PEntry) )
        if(!strcmp(PEntry.szExeFile,nom))
            return PEntry.th32ProcessID;

    // Sinon, on a rien trouvé, on retourne 0
    return 0;
}



//==============================================================================
// int InjectDll ( HANDLE hModule, char * DLLFile )
//------------------------------------------------------------------------------
// Description
// Injecte la dll dans un processus en cours d'execution
//------------------------------------------------------------------------------
//==============================================================================


int InjectDll ( HANDLE hModule, char * DLLFile )
{
    int LenWrite = strlen(DLLFile) + 1;
    char * AllocMem;
    LPTHREAD_START_ROUTINE Injector;
    HANDLE hThread;
    DWORD Result;

    // allocation pour WriteProcessMemory
    AllocMem = (char *) VirtualAllocEx ( hModule, NULL, LenWrite, MEM_COMMIT, PAGE_READWRITE );
    WriteProcessMemory ( hModule, AllocMem , DLLFile, LenWrite, NULL );
  
    Injector = ( LPTHREAD_START_ROUTINE ) GetProcAddress ( GetModuleHandle("kernel32.dll"), "LoadLibraryA" );
    if ( !Injector ) DispError ( "[!] Error while getting LoadLibraryA address.", DIE);
  
    hThread = CreateRemoteThread ( hModule, NULL, 0, Injector, (void *) AllocMem, 0, NULL );
    if ( !hThread ) DispError("[!] Cannot create thread.", DIE);

    // Time out : 10 secondes
    Result = WaitForSingleObject ( hThread, 10*1000 );
    if ( Result==WAIT_ABANDONED || Result==WAIT_TIMEOUT || Result==WAIT_FAILED )
        DispError ( "[!] Thread TIME OUT.", DIE );

    // Libère la mémoire
    VirtualFreeEx ( hModule, (void *) AllocMem, 0, MEM_RELEASE );
    if ( hThread!=NULL ) CloseHandle ( hThread );

    return 1;
}


//==============================================================================
// int main ( int argc, char * argv[] )
//------------------------------------------------------------------------------
// Description
// analyse la commande et agit
//==============================================================================

int main ( int argc, char * argv[] )
{
    // Si le nombre d'arguments est insuffisant, on quitte en affichant l'aide
    if(argc < 3 ) DispError ( usage, DIE );

    printf("kInject v1.0 by Kdm [Modif Par BeLZeL]\n\n" );


    //--------------------------------------------------------------------------
    // --create : Exécute et injecte le code
    //--------------------------------------------------------------------------

  
    if ( !strcmp(argv[3], "--create") || !strcmp(argv[3], "-c") )
    {
        PROCESS_INFORMATION pi;             // Recupère les informations d'identification du nouveau processus
        STARTUPINFO si;                     // Aspect de la fenêtre créée (obligatoire)
      
        // Allocation de mémoire avant utilisation
        memset ( &si, 0, sizeof(si) );
        si.cb = sizeof(si);

        printf("CREATING PROCESS :\n\tName : %s\n\tStatus :", argv[1]);
        if( !CreateProcess ( NULL, argv[1], NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) )
            DispError ( " [!!] CreateProcess [!!]\n", DIE );

        printf(" [OK]\nINJECTING DLL :\n\tName : %s\n\tStatus :", argv[2]);
        InjectDll(pi.hProcess, argv[2]);
        printf(" [OK]\n");
    }

    //--------------------------------------------------------------------------
    // --runtime : Injecte le code dans un processus existant
    //--------------------------------------------------------------------------

    else if ( !strcmp(argv[3], "--runtime") || !strcmp(argv[3], "-r") )
    {
        HANDLE hProc;                       // Handle du processus exécuté
        DWORD ProcPid = 0;                  // PID du processus exécuté
      
        // --resolve : On récupère le PID à partir du nom
        if ( argc>4 && !strcmp(argv[4],"--resolve") )
        {
            ProcPid = GetPidByName(argv[1]);
            if ( !ProcPid ) DispError( "RUNNING PROCESS :\n\tStatus : [!!] GetPidByName failed [!!]\n", DIE);
        }
        else ProcPid = atol(argv[1]);

        // Récupère le handle du processus
        printf("RUNNING PROCESS3 :\n\tName : %s\n\tPID : %d\n\tStatus :", argv[1], ProcPid);
        hProc = OpenProcess ( PROCESS_ALL_ACCESS, TRUE, ProcPid );
        if ( !hProc ) DispError ( " [!!] OpenProcess (Sure it exists ?) [!!]\n", DIE );

        // Injecte le code
        printf(" [OK]\nINJECTING DLL :\n\tName : %s\n\tPID : %d\n\tStatus :", argv[2], ProcPid);
        InjectDll(hProc, argv[2]);
        printf(" [OK]\n");
    }
    else printf("UNKNOWN COMMAND\n");

    printf ("\n");
    system ("PAUSE");
    return 0;
}

[/CODE]


Pour lancer l'injection j'utilise la commande suivante :

kinject.exe "IEXPLORE.EXE" ".\injDLL.dll" --runtime --resolve


Je répète que j'ai repris l'injecteur du net (j'ai pris le temps de le comprendre mais pour être sur que tout marche j'ai préféré reprendre un code bien écrit) et que tout semble bien marcher.
Voilà ce que m'affiche ma console lors de l'injection :

[CODE]
C:\Dev-Cpp>kinject.exe "IEXPLORE.EXE" ".\injDLL.dll" --runtime --resolve
kInject v1.0 by Kdm [Modif Par BeLZeL]

RUNNING PROCESS3 :
        Name : IEXPLORE.EXE
        PID : 2356
        Status : [OK]
INJECTING DLL :
        Name : .\injDLL.dll
        PID : 2356
        Status : [OK]

Appuyez sur une touche pour continuer...[/CODE]


Tous les status sont OK ... donc ça voudrait me laisser sous-entendre que ça marche mais rien ne se passe...
Je suis un peu troublé :)
Si quelqu'un a une idée ça me rendrai très heureux parce que ça va faire presque une semaine que je galère tous les soirs à essayer de changer tout pour que ça marche avant de me décider  à creer un topic :)

D'avance merci :)





lundi 26 janvier 2009 à 22:19:54 | Re : Petit probleme avec injection de dll

racpp

Administrateur CodeS-SourceS
Réponse acceptée !
Salut,
As-tu essayé de passer le chemin complet de la dll à injecter?
kinject.exe "IEXPLORE.EXE" "c:\injDLL.dll" --runtime --resolve
lundi 26 janvier 2009 à 22:40:30 | Re : Petit probleme avec injection de dll

ghostichou

Loooll ...
ho non :)
J'ai honte ^^
ça marche niquel :)
Mille merci ^^
Jsuis vraiment trop bête mais au moins c'est que j'avais quand même bien compris le fonctionnement ^^ ouf :)
Encore merci de t'être penché dessus :)
C'est résolu :)


Cette discussion est classée dans : dll, char, argv, processus, if


Répondre à ce message

Sujets en rapport avec ce message

C++ DLL retour de paramettre [ par PRZYBYLSKI ] Bonjour,Je suis débutant en C++.J'essaye de trouver le moyen de faire une chose qui devrait être très simple.Avoir une application console qui envoi u HELP! DEV-C++ et Dll [ par couriousous ] HEllo!Comment on crée une Dll que l'on peut inclure dans Visual Basic avec dev-c++??? au départ j'ai une fonction char * mafonction(char *) et je veux Pour les doués, moi j'en peu plus ! [ par sena ] Salutje voudrais en fait faire un passage de paramètre a une fonction dont un a une valeur par défaut. (puis inclure ca dnas une DLL)Par exemple une f Convertir des strings [ par UnExPeCtEdSpy ] Bonjour, Présentation du pb:Je ne suis plus trop familier du c++ mais j'ai du m'y remettre pour utiliser un bout de code en tant que DLL au service d' Logiciels & librairies Microsoft: définitivement buggés ? [ par BenjZ ] Salut à tous, Je développe depuis 2 jours un petit logiciel de stéganographie tout bête: il code un fichier dans une bitmap sur les bits de poids faib passage de chaines de caractères en paramètre d'une DLL C vers VB [ par jopop ] Salut tous les coders,soyons brefs, soyons concis.ma fonction :extern "C" void __stdcallMakeLineEx(const char* folder,char* file,char* sout); - folder Pb d'utilisation d'une DLL avec VB (allocation de memoire) [ par jeralex ] Bonjour à tous,Voila mon problème : je suis chargé d'ecrire une DLL en c permettant de recuperer les tag dans un fichier mp3. Quand j'appelle les fonc pb d'appel de fonctions (DLL en linkage dynamique) [ par Gendal67 ] Bonsoir all,Je souhaiterai faire un appel de fonction définie dans un fichier .DLL de manière dynamque etc...jusque la pas de pb, mais je en comprend Données dans DLL accessibles à divers processus (sous dev-C++) [ par graig2 ] Salut à tous, Voici ma toute première question sur ce forum, merci pour votre aide : Est ce qu'une DLL appelée par divers processus distincts peut c lire char* a dans Dll int _stdcall runappli(char* a) [ par Fwdavy ] Je realise une Dll c++, pour être lue par VB du style :int _stdcall runappli(char* a, char* b,int c) La Dll se lance bien mais je voudrais être sur qu


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,390 sec (3)

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