API Hooking & accés mémoire

simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006 - 20 juil. 2006 à 12:19
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006 - 20 juil. 2006 à 12:26
Salut !

Voilà, j'essaie de faire un API Hooking sur Virtual PC pour le rendre transportable sur une clé USB.
Le but est en fait de traiter tous ses appels registres vers ma DLL, qui lui renvoie les valeurs "importantes" (numero de serie, nom utilisateur...)

Je remplace les fonction RegCreateKeyEx, OpenKey, OpenKeyEx, QueryValue, QueryValueEx et SetValueEx.

Quand je suis en mode "transparent" (je ne fais que rediriger les appels de VirtualPC vers les fonctions originales), tout est nickel, je peux meme enregistrer sans problème les paramètres qui sont passés...
ça se passe comme ça :
Virtual PC.exe => dll_hooker.dll => advapi32.dll

Maintenant, quand je veux renvoyer mes valeurs à VPC, ça plante :
Virtual PC.exe => dll_hooker.dll |
Dès que je tente d'écrire dans la section "data" de QueryValueEx, j'ai droit à un plantage de VPC.
Quand je tente de modifier les droits mémoire avec VirtualProtectEx, la fonction me renvoie un code 487 (pointeur invalide ou un truc du genre)

Si qq'1 pouvait me dire s'il a une idée du pb, il est le bienvenue !

1 réponse

simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
20 juil. 2006 à 12:26
ça ira mieux avec la fonction incriminée

LONG WINAPI reg_hook::_RegQueryValueEx( HKEY hKey, LPCTSTR valueName, LPDWORD reserve,
                LPDWORD type, LPBYTE data, LPDWORD cbData )
{
    fprintf( log, "RQVE : %x | %s\r\n", hKey, valueName );
    fflush( log );
   
    HANDLE hProcess = OpenProcess( PROCESS_VM_OPERATION, FALSE, pid );    DWORD anciens_droits 0, ad_cb 0;
   
    int i = VirtualProtectEx( hProcess, cbData, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &ad_cb );
    int err = GetLastError();
   
    // ici, i=0 et err = 487
    fprintf( log, "VPE cb : %i => %x\r\n", i, err );
    fputs( "max_len..", log );
    fflush( log );

    // c'est là que ça plante
    DWORD max_len = *cbData;
    fputs( "ok\r\n", log );
    fflush( log );

    VirtualProtectEx( hProcess, data, max_len, PAGE_EXECUTE_READWRITE, &anciens_droits );
   
    // ça, c'est temporaire
    LONG ret = oRegQueryValueEx( hKey, valueName, reserve, type, data, cbData );
   
    // ce if également
    if( ret == ERROR_SUCCESS && valueName != 0 )
    {
        if( !stricmp( valueName, "UserName" ) )
        {
            if( *cbData >= strlen("Thomas (the hooker)") )
            {
                strncpy( (LPSTR)data, "Thomas (the hooker)", strlen("Thomas (the hooker)") );
                *cbData = strlen("Thomas (the hooker)");
            }
           
            VirtualProtectEx( hProcess, data, max_len, anciens_droits, &anciens_droits );
            CloseHandle( hProcess );
        }
    }
   
    return ret;
}
0
Rejoignez-nous