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