Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware
Autor
|
Tema: Escribir desde un driver en la memoria de un proceso (Leído 1,720 veces)
|
escabe
Desconectado
Mensajes: 34
|
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
|
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#28394Un 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
Mensajes: 34
|
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
|
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
Mensajes: 34
|
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. 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
|
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#28620Espero 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
Mensajes: 34
|
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: 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
|
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
|
|
|
|
|