2013-02-20 7 views
2

Недавно я перешел на платформу UNIX и в настоящее время занимаюсь исследованиями в операционных системах. Сейчас я особенно заинтересован в разработке/внедрении XNU и в настоящее время посвящен теме процессов и памяти.Mach vm_read не возвращает ожидаемые значения для OSX 10.8.2

У меня есть этот фрагмент кода, который позволяет мой исполняемый файл, чтобы получить порт задачи от другого процесса

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); 

Я знаю Мак OSX 10.8.2 имеет ASLR, поэтому цель процесса, который я бегу вызывается через GDB.

(gdb) start 
Breakpoint 1 at 0x100000ed8 
Starting program: /private/tmp/test 
Reading symbols for shared libraries +............................. done 

Breakpoint 1, 0x0000000100000ed8 in main() 

Я могу также проверить отладчик, что адрес 0x100000000 содержит магическое число Маха-O.

(gdb) x/x 0x100000000 
0x100000000 <_mh_execute_header>: 0xfeedfacf 
(gdb) 

Однако, когда моя программа пытается прочитать память целевого процесса, он просто возвращает случайных значения, а не магическое число, которое я ожидал (это случайное).

2157 -> 1103 [0 - (os/kern) successful] 
0x0619F000 

2157 является целевой ПИД, 1103 задача порта вместе с результатом от mach_error_string. Также я попробовал функцию vm_read и все тот же режим.

ответ

2

Nvm, нашел проблему. Магическую переменную следует рассматривать как указатель, а не фактическую ячейку памяти , где данные копируются.

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

 Смежные вопросы

  • Нет связанных вопросов^_^