2017-06-05 4 views
0

J'essaie de créer un programme qui analyse une DLL COM et crée un fichier reg des clés de registre nécessaires, sans avoir à appeler regsvr32 et sans avoir à avoir des autorisations administratives. Pour ce faire, j'utilise RegOverridePredefKey pour réorganiser les ruches du registre Windows dans une sous-clé de HKEY_CURRENT_USER.Analyse du registre COM dll sans droits d'administrateur

https://msdn.microsoft.com/pt-br/library/windows/desktop/ms724901(v=vs.85).aspx

Le remappage travaille. Je sais parce que je peux, par exemple, appeler une fonction Windows API pour créer une clé de registre bidon sous HKEY_LOCAL_MACHINE et il apparaît réellement sous ma sous-clé HKEY_CURRENT_USER. Aucun privilège d'administrateur requis.

Voici le code remaping:

if (reg::remapRegistry(HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, basekey + "hkcr")) 
    { 
     if (reg::remapRegistry(HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, basekey + "hklm")) 
     { 
      if (reg::remapRegistry(HKEY_USERS, HKEY_CURRENT_USER, basekey + "hku")) 
      { 
       if (reg::remapRegistry(HKEY_CURRENT_USER, HKEY_CURRENT_USER, basekey + "hkcu")) 
       { 
        reg::createKey(HKEY_LOCAL_MACHINE, "Software\\Classes"); 
        reg::createKey(HKEY_CURRENT_USER, "Software\\Classes"); 
        ret = scan(args); 
        reg::cancelRemapedRegistry(HKEY_CURRENT_USER); 
       } 
       reg::cancelRemapedRegistry(HKEY_USERS); 
      } 
      reg::cancelRemapedRegistry(HKEY_LOCAL_MACHINE); 
     } 
     reg::cancelRemapedRegistry(HKEY_CLASSES_ROOT); 
    } 

Le paramètre args à ma fonction de balayage est juste une structure avec le chemin de ma dll. Les fonctions reg :: sont juste des wrappers autour de windows api.

Voici ma fonction scan:

int scan(const Args &args) 
{ 
typedef HRESULT (__stdcall *pDllRegisterServer) (void); 
try 
{ 
    HMODULE hDLL = LoadLibrary(args.dll.c_str()); 
    if (hDLL == NULL) 
    { 
     LOGERROR("Cannot load dll"); 
     return 1; 
    } 

    pDllRegisterServer DllRegisterServer = (pDllRegisterServer) GetProcAddress(hDLL, "DllRegisterServer"); 
    if (DllRegisterServer == NULL) 
    { 
     LOGERROR("Cannot find function DllRegisterServer in dll"); 
     FreeLibrary(hDLL); 
     return 2; 
    } 

    HRESULT res = DllRegisterServer(); 
    DWORD err = GetLastError(); 

    switch (res) 
    { 
    case S_OK: 
     LOGINFO("successfully called DllRegisterServer"); 
     return 0; 
    case SELFREG_E_TYPELIB: 
     LOGERROR("DllRegisterServer error SELFREG_E_TYPELIB"); 
     return 3; 
    case SELFREG_E_CLASS: 
     LOGERROR("DllRegisterServer error SELFREG_E_CLASS"); 
     return 4; 
    case E_OUTOFMEMORY: 
     LOGERROR("DllRegisterServer error E_OUTOFMEMORY"); 
     return 5; 
    case E_UNEXPECTED: 
     LOGERROR("DllRegisterServer error E_UNEXPECTED"); 
     return 6; 
    default: 
     LOGERROR("DllRegisterServer really unexpected error"); 
    } 

    return 7; 
} 
catch (...) 
{ 
    LOGERROR("unknown error loading dll or function"); 
    return -1; 
} 
} 

DllRegisterServer retourne S_OK mais seulement la moitié des clés de registre sont en cours de création. Mon HKEY_CLASSES_ROOT remappé sous HKEY_CURRENT_USER \ tempkey \ hkcr contient toutes les clés attendues. Mais HKEY_CURRENT_USER \ tempkey \ hklm (remappé HKEY_LOCAL_MACHINE) ne contient que les clés vides "Software \ Classes" que j'ai créées moi-même. Il manque les clés "TypeLib" et "Interface" que DllRegisterServer était censé créer.

Ce n'est pas un problème de remappage ou d'autorisation car je peux créer les «classes \ logiciel» vides sous HKEY_LOCAL_MACHINE sans droits d'administrateur.

Étrangement, le test sur un autre ordinateur DllRegisterServer a échoué avec SELFREG_E_TYPELIB.

J'ai également essayé d'appeler LoadTypeLib() et RegisterTypeLib() pour lequel j'obtiens le code d'erreur "0x8002801c Erreur lors de l'accès au registre OLE".

Si je redémarre ensuite Visual Studio en tant qu'administrateur et réexécute le programme, j'obtiens toutes les clés de registre attendues, y compris celles sous HKLM.

Des idées sur les raisons de l'échec et comment faire fonctionner cette machine?

Je sais qu'il est possible d'obtenir toutes les clés de registre sans être administrateur, car l'outil moisson de heat de wix le fait avec succès. J'ai déjà inspecté leur code source et je crois que je fais déjà tout ce qu'ils font. Et je ne veux pas avoir le jeu d'outils wix comme une condition à mon environnement de construction juste pour le faire, aussi parce que je devrais analyser leur format de fichier dans un fichier * .reg.

+0

Vous n'avez pas besoin de droits d'administrateur pour l'accès en LECTURE SEULE à HKCR et HKLM.Avez-vous vraiment besoin de copier tout au lieu de simplement lire les entrées existantes là-bas? –

Répondre