April 2010 - Artículos

Cambiar el Registro con scripts: Archivos INF

Los scripts son un modo eficiente de implementar y cambiar configuraciones. Son útiles en muchos niveles. Podemos escribir un script que cambie un grupo de valores y probarlo en un entorno de test antes de implantarlo.

Los métodos de creación de scripts son varios: el primero tal vez, el uso de archivos INF, simples y de hecho no hay valor del registro que se le resista. Archivos REG, con los que podemos exportar configuraciones desde el Regedit. Windows Script Host, uso de Jscript o VBscript. Finalmente quizás, el uso de Windows Installer para crear paquetes de distribución de configuraciones.

La primera encrucijada del camino es como siempre, la elección. ¿Qué técnica elegimos?

Veamos una tabla comparativa:

Características

INF

REG

Lotes

Script

MSI

Dificultad media baja media alta media
Acceso al Sistema basico ninguno completo completo basico
Soporte integrado
Cambia valores
Añadir claves/valores
Eliminar claves/valores sólo claves
Consultar valores no no no
Soporte para tipos de valores alto medio medio bajo medio
Soporte a nivel de bits no no no

 

El método más sencillo a la vista de la tabla es el uso de los REG, aumentando la dificultad en los script y los paquetes de windows installer. El acceso al sistema sólo es importante si estamos intentando hacer algo más que editar el Registro, por ejemplo leer valores y volcarlos en un archivo de texto. La diferencia más importante que se observa es que solamente los INF y los scripts proporcionan una compatibilidad alta para los diferentes tipos de valor que se pueden almacenar en el Registro. Y además estos dos son también los únicos métodos con los que podemos establecer y eliminar bits en los valores.

Archivos INF

Los archivos de información de instalación tienen la extensión INF, comúnmente archivos INF. Las API usan los INF para escribir instalaciones. La mayoría de la gente los asocia con las instalaciones de controladores de dispositivo, pero las aplicaciones también los usan. La mayoría de acciones asociadas con la instalación de aplicaciones o controladores están disponibles mediante archivos INF. Podemos copiar, eliminar y renombrar archivos; añadir, cambiar y eliminar valores del Registro; instalar e iniciar servicios; podemos instalar cualquier cosa.

Los INF se ven similares a los INI o REG. Son archivos de texto que contienen secciones, como [Section], en cada sección encontramos elementos, denominados propiedades a veces, al estilo nombre_valor=valor. En Windows tenemos el editor cuasiperfecto, Notepad (a mi me gusta más Notepad++). La instalación de un INF es sencilla: clic derecho e Instalar. Para la distribución mediante una infraestructura de distribución de software y evitar que los usuarios lo instalen manualmente, se usa el comando siguiente rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 nombre_Archivo.inf.

Un ejemplo de INF:

[Version]
Signature=$CHICAGO$

[DefaultInstall]
AddReg=Add.Settings
DelReg=Del.Settings

[Add.Settings]
HKCR, regfile\shell,,0,"edit"

[Del.Settings]
HKCU,Software\Microsoft\Windows\CurrentVersion\Applets\Regedit

La primera sección, [Version], es obligatoria. El nombre de la segunda es aleatoria, aunque se suele usar la que veis. Cuando observais el comando de ejecución de rundll32.exe, ejecuta la API setupapi.dll llamada InstallHinfSection, el siguiente elemento es DefaultInstall que es la sección que comento, si cambiamos el nombre en el INF, se debe cambiar el nombre en el comando, el 132 indica a la API que pregunte al usuario antes de un reinicio.

En el ejemplo hay dos directivas: AddReg, que añade la configuración contenida en la sección Add.Settings y la DelReg que elimina la contenida en la sección Del.Settings. Los nombres pueden ser cualesquiera.

DefaultInstall

Esta sección va detrás de la de Version, y aunque el nombre puede ser arbritario si queremos que los usuarios sean capaces de instalarlo con clic derecho debemos usar [DeafultInstall] ya que el comando asociado a dicha extensión lo tiene como referencia. Aquí se enlaza el archivo INF. Se llena con directivas que le dirán a la API de instalación qué secciones del archivo hay que procesar y que hacer con ellas.

Cada línea es una directiva, la API es compatible con varias de ellas, pero las más importantes quizás son AddReg, DelReg y BitReg. Por ejemplo AddReg=Add.Settings, esto lo que hace es añadir la configuración contenida en la sección Add.Settings. Y el orden entre dichas directivas no es importante, el motivo es que la API proceesa primero las DelReg y luego las AddReg.

La sintaxis

ADDREG

Podemos añadir nuevas llaves, establecer valores, crear nuevos valores o modificar los existentes con el uso de una sección AddReg, al tiempo que cada sección puede contener múltiples entradas, teniendo en cuenta que cada sección ha de tener un nombre único dentro del archivo INF.

Su sintaxis es: [Add-registry-section] llave_raíz, [subllave], [valor], [marca], [datos]

llave_raíz: Llave raíz que contiene la llave o valor que estamos modificando, usamos las abreviaturas HKCR, HKCU, HKLM o HKU.

subllave: Subllave a crear o a la cual hemos de añadir o cambiar un valor. Es opcional, si no está presente las operaciones se efectúan sobre la llave_raíz.

valor: Nombre del valor a crear o modificar si ya existe. Es opcional, si se omite y se dan los parámetros marca y datos, las operaciones son con el valor predeterminado de la llave. Si se omiten los tres, se añade una subllave.

marca: Diversos valores posibles:

0x00000000 Valor predeterminado si se omite la marca.
REG_SZ.
0x00000001 REG_BINARY
0x00010000 REG_MULTI_SZ
0x00020000 REG_EXPAND_SZ
0x00010001 REG_DWORD
0x00020001 REG_NONE
0x00000002 No reemplaza valores y llaves existentes. Se combina con otras marcas mediante OR.
0x00000004 Elimina la subllave del Registro, o borra el valor de la subllave. Se combina con otras marcas mediante OR.
0x00000008 Añade datos al valor. Es válida sólo si el valor es REG_MULTI_SZ. La cadena no se añade si ya existe. Se combina con 0x00010000 mediante OR.
0x00000010 Crea una subllave, pero ignora el valor y datos especificados. Se combina con otras marcas mediante OR.
0x00000020 Establece el valor sólo si ya existe. Se combina con otras marcas mediante OR.
0x00001000 Realiza el cambio especificado en el Registro de 64 bits. Si no se especifica, se realiza sobre el Registro nativo. Se combina con otras marcas mediante OR.
0x00004000 Realiza el cambio especificado en el Registro de 32 bits. Si no se especifica, se realiza sobre el Registro nativo. Se combina con otras marcas mediante OR.

datos: Datos a escribir en el valor. Si el valor no existe, se crea, si existe, se reemplaza; si es un REG_MULTI_SZ y está la marca 0x00010008 se añade; si se omite, se crea sin datos.

DELREG

Esta sección [Del-registry-section] especifica las secciones que contienen valores y llaves del Registro a eliminar. Cada sección puede contener múltiples entradas y el nombre de cada sección debe ser único en el archivo.

Su sintaxis es: [Del-registry-section] llave_raíz, [subllave], [valor], [marca], [datos]

marca: Los valores son:

0x00002000 Elimina la subllave entera.
0x00004000 Realiza el cambio en el Registro 32 bits.
0x00018002 Si el valor es REG_MULTI_SZ, borra todas las cadenas coincidentes con la especificada en [datos].

datos: Sólo se usa cuando la marca es 0x00018002.

BITREG

Esta directiva es similar a la de AddReg. Se añade para indicar las secciones que contienen bits a establecer o quitar. Se usa cuando se quiere usar máscaras de bit en el Registro.

Las diferencias de sintaxis con AddReg son:

- El parámetro valor no es opcional.

- El valor datos se reemplaza por mascara y byte. mascara es de 8 bits e indica el bit que queremos habilitar o deshabilitar; byte indica el byte en el valor binario a modificar. Esto indica los bytes de izquierda a derecha desde 0. Esto es sencillo cuando se trabaja con valores REG_BINARY, pero no si se trata de valores REG_DWORD.

