lunes, 15 de diciembre de 2008

Análisis de un volcado de memoria: mfinder

Prácticamente acabo de terminar de programar una herramienta, mfinder, que permite listar los procesos encontrados durante el análisis de un fichero de volcado de la memoria física de un sistema Windows 2000.

Está basada en PTfinder, un script de perl desarrollado por Andreas Schuster y que, además de ejecutarse mucho más rapido, admite más opciones. Por supuesto, para adaptar el algoritmo utilizado en el script original cuento con el beneplácito de Andreas, el cual se ha ofrecido incluso a publicitar mi herramienta en su blog. ¡Gracias Andreas!

El programa permite analizar ficheros de volcado en formato raw, y que provengan de sistemas de 32 bits que no utilicen PAE. En principio esta versión soporta únicamente las estructuras de memoria manejadas por un sistema Windows 2000, pero modificando los offsets empleados podría adaptarse para funcionar con volcados de diferentes sistemas.

Puede encontrarse información detallada del algoritmo de parseo de procesos empleado por PTfinder y, por ende, mfinder, en el paper y la presentación correspondiente publicados por Andreas Schuster.

Podemos comprobar su funcionamiento utilizando el fichero publicado en la edición de 2005 del DFRWS. La información mostrada por mfinder es la siguiente:

  • PID del proceso.
  • Nombre del ejecutable.
  • Offset dentro del fichero.
  • Directory Table Base (PDB), el cual marca la dirección base para la tabla de Page Directories Entries (PDE) del proceso, y que en sistemas x86 sería equivalente al contenido del registro CR3.
  • Dirección virtual del PEB
  • Fecha y hora de inicio de ejecución del proceso.
  • Fecha y hora de fin de ejecución del proceso, en el caso de que éste haya finalizado.

Por otra parte, y si se ha utilizado la opción "--calcpeb", se realizará la traducción de la dirección virtual para el bloque de entorno de proceso (PEB) a su correspondiente offset dentro del fichero de volcado. Si cualquiera de las páginas de memoria utilizadas en el proceso de traducción ha sido paginada y, por lo tanto, no se encuentra en el fichero, el valor para dicho campo sera "paged". No obstante espero poder aumentar en breve el número de traducciones válidas basándome en el paper "Using Every Part of the Buffalo in Windows Memory Analysis", de Jesse D. Kornblum.

No espereis un código en lenguaje C de marcado tinte profesional dado que, como ya he indicado en otras ocasiones, mi nivel es de aprendiz. Por todo esto seguro que podría incrementarse enormemente la velocidad de ejecución, ademas de otros aspectos (estaré encantado de recibir modificaciones, correcciones y/o sugerencias), pero dado que el principal fín que perseguía con su codificación y posterior publicación era didáctico, el proceso ha superado mis expectativas con creces.

Desde aquí mi agradecimiento para el compañero TuXeD, del foro de Wadalbertia, por su inestimable e infinita paciencia a la hora de resolver mis dudas de programación, ¡gracias amigo!

Y como siempre, el desarrollo de esta herramienta nos vá a servir para adentrarnos y conseguir entender un poco más el funcionamiento y estructuras de la memoria manejadas internamente por Windows así que, en breve, más (y mejor, espero).

Código y ejecutable: mfinder_w2k.zip

2 comentarios:

Ariel M. Liguori de Gottig dijo...

Felicitaciones por lo que has logrado! Ahora a probarlo! Te contare que me ha parecido! Muy bueno el aporte y mejor aún si lo distribuyes como FLOSS.

Saludos,

neofito dijo...

Hola Ariel

Muchas gracias por tus felicitaciones, pero en todo caso el destinatario de las mismas deberia ser Andreas Schuster, el creador de PTfinder.

Por otra parte cualquier sugerencia o error que encuentres no dudes en indicarmelo, y asi la mejoramos un poco.

Saludos y gracias de nuevo