2011-11-21 30 views
6

Después de leer this post en SO Intenté escribir una pequeña aplicación que necesito para leer y escribir claves/valores de registro ocultos.
Marqué Registry Manipulation using NT Native APIs y Creating "Hidden" Registry Values enlaces.
Primero me dio algo para trabajar, pero está escrito en C++, mientras que el segundo es un proyecto Delphi que funciona bien.
No puedo convertir primero y puedo intentar convertir el segundo, pero también necesito encontrar algún código para leer claves/valores. Por esta razón, me gustaría saber si hay algo "listo" y probado en C#.
También descargué Proces Hacker código fuente v1.11 y lo usé para convertir parcialmente el ejemplo de Delphi como se muestra a continuación, pero la clave de registro oculta es accesible (mientras que en Delphi no lo estaba) y no hay API para escribir valores.Claves/valores de registro ocultos

static void Main(string[] args) 
{ 
    string KeyNameBuffer = @"\Registry\User\S-1-5-21-3979903645-2167650815-2353538381-1001\SOFTWARE"; 
    string NewKeyNameBuffer = "Systems Internals"; 
    string HiddenKeyNameBuffer = "Can't touch me\0"; 
    string HiddenValueNameBuffer = "Hidden Value"; 

    // Apro la chiave di registro 
    IntPtr SoftwareKeyHandle = CreateKey(KeyNameBuffer, IntPtr.Zero); 
    if (SoftwareKeyHandle != IntPtr.Zero) 
    { 
     IntPtr SysKeyHandle = CreateKey(NewKeyNameBuffer, SoftwareKeyHandle); 
     if (SysKeyHandle != IntPtr.Zero) 
     {   
      // This key shouldn't be accessible, but it is    
      IntPtr HiddenKeyHandle = CreateKey(HiddenKeyNameBuffer, SysKeyHandle); 
      if (HiddenKeyHandle != IntPtr.Zero) 
      { 
       // I don't have APIs to write values 
      } 
     } 
    } 
} 

static IntPtr CreateKey(string keyName, IntPtr rootKey) 
{ 
    IntPtr res; 
    KeyCreationDisposition disp; 
    ObjectAttributes attributes = new ObjectAttributes(keyName, 
     ObjectFlags.CaseInsensitive, 
     new NativeHandle(rootKey)); 
    NtStatus st = Win32.NtCreateKey(out res, KeyAccess.All, 
     ref attributes, 0, 
     IntPtr.Zero, RegOptions.NonVolatile, out disp); 
    return st == NtStatus.Success ? res : IntPtr.Zero; 
} 

Por último: desde Vista en, no se puede escribir \Registry\Machine parte, si no se está ejecutando la aplicación como administrador, por lo que en el ejemplo he usado mi clave de registro de usuario. ¿Hay alguna forma de que las API nativas escribamos esa parte del registro si necesito almacenar un valor por máquina?

Respuesta

1

Si lo quiere en HKLM y los privilegios no le permiten, no importa qué capa de API está usando, Reg * funciones de Nt * ones - no le permitirá hacer eso con acceso denegado error.