#Winlogon Notification Package

#Autor: Machine_Dramon

La funcionalidad de "Winlogon Notification Packages" soportada por los Windows 2K y XP permite cargar archivos DLL dentro del proceso de WinLogon.exe para responder a eventos generados por WinLogon. A esta caracteristica se le puede dar algun uso malicioso, si se consigue ejecutar el codigo necesario para agregar una DLL, en el contexto de un usuario con suficientes privilegios para modificar la rama del registro necesaria.

Pasos para agregar una DLL:
Modificar el Registro:

Crear una Sub-Clave bajo la rama del registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify

En este caso crearemos una Sub-Clave llamada Gedzac. Necesitamos crear los valores necesarios dentro de la Sub-Clave, para indicar el Path de la DLL y otras opciones:
Asynchronous (REG_DWORD) [0 / 1]
Indica si las llamadas a las funciones de la DLL que manejan los eventos se deben llamar en forma asincrona, si se establece a 1 WinLogon ejecuta la funcion en un hilo independiente. Si la funcion debe acabar antes de que el usuario obtenga el control establecer en 0.

DllName (REG_SZ)
La ruta completa de la DLL

Impersonate (REG_DWORD) [0 / 1]
Indica si se debe personificar el contexto de seguridad del usuario actual, cuando se llama a las funciones de la DLL, si se establece a 1 WinLogon utiliza la personificación.

Necesitamos indicar cuales eventos manejara la DLL, para esto debemos crear un valor de tipo cadena (REG_SZ) dentro de la Sub-Clave, por cada evento que queremos que la DLL maneje, el nombre del valor debera ser el nombre del evento y su contenido el nombre de la funcion que la DLL exporta para manejar dicho evento.
Los eventos que puede manejar la DLL son:
Lock
Evento que ocurre cuando se "bloquea" el sistema, como cuando se ejecuta el ScreenSaver estando marcada la opcion "Mostrar pantalla de bienvenida al volver" o se presiona las teclas WIN+L.
Logoff
Evento que ocurre cuando un usuario cierra sesion en el sistema, este evento siempre se maneja en forma sincrona, independientemente de la configuracion de la DLL.
Logon
Evento que ocurre cuando un usuario inicia sesion en el sistema, este evento ocurre antes de que se restauren las conexiones de red del usuario.
Shutdown
Evento que ocurre cuando un usuario apaga el sistema.
StartScreenSaver
Evento que ocurre cuando se ejecuta el ScreenSaver(Protector de Pantalla).
StartShell
Evento que ocurre luego de que un usuario a iniciado sesion en el sistema, cuando se ha ejecutado el Shell del sistema (Windows Explorer / Explorador de Windows), difiere del evento Logon en que las conexiones de red están disponibles.
Startup
Evento que ocurre cuando se inicia el sistema.
StopScreenSaver
Evento que ocurre cuando se detiene el ScreenSaver.
Unlock
Evento que ocurre cuando se "desbloquea" el sistema.

 

En el .Zip del articulo puede encontrar el codigo necesario para realizar el paso 1 en el archivo addreg.cpp

Codificar la DLL:

Incluir el archivo de cabecera winwlx.h.En la funcion de entrada de la DLL DllEntryPoint, verificamos el argumento fdwReason y si es igual a DLL_PROCESS_ATTACH, llamamos a DisableThreadLibraryCalls, para desabilitar el envio de las notificaciones DLL_THREAD_ATTACH y DLL_THREAD_DETACH a la DLL, que en este ejemplo no las necesitamos. Escribir las funciones que la DLL exportara para manejar los eventos, las funciones deben tener el siguiente prototipo:

EXPORT VOID APIENTRY FunctionName(PWLX_NOTIFICATION_INFO pInfo)

Donde:

EXPORT
Esta definido como:

#define EXPORT extern "C" __declspec(dllexport)

FunctionName
Es el nombre de la funcion.

pInfo
Es un puntero a una estructura WLX_NOTIFICATION_INFO

En el .Zip del articulo puede encontrar el codigo necesario para realizar el paso 2 en el archivo dllmain.cpp .Una cosa interesante que se puede hacer con esto, es algo que hace el Adware
Look2Me.

Cuando un proceso padre ejecuta un proceso hijo, el hijo se ejecuta bajo la misma cuenta de usuario que el proceso padre a menos que se use CreateProcessAsUser para especificar otro usuario. Entonces ya que WinLogon se ejecuta con los privilegios del usuario SYSTEM, ante el evento Startup, la DLL ejecuta un .exe que tambien se ejecutara como SYSTEM. Los usuarios con el privilegio SeDebugPrivilege, como los administradores, pueden terminar un proceso que se ejecute como SYSTEM. Entonces la DLL antes de ejecutar el .exe, enumera los grupos y usuarios que tengan este privilegio y se los revoca, de tal forma que no podran terminar el proceso iniciado por la DLL.

En el .Zip del articulo puede encontrar el codigo necesario para realizar esto en el archivo disabled.cpp, tambien el codigo para revocar un privilegio a un grupo o usuario en concreto, en el archivo user_privilege.cpp.El codigo del .exe que ejecuta la DLL se encuentra en el archivo user.cpp y muestra el nombre de usuario bajo el cual se ejecuta el proceso. Otra cosa interesante es que aunque el sistema se inicie en Modo Seguro el codigo de la DLL igualmente se ejecuta.

 

(C) Mitosis 4 - GEDZAC LABS