2012-03-18 26 views
5

Una vez que he escrito una especie de controlador para Windows, que tuvo que interceptar la interacción del controlador de pantalla nativo con el sistema operativo. El controlador de pantalla nativo consiste en un controlador de minipuerto y una DLL cargada por win32k.sys en el espacio de la sesión. Mi objetivo era inmiscuirme entre win32k.sys y esa DLL. Además, el sistema podría tener varios controladores de pantalla, tuve que conectarlos a todos.Enganche del controlador de la pantalla de Windows, 64 bit

Creé un controlador WDM estándar, que se configuró para cargarse al arrancar el sistema (es decir, antes de win32k). Durante su inicialización conectó el ZwSetSystemInformation, parcheando el SSDT. El SO llama a esta función siempre que carga/descarga una DLL en el espacio de la sesión, que es exactamente lo que necesito.

Cuando ZwSetSystemInformation se invoca con SystemLoadImage parámetro - uno de sus parámetros es el puntero a una estructura SYSTEM_LOAD_IMAGE, y su ModuleBase es la dirección de proyección de base del módulo. Luego analizo la imagen mapeada, parche su punto de entrada con mi función, y el resto es sencillo.

Ahora necesito conectar este controlador a un Windows de 64 bits. Huelga decir que no es una tarea trivial en absoluto. Hasta ahora he encontrado los siguientes obstáculos:

  • Todos los conductores deben ser firmados
  • PatchGuard
  • SSDT no se exporta directamente.

Si entiendo correctamente, PatchGuard y la verificación de firmas del conductor pueden estar desactivadas, el controlador debe instalarse en una máquina dedicada, y podemos torturarlo de la manera que deseemos.

También hay trucos para ubicar el SSDT, según fuentes en línea.

Sin embargo recientemente descubrí que existe una función llamada PsSetLoadImageNotifyRoutine. Puede simplificar la tarea considerablemente y ayudar a evitar trucos sucios.

Mi pregunta es:

  • Si uso PsSetLoadImageNotifyRoutine, voy a recibir notificaciones acerca de las DLL cargadas en el espacio de sesión? La documentación oficial habla sobre "espacio del sistema o espacio de usuario", pero ¿el "espacio del sistema" también incluye el espacio de la sesión?
  • ¿Debo desactivar el PatchGuard si voy a aplicar un parche a la imagen DLL asignada después de que se haya mapeado?
  • ¿Hay algún otro problema potencial en el que no haya pensado?
  • ¿Hay alguna otra forma de lograr lo que quiero?

Gracias de antemano.

+0

¿Qué estás tratando de lograr? Puede ser que haya una mejor manera de resolver su problema con más información sobre el problema de raíz. –

+0

@Larry Osterman: Estoy tratando de reemplazar el rdpdd (controlador de pantalla virtual de escritorio remoto) por otra cosa. Es demasiado largo para explicar la razón exacta para hacer esto, pero esto es lo que es necesario – valdo

+0

IIRC, las cosas del escritorio remoto son conectables sin necesidad de conectar el controlador - Creo que Citrix hace esto para su producto de escritorio remoto (sé que la redirección de sonido la lógica es redirigible a partir de Win7). Lamentablemente, no sé cómo se hace eso. –

Respuesta

2

¿Debo desactivar el PatchGuard si voy a aplicar un parche a la imagen DLL asignada después de que se asignó?

Para cargar cualquier controlador en x64, debe estar firmado. Con los derechos de administrador puede desactivar PatchGuard y yo personalmente recomiendo usar DSEO, una aplicación GUI hecha para esto.O puede omitir PatchGuard sobrescribiendo el MBR (o BIOS), aunque esto normalmente se considera un bootkit: malware.

Cuestiones relacionadas