El Registro: estructura

La estructura del registro de Windows es muy parecida a la estructura del sistema de archivos:

 

registro explorador

 

En el editor del registro (ya charlaremos sobre el), se muestra en el árbol de la izquierda, panel de llaves, la jerarquía del registro. Aquí cada carpeta es una llave del registro. A la derecha, panel de valores, observamos los valores de las llaves. El explorador de Windows nos muestra también la jerarquía de carpetas y los valores en dos paneles.

Llaves

Las llaves son similares a las carpetas ya que tienen las mismas reglas de nombrado. Podemos anidar una o más llaves dentro de otra llave, mientras sus nombres sean únicos dentro de cada llave. El nombre está limitado a 512 caracteres ANSI o 256 Unicode y podemos usar cualquier carácter ASCII que no sea la barra invertida , el asterisco *, y la interrogación ?. Windows se reserva todos los nombres que comienzan con un periodo para su propio uso.

Las similitudes entre el registro y el sistema siguen con las rutas. La ruta C:WindowsSystem32notepad.exe se refiere al archivo Notepad.exe en la unidad C, carpeta Windows, subcarpeta System32. La ruta HKLMSystemCurrentControlSetControlCurrentUser se refiere al valor CurrentUser de la llave raíz HKLM, que se encuentra en la subllave Control de la subllave de SYSTEM llamada CurrentControlSet. Notación de nombre cualificado con el que frecuentemente nos referiremos a una llave y todas sus subllaves como una RAMA.

Como punto a tener en cuenta me referiré a las llaves enlazadas. Windows almacena perfiles de hardware en la RAMA HKLMSYSTEMCurrentControlSetHardware Profiles, cada perfil es una subllave xxxx, donde xxxx es un número incremental que comienza por 0000. La subllave Current es un enlace a toda llave que actualmente se encuentre en los perfiles de hardware, y la llave Raíz HKCC es un enlace a Current.

registro02 

Valores

Cada llave contiene uno o más valores. El nombre de un valor es parecido al nombre de un archivo. El tipo de un valor es similar a la extensión de un archivo, que es lo que indica su tipo. Los datos del valor es parecido al contenido actual del archivo. Si pulsamos en una llave del registro en el panel de llaves del editor, el panel de valores nos mostrará los pertenecientes a dicha llave. En el panel de valores observamos tres columnas, correspondientes a tres partes de un valor:

  • Nombre. Todo valor tiene un nombre. Con las restricciones ya comentadas. Dentro de cada llave ese nombre será único, pudiendo usar el mismo nombre en distintas llaves.
  • Tipo. Cada tipo de valor determina el tipo de dato que puede contener. REG_DWORD un número double-word, REG_SZ una cadena, etc…
  • Datos. Cada valor puede estar vacio, nulo o puede contener datos. Los datos se limitan a 32767 bytes, aunque el límite práctico son 2KB. Los datos se corresponden con su tipo, exceptuando los valores binarios que pueden contener cadenas, doble-words, o cualquier otro.

Cada llave contiene al menos un valor, el valor predeterminado. Casi siempre una cadena, pero algunos programas lo cambian por otros tipos. En muchos casos el valor predeterminado es NULL y el editor nos indica ‘valor no establecido’.

Tipos

  • REG_BINARY
    • Datos binarios, se muestran en hexadecimal y se introducen datos binarios en hexadecimal.
  • REG_DWORD
    • Valores doble-word de 32 bits. Muchos son banderas booleanas (si o no). Valores de tiempo en milisegundos. Números de 32-bits, firmados o no (hay unos rangos). Los valores se ven en decimal o hexadecimal.
  • REG_DWORD_BIG_ENDIAN
    • Orden de los bytes Big_Endian
  • REG_DWORD_LITTLE_ENDIAN
    • Orden de los bytes Little-Endian
  • REG_EXPAND_SZ
    • Texto de longitud variable. Puede incluir variables de entorno que se expandirán luego por el programa antes de su uso.
  • REG_FULL_RESOURCE_DESCRIPTOR
    • Lista de recursos para un dispositivo o controlador de dispositivo. Importante para el Pinchar y Listo P&P.
  • REG_LINK
    • Enlace. No los podemos crear nosotros.
  • REG_MULTI_SZ
    • Valores binarios que contienen listas de cadenas. El editor muestra una cadena por cada línea y nos permite editarlas. Un carácter nulo 0x00 separa cada cadena y dos nulos el final de la lista.
  • REG_ONE
    • Sin tipo definido
  • REG_QWORD
    • Quadruple-word (64 bits).
  • REG_QWORD_BIG_ENDIAN
    • Quadruple-word (64 bits). Como Big_Endian.
  • REG_QWORD_LITTLE_ENDIAN
    • Quadruple-word (64 bits). Como Little-Endian.
  • REG_RESOURCE_LIST
    • Lista de los valores de REG_FULL_RESOURCE_DESCRIPTOR. El editor nos deja verlos pero no editarlos.
  • REG_RESOURCE_REQUERIMENTS_LIST
    • Lista de recursos que un dispositivo necesita. No podemos editarlo.
  • REG_SZ
    • Texto de longitud fija. Es el más común, otro valor REG_DWORD. La cadena termina con un carácter nulo y los programas no expanden las variables de entorno contenidas en valores RG_SZ.

De todos los valores del registro, el valor binario es el menos sencillo. Cuando una aplicación lee un valor binario desde el registro, descifrar su contenido le corresponde a ese programa. Esto significa que las aplicaciones pueden almacenar datos en valores binarios usando sus propias estructuras de datos, que no significan nada para nosotros u otros programas. También, las aplicaciones, frecuentemente, almacenan datos REG_DWORD y REG_SZ en REG_BYNARY, lo que dificulta su búsqueda y descifrado.

Ahora se complica, el registro en la actualidad almacena todos los valores como valores binarios. Las API del registro identifican cada tipo de valor mediante un número, al que los programadores se refieren como constante, y que se tiende a denominar como el número de tipo.

Número

Tipo

0 REG_ONE
1 REG_SZ
2 REG_EXPAND_SZ
3 REG_BINARY
4 REG_DWORD
4 REG_DWORD_LITTLE_ENDIAN
5 REG_DWORD_BIG_ENDIAN
6 REG_LINK
7 REG_MULTI_SZ
8 REG_RESOURCE_LIST

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *