IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Debuggage DLL


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut Debuggage DLL
    Bonjour,

    Pour un projet j'ai besoin de programmer un hook pour la fonction RegCreateHookEx, donc je dois faire un DLL. J'ai codé cette fonction en m'aidant de quelques fonctions d'exemples. Le problème est que ça n'a pas l'air de fonctionner, je peux appeler les fonctions de la DLL a partir d'un programme client mais je ne sais pas si les fonctions internes à la DLL fonctionne. Donc j'aimerais savoir comment debugger une DLL, et faire du pas à pas sous Visual C++.

    Si vous pouviez m'aider :p

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je dirais: Tu compiles ta DLL en version debug, tu la mets dans le répertoire de ton programme qui l'utilise, et tu exécute le programme en mode debug avec un breakpoint juste avant un appel à une fonction de la DLL...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Je vais essayer mais comment compiler la DLL en mode debug ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    si tu es sous Visual, c'est build->set active configuration -> Win32 debug.

    Sous Dev-C++, essaie en activant les options "générer les informations de débogage" dans les options du projet...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Oui merci beaucoup j'ai réussi à debogguer mais as a trouver le probleme de ma dll, je laisse le code, on sait jamais...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    // AVHookDll.cpp : Defines the entry point for the DLL application.
    //
     
    // By Taron for Anti-Viruses Project with Mùpùf (2005)
     
    #include "stdafx.h"
    #include "AVHookDll.h"
     
    #include <ImageHlp.h>
    #pragma comment(lib, "ImageHlp")
     
    #define _DEBUG_
     
     
    int __stdcall HookFunction();
     
    bool MakeHook(bool);
     
    HINSTANCE hThisMod;
    HHOOK hHook;
     
    PROC FunctionHooked, *AddressOfFunction;
     
    const char *szDllName = "Advapi32.dll";
     
    BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
    {
        switch(dwReason)
    	{
    	   case DLL_PROCESS_ATTACH:
    	   {
    	      hThisMod = hModule;
    		  MakeHook(true); 
    	   }
     
    	   case DLL_PROCESS_DETACH:
    	   {
              MakeHook(false);
    	   }
    	}
     
        return TRUE;
    }
     
    bool MakeHook(bool bToActive)
    {
    	if(bToActive)
    	{
    	   HMODULE hModCaller = GetModuleHandle(0);	
     
    	   HMODULE hLibrary = LoadLibrary(szDllName);
           if(!hLibrary) return false;
     
           FunctionHooked = GetProcAddress(hLibrary, "RegCreateKeyEx");
    	   if(!FunctionHooked) return false;
     
    	   ULONG uSize;
     
           PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
    	   ImageDirectoryEntryToData(hModCaller, true, IMAGE_DIRECTORY_ENTRY_IMPORT, &uSize);
     
    	   if(!pImportDesc) return false;
     
    	   for(; pImportDesc->Name ; pImportDesc++)
    	   {
    		  PSTR pszModName = (PSTR)((BYTE) hModCaller + pImportDesc->Name);
              if(lstrcmpiA(pszModName, szDllName) == 0) break;
    	   }
     
    	   if(!pImportDesc->Name) return false;
     
           PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((BYTE) hModCaller + pImportDesc->FirstThunk);
     
           for(; pThunk->u1.Function ; pThunk++)
    	   {
              PROC *pFn = (PROC *)&pThunk->u1.Function;
     
    		  if(*pFn == FunctionHooked)
    		  {
    		     AddressOfFunction = pFn;
    			 break;
    		  }
    	   }
     
           DWORD dwOld;
    	   VirtualProtect(AddressOfFunction, 4, PAGE_EXECUTE_READWRITE, &dwOld);
     
           *AddressOfFunction = HookFunction;
           VirtualProtect(AddressOfFunction, 4, dwOld, 0);
    	}
     
        else
    	{
           DWORD dwOld;
    	   VirtualProtect(AddressOfFunction, 4, PAGE_EXECUTE_READWRITE, &dwOld);
     
    	   *AddressOfFunction = FunctionHooked;
    	   VirtualProtect(AddressOfFunction, 4, dwOld, 0);
    	}
     
    	return true;
    }
     
    int __stdcall HookFunction()
    {
        HANDLE hFile;
        hFile = CreateFile("avhook.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 
    		               FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
     
        WriteFile(hFile, "Tentative d'écriture détectée !", 32, 0, 0); 
     
        return 0;
    }
     
    LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
     
    extern "C" AVHOOKDLL_API void InstallHook()
    {
       #ifdef _DEBUG_
    	MessageBox(0, "InstallHook", "DEBUG", MB_OK);
       #endif
     
    	if(!hHook) hHook = SetWindowsHookEx(WH_CBT, HookProc, hThisMod, 0);
    }
     
    extern "C" AVHOOKDLL_API void UninstallHook()
    {   
       #ifdef _DEBUG_
    	MessageBox(0, "UninstallHook", "DEBUG", MB_OK);
       #endif
     
    	UnhookWindowsHookEx(hHook);
    	hHook = 0;
    }
    Lors du debug j'ai remarqué que la valeur de hModule etait nulle, qu'il y'avait une erreur deja a ce niveau la je ne comprends pas.

    Si vous avez des idées...
    Merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    HMODULE hLibrary = LoadLibrary(szDllName);
    Tu demandes à la librairie de se charger elle-même ? ou bien de charger advapi32.dll ?

    Tu sais, ce n'est pas la peine de charger dynamiquement advapi32.dll pour avoir accès à RegCreateKeyEx: lorsqu'une DLL est chargée, toutes les DLL référencées par celle-ci sont chargées aussi (bref, il te suffit de lier ta DLL à advapi32.lib et d'appeler directement RegCreateKeyEx, et ça devrait marcher)... Enfin, je pense: Je n'ai jamais programmé de hook, alors ne prend pas ce que je dis pour argent content...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PSTR pszModName = (PSTR)((BYTE) hModCaller + pImportDesc->Name);
              if(lstrcmpiA(pszModName, szDllName) == 0) break;
    T'aurais pas oublié une étoile après BYTE, là ? à mon avis, tu cherches à transtyper un HMODULE en adresse de base, pas en octet... ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Citation Envoyé par Médinoc
    HMODULE hLibrary = LoadLibrary(szDllName);
    Tu demandes à la librairie de se charger elle-même ? ou bien de charger advapi32.dll ?
    Je cherche ici à charger advapi32.dll, pour par la suite obtenir l'adresse de la fonction RegCreateKeyEx via un GetProcAddress().
    Ca devrait revenir exactement au même que la technique que tu me proposes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PSTR pszModName = (PSTR)((BYTE) hModCaller + pImportDesc->Name);
              if(lstrcmpiA(pszModName, szDllName) == 0) break;
    T'aurais pas oublié une étoile après BYTE, là ? à mon avis, tu cherches à transtyper un HMODULE en adresse de base, pas en octet... ?
    Si :-)

    Mais tu vois pas d'erreur en ce qui concerne la dll proprement dite ?
    Parce que par exemple lorsque j'insere un MessageBox() dans MakeHook(), aucune Msgbox ne s'affiche, alors que si j'insere MessageBox dans InstallHook() ou UninstallHook() la Msgbox s'affiche ; alors je comprends pas grand chose... (peut-être est-ce normal ?)

    Merci pour ton aide.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Hélas, je ne connais pas assez les hooks pour te répondre et être sûr de ma réponse...
    Mais comme MakeHook() est appelée depuis DllMain(), il est possible que ça foire si ta DLL est chargée au démarrage du programme: Si elle est chargée avant User32.dll, la MessageBox ne pourra pas s'afficher...

    Et aussi, tu vas devoir sortir complètmeent MakeHook() de DllMain(), car tu n'as pas lu les toutes petites lignes :
    Citation Envoyé par MSDN
    Access to the entry point is serialized by the system on a process-wide basis. Threads in DllMain hold the loader lock so no additional DLLs can be dynamically loaded or initialized.
    Citation Envoyé par MSDN
    the entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions)
    En clair, tu vas devoir faire de MakeHook() une fonction exportée comme les autres...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Citation Envoyé par Médinoc
    En clair, tu vas devoir faire de MakeHook() une fonction exportée comme les autres...
    Entièrement d'accord

    Pour voir un exemple de hook, tu peux regarder ici http://c.developpez.com/faq/vc/?page...s#HookKeyboard et notamment dans le .zip

  10. #10
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Ok, merci pour vos infos...
    Donc : je met la fonction MakeHook() en extern et je dois déplacer l'appel de cette fonction de DllMain(), et normalement ca devrait fonctionner.
    Une question : est-il possible de mettre MakeHook() en extern ET l'appeller à partir de la fonction InstallHook() ? Comme ça je ne devrai qu'appeller InstallHook() depuis un programme client, et ce-dernier appellera MakeHook() lui-même...
    Farscape : ton example, ok, mais je peux l'appliquer dans mon cas, là je place un hook sur la fonction RegCreateKeyEx, c'est un peu plus galere...

    Merci à vous deux.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Appeler MakeHook() dans InstallHook(), je n'y vois aucun inconvénient, à moins qu'un truc vicieux m'ait échappé...

    L'important, c'est de ne pas appeler n'importe quoi dans LoadLibrary(). En théorie, tu peux parfaitement appeler MakeHook() dans InstallHook(), du moment que tu n'appelles pas InstallHook() dans DllMain()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Ok, ben merci beaucoup à vous tous et j'essaye ça dès que possible :-)
    Bye !

Discussions similaires

  1. [LabVIEW 7.1] Debuggage d'une dll
    Par vbbarent dans le forum LabVIEW
    Réponses: 4
    Dernier message: 28/08/2008, 17h27
  2. Debuggage de DLL sous Visual C++
    Par Rolsct dans le forum Windows
    Réponses: 3
    Dernier message: 09/08/2006, 15h47
  3. Réponses: 4
    Dernier message: 28/04/2006, 15h37
  4. [C#]Debuggage d'une dll
    Par gmonta dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 02/12/2005, 09h33
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo