1 votes

Où à l'intérieur de la DLL injectée boucler?

Donc j'ai une application qui démarre une autre application avec ma DLL injectée (avec Detours). Le point d'entrée est DllMain. Je ne peux pas faire grand-chose à partir de DllMain, et certainement ne peut pas boucler. Alors comment appeler mes fonctions de surveillance de DLL toutes les x secondes? J'ai lu que vous ne pouvez pas créer un thread à partir de DllMain (du moins jusqu'à ce qu'il retourne) et c'est vrai car cela m'a planté. J'ai donc essayé de le créer dans l'événement du thread attaché et cela m'a planté. Maintenant, ce que j'essaie de faire, c'est de l'injecter à nouveau (au cas où Detours échouerait) pour que je puisse obtenir le handle du module. Ensuite, j'obtiens l'adresse d'une fonction d'initialisation qui crée mon thread. Je récupère bien le handle du module, mais je ne pense pas pouvoir obtenir l'adresse de la fonction. J'ai rendu la fonction vide, et cela m'a quand même planté. Donc ça n'arrive même pas à appeler la fonction. Visual Studio dit que je n'ai pas accès en lecture.

Que suis-je censé faire? Que faites-vous pour boucler vos fonctions de DLL lorsque vous ne possédez pas le programme attaché (exe).

//Application.exe
STARTUPINFO si = {sizeof(STARTUPINFO)};
        PROCESS_INFORMATION pi = {0};

        DetourCreateProcessWithDll(filename, NULL, NULL, NULL, TRUE, 
                                    CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, path,
                                    &si, &pi, detoured, hook, NULL);

        processID = pi.dwProcessId;

        hDll = InjectDLL(processID, hook);

if(hDll != NULL)
{
STARTER Starter = (STARTER)GetProcAddress(hDll, "Starter");

if(Starter != NULL)
    Starter();
}

        ResumeThread(pi.hThread);

La fonction Starter est exportée en tant que C externe et semble correcte à l'inspection (c'est ordinal 1).

Je n'ai aucune idée de ce qui pourrait éventuellement être faux, et j'espère simplement que quelqu'un là-bas a de l'expérience dans ce domaine et de plantages.

Voici le code de la DLL:

//Hook.h
extern "C"
{
    void __declspec(dllexport) Starter(void);
}

//Hook.cpp
void Starter(void)
{

}

Merci

1voto

Gerald Points 13865

Vous ne pouvez pas le faire de cette façon car le DLL est injecté dans un processus différent et vous essayez d'exécuter la fonction dans l'espace d'adressage de votre processus de hooking.

Ce que vous devrez faire, c'est appeler CreateRemoteThread, en passant l'adresse que vous obtenez de GetProcAddress dans le paramètre lpStartAddress. Cela va créer un nouveau thread sur le processus distant, et exécuter la fonction dans l'espace d'adressage de ce processus, dans le contexte du nouveau thread.

BTW, techniquement, vous devriez être en mesure de créer un nouveau thread dans DllMain/DLL_PROCESS_ATTACH, tant que vous ne faites pas de synchronisation avec d'autres threads, bien que ce ne soit pas recommandé. Je ne suis pas sûr des problèmes qui pourraient exister si vous le faites lorsque le DLL est injecté cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X