2013-02-20 3 views
2

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.

Répondre

2

Nvm, trouvé le problème. La variable magique doit être traitée comme un pointeur et non la cellule de mémoire réelle où les données sont copiées.

pointer_t magic; 
... 
int magicValue = (uint32_t) *((int *)(magic)); 
Questions connexes