Su sintaxis es: [Bit-registry-section] llave_raíz, [subllave], [valor], [marca], mascara, byte

marca: los valores son:

0x00000000 Quita los bits especificados en mascara.
0x00000001 Establece los bits especificados en mascara.
0x00040000 Realiza el cambio en el Registro 32 bits.

mascara: Bits especificados a establecer o quitar en byte. Se usa la notación hexadecimal. Los 1 serán establecidos o eliminados segun la marca, los 0 se ignoran.

byte: Especifica el byte en el valor al que queremos aplicar la mascara. El más a la izquierda es 0, el siguiente 1, y así. RECUERDA!  cuando especificamos el byte al que se quiere aplicar, Windows almacena los REG_DWORD en orden de byte-inverso, por lo tanto, en este tipo de valor el byte más a la derecha es el primero en memoria.

Cadenas dentro de los INF

Para facilitar la lectura de los INF podemos usar la sección [Strings], donde cada entrada es del tipo nombre="cadena". Pudiendo usarla en cualquier parte del INF referenciándola con %nombre"%.

Publicado por Juansa con no comments

Buscando valores en el Registro: Auditoría

Como ya hemos visto, comparando dos instantáneas del registro nos puede servir para encontrar valores, aunque controlarlos ya es otra cosa. El método para control más conocido es la Auditoría, aunque puede que las desventajas superen a las ventajas en este caso. Lo primero es la necesidad de saber exactamente donde se encuentra el valor a auditar, ya que auditar el registro al completo sería impracticable. Segundo, descifrar los resultados de una auditoría es bastante engorroso. Está basado en la observación de eventos en el visor de sucesos y la salida no es demasiado intuitiva.

El proceso de auditar el registro en busca de cambios se divide en tres pasos: Habilitar la directiva de auditoría; Auditar las ramas donde creemos tener el valor localizado; Después del seguimiento, revisar los archivos de registro en el visor de sucesos y ver los cambios que han ocurrido.

Habilitar la auditoría

audita01 audita02 audita03

 

 

 

 

Auditar las ramas elegidas

audita04 audita05 audita06 audita07

 

 

 

Abrir el visor y analizar los archivos de registro

Monitorizar

A diferencia de comparar dos instantáneas del Registro aquí vemos el acceso al registro tal como ha sucedido, es decir, si hay un cambio en el interfaz de usuario vamos al monitor y vemos lo que Windows escribió en el Registro.

Una herramienta interesante es Regmon.

audita08 

Cada vez que algún programa o el mismo Windows accede al Registro, Regmon añade una fila a la ventana, mostrando número de línea, hora, nombre del proceso que accede al registro, tipo de acceso, ruta, resultado y otros.

Lo más interesante es el tipo de acceso, la ruta de la llave y la columna Otros.

La columna Request nos dice que es lo que el programa o Windows intentan hacer, son diversas funciones API, entre las que sobresale SetValue.

Tipo de acceso

Columna Otros

CloseKey Puntero a llave cerrada
CreateKey Puntero a nueva llave
CreateKeyEx Puntero a nueva llave
DeleteKey nada
DeleteValue nada
DeleteValueKey nada
EnumerateKey Nombre de la siguiente subllave
EnumKeyEx Nombre de la siguiente subllave
EnumerateValue Nada
FlushKey Nada
OpenKey Puntero a la llave abierta
OpenKeyEx Puntero a la llave abierta
QueryKey Nombre de la llave
QueryValue Datos del valor
QueryValueEx Datos del valor
SetValue Dato almacenado en el valor
SetValueEx Dato almacenado en el valor

Al abrir Regmon nos encontramos con una multitud de accesos al registro, la salida es ruídosa. Lo que nos interesa es filtrarlo de modo que nos muestre lo que realmente estamos interesados en buscar. Si queremos ver donde Windows almacena un valor, filtraremos todo menos las solicitudes de escritura.

En el menú de Regmon, options, pulsamos en Filter/Highlight y des/seleccionamos las casillas. Si queremos ser más precisos, filtramos por procesos, por llaves…

Publicado por Juansa con no comments