Je viens tout juste de passer à la plate-forme UNIX et je fais actuellement des recherches sur les systèmes d'exploitation. En ce moment, je suis particulièrement intéressé par la conception/implémentation de XNU et actuellement sur le thème des processus et de la mémoire.Mach vm_read ne renvoie pas les valeurs attendues pour OSX 10.8.2
Je cet extrait de code qui permet à mon exécutable pour obtenir un port de tâche d'un autre processus
int retValTask = task_for_pid(mach_task_self(), pid, &task);
if (retValTask != KERN_SUCCESS || !MACH_PORT_VALID(task)) {
printf("Error while getting port, check if root or valid pid");
}
...
int retValVmRead = mach_vm_read(task, (vm_address_t)0x100000000, sizeof(uint32_t), (vm_offset_t *)&magic, &sz);
Je suis conscient Mac OS X 10.8.2 a ASLR, de sorte que le processus cible que je dirige est appelé via gdb.
(gdb) start
Breakpoint 1 at 0x100000ed8
Starting program: /private/tmp/test
Reading symbols for shared libraries +............................. done
Breakpoint 1, 0x0000000100000ed8 in main()
Je peux également vérifier à l'intérieur GDB que l'adresse 0x100000000
contient nombre magique de Mach-O.
(gdb) x/x 0x100000000
0x100000000 <_mh_execute_header>: 0xfeedfacf
(gdb)
Cependant, lorsque mon programme tente de lire la mémoire du processus cible, il retourne juste valeurs aléatoires, et non pas le nombre magique que je me attends (il est aléatoire).
2157 -> 1103 [0 - (os/kern) successful]
0x0619F000
2157 est la cible PID, 1103 est le port d'entrée ainsi que le résultat de mach_error_string
. J'ai également essayé la fonction vm_read
et toujours le même comportement.