elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
23 Mayo 2012, 06:04  


Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  Escribir desde un driver en la memoria de un proceso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Escribir desde un driver en la memoria de un proceso  (Leído 1,720 veces)
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Escribir desde un driver en la memoria de un proceso
« en: 29 Noviembre 2009, 22:40 »

Estuve investigando como escribir desde un driver en la memoria de un proceso que corre en modo usuario.

No logro entender como hacerlo desde el modo Kernel  :(

¿Alguien me puede dar alguna pista?

Gracias.

Saludos.
En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.271



Ver Perfil WWW
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #1 en: 29 Noviembre 2009, 22:56 »

Con KeStackAttachProcess puedes lograrlo.

Aqui te paso un ejemplo de código que lo usa, busca en el código lo que te interese  ;)


http://forum.sysinternals.com/forum_posts.asp?TID=6952&PID=28394#28394

Un Saludo  :)
En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #2 en: 29 Noviembre 2009, 23:48 »

Muchas gracias, Hendrix. Leeré detenidamente lo que me propones. Para comenzar  KeStackAttachProcess parace ser muy interesante y prometedora.

Hice un debug de WriteProcessMemory y llegué a NtWriteVirtualMemory. y esto me llevó a esto. ¿Que te parece seguir ese camino? ¿Será mas seguro que KeStackAttachProcess para una simple escritura?:

The KeStackAttachProcess routine attaches the current thread to the address space of the target process. Use this routine with extreme caution.

Espero tu opinión. Gracias de nuevo.

Saludos.

« Última modificación: 29 Noviembre 2009, 23:50 por escabe » En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.271



Ver Perfil WWW
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #3 en: 30 Noviembre 2009, 10:07 »

Muchas gracias, Hendrix. Leeré detenidamente lo que me propones. Para comenzar  KeStackAttachProcess parace ser muy interesante y prometedora.

Hice un debug de WriteProcessMemory y llegué a NtWriteVirtualMemory. y esto me llevó a esto. ¿Que te parece seguir ese camino? ¿Será mas seguro que KeStackAttachProcess para una simple escritura?:

The KeStackAttachProcess routine attaches the current thread to the address space of the target process. Use this routine with extreme caution.

Espero tu opinión. Gracias de nuevo.

Saludos.



Hace tiempo también intente hacer lo que tu hacías (escribir/leer en un proceso) y la principal dificultad es pasar de direcciones físicas (las direcciones del Kernel y sus módulos no están virtualizadas) a direcciones virtuales (cada proceso tiene su memoria virtualizada, por ello, pueden ejecutarse al mismo tiempo, 2 procesos que tengan su Entry Point en 40003EB, por poner algo). Leí acerca de pasar de direcciones físicas a virtuales y no pude sacar nada en claro, pero con esa API, si pude "attachearme" al proceso en cuestión, y si haces una lectura con la API NtReadProcessMemory sobre la dirección 400003EB, la harás sobre el proceso en el que te "attacheaste" y no sobre otro. Por eso sirve tanto esa API.

Evidentemente, una vez terminado de trabajar sobre el proceso, debes "deattachearte" (con KeUnstackDetachProcess y ObfDereferenceObject) y ya podrás volver a manejar direcciones del Kernel.

Un Saludo  :)
En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #4 en: 30 Noviembre 2009, 11:17 »

Hace tiempo también intente hacer lo que tu hacías (escribir/leer en un proceso) y la principal dificultad es pasar de direcciones físicas (las direcciones del Kernel y sus módulos no están virtualizadas) a direcciones virtuales

Cierto, lo primero que intenté fue lo que tu dices, cargar la pagina virtual apropiada para pasar direcciones físicas a virtuales y al revés, pero me parece muy complicado y sujeto a errores por desconocimiento profundo del tema.

Código:
NtWriteVirtualMemory(
     IN HANDLE ProcessHandle,
     IN PVOID BaseAddress,
     IN PVOID Buffer,
     IN ULONG NumberOfBytesToWrite,
     OUT PULONG NumberOfBytesWritten OPTIONAL
     );

El caso es que conociendo ProcessHandle nos dirigimos al espacio de direcciones de ese proceso, por lo que debería funcionar. Evidentemente deberemos usar la versión ZwWriteVirtualMemory.

Hendrix, si insisto en el tema es por mera curiosidad y porque al considerarte un referente en el foro sobre estos asuntos considero tu opinión como muy valiosa.  :). Todavía no he realizado las pruebas que en definitiva son las que demuestran que se puede hacer y que no. Me gusta barajar distintas soluciones, y dado que asumo que KeStackAttachProcess funciona tengo curiosidad por NtWriteVirtualMemory que es lo que usa Windows al debugear WriteProcessMemory.

Gracias.  :)

Un Saludo.
En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.271



Ver Perfil WWW
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #5 en: 30 Noviembre 2009, 15:31 »

En teoría tendría que funcionar, no lo probé, lo que hice fue lo que te dije antes, usar KeStackAttachProcess, trabajar dentro del espacio virtual del proceso, y una vez terminado, salia y finalizaba.

Intenta con NtWriteVirtualMemory, obteniendo el Handle del proceso a partir de ZwOpenProcess. Aquí tienes un ejemplo de como obtener el HANDLE:

http://forum.sysinternals.com/forum_posts.asp?TID=6908&PID=28620#28620

Espero que te sirva, y comenta en este post el resultado de la practica  ;) Yo si encuentro el código en mi viejo PC en el que lo tenia guardado también lo publicare.

Un Saludo  :)
En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #6 en: 2 Diciembre 2009, 00:28 »

Bien. He seguido el camino ZwWriteVirtualMemory. Aparentemente es sencillo al ser una API casi equivalente a WritwProcessMemory, pero existe un problema en modo Kernel. ZwWriteVirtualMemory no es exportada por el ntoskrn.exe aunque si por ntdll.dll, sólo que en esta última, en la versión para modo usuario.

Encontré la forma de alcanzar a NtWriteVirtualMemory en la SSDT mediante:

Código:
WORD NtWriteVirtualMemory_Index = *(WORD*)((BYTE*)ntdll!ZwWriteVirtualMemory+ 1);

El problema es que no es segura la llamada directa a las Versiones Nt_API desde el Kernel debido al modo anterior de la llamada (que pudo ser de usuario).

En resumen, no he dado con la forma de importar la versión Kernel de ZwWriteVirtualMemory. Pero la prueba me ha enseñado mucho.

He de decir que también he probado la técnica con KeStackAttachProcess y ha sido sencilla y satisfactoria.

Saludos.
En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.271



Ver Perfil WWW
Re: Escribir desde un driver en la memoria de un proceso
« Respuesta #7 en: 2 Diciembre 2009, 15:55 »

Pues lo que comentas no lo sabia, ya que como te dije, opté por la API KeStackAttachProcess desde un principio y como tu, a mi también me funcionó y ya ni intenté con otras API's. Interesante estudio de la funcionalidad de ZwWriteVirtualMemory, gracias por postearlo  :)

Un Saludo!!  :)
En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Leer Memoria de un Proceso
.NET
nemesysrgs 6 1,982 Último mensaje 30 Noviembre 2010, 05:49
por nemesysrgs
Escribir directamente en zona de memoria
Programación C/C++
hanfix 5 229 Último mensaje 9 Mayo 2012, 23:34
por Lambda
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines