2009-06-21 10 views
1

J'ai donc 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 de DllMain, et ne peux certainement pas faire de boucle. Alors, comment puis-je appeler mes fonctions de moniteur DLL toutes les x secondes? J'ai lu que vous ne pouvez pas créer un thread à partir de DllMain (au moins jusqu'à ce qu'il revienne) et c'est vrai parce que cela m'a écrasé. J'ai donc essayé de le créer dans l'événement attach thread et il m'a planté. Alors maintenant, ce que j'essaie de faire est de l'injecter à nouveau (Incase Detours échoue) afin que je puisse gérer le module. Ensuite, je reçois l'adresse d'une fonction d'initialisation qui crée mon thread. Je reçois très bien le module, mais je ne pense pas pouvoir obtenir l'adresse de la fonction. J'ai rendu la fonction vide, et elle m'a encore écrasé. Donc, il ne va même pas jusqu'à appeler la fonction. Visual Studio a déclaré que je n'avais aucun accès en lecture.Où DLL interne à la boucle d'injection?

Alors qu'est-ce que je suis supposé faire? Que faites-vous pour boucler vos fonctions DLL lorsque vous ne possédez pas le programme joint (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 de démarrage est exporté et C extern semble bien inspecté (il est ordinale 1).

Je n'ai aucune idée de ce qui pourrait éventuellement se tromper, et j'espère simplement que quelqu'un là-bas a eu de l'expérience avec ce sujet et s'écraser.

Voici le code de la DLL:

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

//Hook.cpp 
void Starter(void) 
{ 

} 

Merci

Répondre

1

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

Ce que vous aurez à faire est d'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. D'un point de vue technique, vous devriez être en mesure de créer un nouveau thread dans DllMain/DLL_PROCESS_ATTACH, tant que vous ne faites aucune synchronisation avec d'autres threads, même si cela n'est pas recommandé. Je ne suis pas sûr que les problèmes peuvent exister si le faire lorsque la DLL est injectée cependant.