2011-07-26 12 views
1

Je programme une DLL. Dans cette DLL, je veux accrocher la fonction d'un autre dll chargée en mémoire. Ceci est le résultat de nombreuses heures de travail:Crochet de fonction C++ (dll, asm)

typedef int (__fastcall *def_cry)(int a,int b,int fromlen); 
def_cry Real_cry; 
int __fastcall custom_cry(int a,int b,int fromlen) { 
    Log("cry ..."); 
    __asm nop; 
    return Real_cry(a, b, fromlen); 
} 
DWORD imageBaseOtherDll = 0x39500000; 
DWORD functionOffset = 0x395742F8; 
DWORD imageBase = (DWORD)GetModuleHandle("otherDll.dll"); 
DWORD functionOffset = imageBase + (functionOffset - imageBaseOtherDll); 
Real_cry = (def_cry)DetourFunction((PBYTE)functionOffset,(PBYTE)&custom_cry); 

Il semble que mon crochet ne fonctionne pas. Je pense que je mets quelques erreurs logiques dans le code mais je suis un débutant et aidé!

+0

asm - s'il vous plaît ajouter quelques détails, comme quoi avez-vous essayé jusqu'à présent, et ce que vous pensez que le problème est. Affinez l'objectif de votre problème. Si vous demandez "Pouvez-vous regarder cela et le réparer?" Vos questions seront rejetées et fermées. – Josh

+0

(+1) - guy est nouveau, ne lui donnez pas envie de fuir stackoverflow en le "-1ing" lui ... Je pense que la question est assez claire. – Cipi

Répondre

3

Etes-vous sûr que la fonction que vous utilisez utilise la convention d'appel __fastcall? Pour accrocher une fonction exportée depuis une DLL, vous devrez soit patcher les tables d'import de tous les modules (dll/exe) qui l'appellent ou réécrire le point d'entrée des fonctions lors de l'exécution. Un article décent sur patcher la table d'importation peut être trouvé sur CodeProject here. Un bon tutoriel sur l'utilisation de MS Detours peut être trouvé here.

Vous devez indiquer l'adresse de la fonction que vous voulez connecter lorsque vous appelez DetourFunction. Ces valeurs ne doivent pas être codées en dur car votre DLL ne garantit pas le chargement à une adresse spécifique. Cela peut être fait assez facilement avec le code suivant:

// Get the module containing the function to hook 
HMODULE targetModule = GetModuleHandle("otherDll.dll"); 
// Get the address of the function to hook 
FARPROC targetFunction = GetProcAddress(targetModule, "cry"); 
// Go hook it. 
Real_cry = (def_cry)DetourFunction((PBYTE)targetFunction,(PBYTE)&custom_cry);