2011-05-20 1 views
1

Je veux savoir quels sont les fichiers ouverts/accès par un processus. Puis-je savoir comment faire cela? J'ai essayé d'utiliser Deviare, une API gratuite pour m'aider, mais j'ai été incapable de trouver des informations utiles sur leur librairie AIP ou leur forum.Hook CreateFileW

Je sais seulement que je dois accrocher sur kernel32.dll et createFileW et je ne suis pas sûr de la façon de continuer.

Pls m'aider. Merci d'avance.

Répondre

1

C'est vrai. Vous devez accrocher la fonction CreateFileA/W dans kernel32.dll pour surveiller l'accès. Voulez-vous connecter ces API dans votre propre processus ou dans un autre processus? Si vous voulez accrocher des fonctions dans votre propre processus, vous pouvez utiliser

void *DetourFunc(BYTE *src, const BYTE *dst, const int len) 
{ 
    BYTE *jmp = (BYTE*)malloc(5+len); 
    DWORD dwback; 
    VirtualProtect(src,len,PAGE_READWRITE,&dwback); 
    memcpy(jmp,src,len); 
    jmp += len; 
    jmp[0] = 0xE9; 
    *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5; 
    src[0] = 0xE9; 
    *(DWORD*)(src+1) = (DWORD)(dst - src) - 5; 
    VirtualProtect(src,len,dwback,&dwback); 
    return (jmp-len); 
} 

pour elle. Ces fonctions détournent la fonction src (f.e. MessageBoxA()) vers la fonction dst. Comme len vous pouvez utiliser 5. Il renvoie un pointeur de fonction à la fonction d'origine. Un appel exemple:

typedef int (WINAPI *__MessageBox)(
    __in_opt HWND hWnd, 
    __in_opt LPCTSTR lpText, 
    __in_opt LPCTSTR lpCaption, 
    __in  UINT uType 
); 
__MessageBox _MessageBox; 

int cMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) 
{ 
//here you can change anything you want 
return _MessageBox(hWnd,lpText,lpCaption,uType); 
} 

int main(void) 
{ 
BYTE *hookfunc = (BYTE*)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA"); 
_MessageBox = (__MessageBox)DetourFunc(hookfunc,(BYTE*)cMessageBox,5); 
return 0; 
} 

C'est un crochet usermode. Si vous voulez faire cela à l'échelle du système, j'utiliserais un pilote de périphérique. Voici un tutoriel à ce sujet. Et si vous utilisez VC++ compilez en mode multi-octets;). Si vous voulez brancher un autre processus juste google DLL-Injection;).