2012-06-11 20 views
10

Tengo un programa de 3 ª parte de código cerrado, y yo quiero ser capaz de¿Cómo puedo acceder a la memoria de un programa en otro

  • saber lo que la memoria se asigna al programa
  • acceso que la memoria (solo lectura está bien)

Las utilidades como vmmap (1), heap (1) y las fugas (1) parecen tener una funcionalidad similar a la que necesito, pero no puedo encontrar su origen en ningún Versiones de OS X) y no puede entender cómo funcionan. Preferiblemente, todo esto se haría en el espacio del usuario, posiblemente ejecutándose como root. No quiero escribir el código del kernel para evitar la protección de la memoria si puedo evitarlo.

Intenté usar la memoria compartida pasando la dirección de lo que quiero leer como el 2º argumento a shmat (2), pero finalmente no tuvo éxito (y probablemente no era su intención y/o mala práctica) y aún me abandonó sin una forma de determinar qué memoria estoy buscando de todos modos (el programa que poseía la memoria tenía que informarme de su dirección).

¿Hay alguna forma de desactivar la protección de memoria para un determinado programa para que no falle por segmentación cuando intenta leer/escribir la memoria que está asignada a un proceso diferente? ¿Hay alguna manera mejor de no permitir que los errores corrompan seriamente todo mi sistema?

¿Cómo se consigue esto?

+0

¿Ha intentado rastrear las llamadas al sistema de tales utilidades? – icktoofay

+0

@icktoofay Buena idea. Nunca hecho eso antes. Acabo de probarlo usando shark.app (mierda de la GUI inestable, solo la primera sugerencia que Google me encontró) pero hay algunos problemas 1) faltan nombres de símbolos 2) el tiburón sigue fallando (voy a intentar ver si puedo) hacer esto con GDB o algo así), y 3) No puedo encontrar documentación para las llamadas de sistema que parecen ser relevantes (io_connect_method, io_connect_ (un) map_memory, algunas cosas mach_ *). 4) Me tomará una eternidad explorar el basurero y descubrir cómo usar estas llamadas correctamente. Debe haber documentación en alguna parte ... – user992364

Respuesta

3

no tengo acceso a una máquina OS X, pero esto se ve muy similar a lo que estamos tratando de hacer:

Reading Other Process' Memory in OS X?

Aquí hay un archivo del enlace que no funciona :

http://web.archive.org/web/20090627062246/http://www.matasano.com/log/1100/what-ive-been-doing-on-my-summer-vacation-or-it-has-to-work-otherwise-gdb-wouldnt/

+0

Ese artículo parece resumirse en "ptrace no funcionará, use vm_read y vm_write", ninguno de los cuales tiene páginas de manual, y el único syscall en el volcado que se ve similar es vm_deallocate ... :( – user992364

3

Básicamente, this guy es correcto.

Vaya a descargar el source code que acompaña a this book y vea vm_rw_master.c del ejemplo 8-16 para una implementación en funcionamiento.

Consulte http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/ para la documentación, está desactualizado y es cuestionablemente correcto, pero es el mejor disponible.

EDITAR: También, consulte http://lightbulbone.com/2011/05/dumping-process-memory-on-mac-os-x/ (tenga en cuenta que la tarea que posee la memoria que está tratando de leer NO necesita ser un proceso secundario tratando de hacer la lectura, solo necesita tener la autorización adecuada)

EDITAR: También, consulte http://os-tres.net/blog/2010/02/17/mac-os-x-and-task-for-pid-mach-call/ para obtener un buen ejemplo de autorización.

Cuestiones relacionadas