Petit probleme avec injection de dll

Résolu
Signaler
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010
-
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010
-
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 !)

#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;
    }
}


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

    #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, &amp;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,&amp;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 ( &amp;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, &amp;si, &amp;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 &amp;&amp; !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;
}



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 :

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...


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 :)

2 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
As-tu essayé de passer le chemin complet de la dll à injecter?
kinject.exe "IEXPLORE.EXE" "c:\injDLL.dll" --runtime --resolve
Messages postés
10
Date d'inscription
vendredi 29 décembre 2006
Statut
Membre
Dernière intervention
14 février 2010

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 :)