2013-02-20 6 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에 Mach-O의 마법 번호가 포함되어 있다는 것을 GDB 내부에서 확인할 수 있습니다. 내 프로그램이 대상 프로세스의 메모리를 읽으려고 할 때

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

그러나, 그것은 단지 임의 값, I (이것은 임의의) 기대하고 있지 마법의 수를 반환합니다.

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

2,157

대상 PID이며, 1103 mach_error_string의 결과와 함께 작업 포트이다. 또한 vm_read 함수를 시도했지만 여전히 동일한 동작을합니다.

답변

2

Nvm이 문제를 발견했습니다. 마법 변수는 데이터가 복사되는 실제 메모리 셀 이 아닌 포인터로 처리되어야합니다.

pointer_t magic; 
... 
int magicValue = (uint32_t) *((int *)(magic)); 
관련 문제