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이며, 1103mach_error_string
의 결과와 함께 작업 포트이다. 또한
vm_read
함수를 시도했지만 여전히 동일한 동작을합니다.