2009-05-26 12 views
0

Nous utilisons une bibliothèque de troisième partie pour rendre 3d. Dans cette bibliothèque, il existe une fonctionnalité de "mémoire de suivi" qui garde trace de toute la mémoire allouée et libérée par la bibliothèque pendant l'exécution. C'est une caractéristique intéressante, car cela aide à déterminer par ex. fuites de mémoire. En appelant une certaine fonction dans cette bibliothèque, un fichier journal est généré dans le répertoire de travail courant du processus. Dernièrement, j'ai remarqué que ce fichier apparaissait à plusieurs endroits différents, donc ma première pensée était bien sûr de toujours définir le répertoire de travail actuel dans le dossier dans lequel je veux que le journal apparaisse, et cela fonctionne très bien.Comment attraper la création de fichier et l'appelant responsable

Cependant, il s'avère que ce fichier est toujours créé à divers endroits sans que la fonction mentionnée ci-dessus ait jamais été appelée par le programme. Par conséquent, le fichier doit en quelque sorte être créé par la bibliothèque sans mon consentement. Le créateur de cette bibliothèque dit que le moteur n'appelle jamais cette méthode en interne. Donc, pour lui prouver le contraire (en me montrant moi-même stupide (ce ne sera pas la première fois)), j'ai besoin d'un moyen d'attraper exactement quand ce fichier est créé. FindFirstChangeNotification() ne fera pas, car cela ne me fournira que des informations que quelque chose s'est passé dans un dossier. Idéalement, je voudrais (en cours ou hors processus) intercepter quand cela se produit et d'une manière ou d'une autre injecter une exception de processus (par exemple faire WinDbg attraper cela), donc je par la callstack obtenir l'information que je veux.

Toutes les suggestions sont les bienvenues.

À la votre!

Répondre

3

Vous pouvez essayer:

  1. Utilisez un outil comme FileMon ou Process Explorer, ils pourraient être assez pour le suivre vers le bas.
  2. Utilisez une accrochage à une bibliothèque et remplacez CreateFile (ou plus de fonctions si nécessaire) avec votre propre fonction. J'ai eu une bonne expérience avec Detours, il a quelques très bons exemples que vous pouvez utiliser directement hors de la boîte.
2

Vous devez créer DLL d'injection avec CreateFile, de quelque chose comme la coutume ceci:

/** We'll create a custom version of the CreateFile (WinAPI). 
    * 
    * 
    */ 
HANDLE WINAPI __CreateFile(LPCWSTR fileName, 
          DWORD desiredAccess, 
          DWORD shareMode, 
          LPSECURITY_ATTRIBUTES securityAttributes, 
          DWORD createDisp, 
          DWORD flags, 
          HANDLE tmp) 
{ 
     // At very first, we shall call the original CreateFile. 

     HANDLE file = Real_CreateFile(fileName, 
             desiredAccess, 
             shareMode, 
             securityAttributes, 
             createDisp, 
             flags, 
             tmp); 

     /** Here, you can do whatever you wish with fileName and the handle, file. 
      * 
      * ... 
      */ 

     return file; 
}

Cependant, cela ne suffit pas. Vous aurez également besoin de bénéficier de détours ainsi:

BOOL APIENTRY DllMain(HANDLE module, DWORD reasonForCall, LPVOID reserved) 
{ 
     switch (reasonForCall) { 
       case DLL_PROCESS_ATTACH: { 
         if (::GetModuleHandle(L"blablabla.exe") == NULL) { 
           DetourTransactionBegin(); 
           DetourUpdateThread(GetCurrentThread()); 
           DetourAttach(&(PVOID &)Real_CreateFile, __CreateFile); 
           DetourTransactionCommit(); 
       } 

       break; 

       case DLL_THREAD_ATTACH: { 
       } 

       break; 

       case DLL_THREAD_DETACH: { 
       } 

       break; 

       case DLL_PROCESS_DETACH: { 
         if (::GetModuleHandle(L"blablabla.exe") == NULL) { 
           DetourTransactionBegin(); 
           DetourUpdateThread(GetCurrentThread()); 
           DetourDetach(&(PVOID&)Real_CreateFile, __CreateFile); 
           DetourTransactionCommit(); 
         } 
       } 
    } 

    return TRUE; 
}

Je laisse le reste pour votre exercice. Ceci est juste un point de direction. Vous devez également trouver une méthode IPC appropriée pour la transmission de données.

+0

+1 pour l'exemple de code. Mais Daniel était le premier, désolé :) – ralphtheninja

Questions connexes