2013-02-20 73 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); 

我知道的Mac 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() 

我還可以驗證GDB內部的地址0x100000000包含的Mach-O的幻數。

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

然而,當我的程序試圖讀取目標進程的內存,它只是返回 隨機值,而不是一個神奇的數字,我期待(這是隨機的)。

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

2157是目標PID,1103是從mach_error_string結果沿着任務端口。 另外我嘗試了vm_read函數,仍然是相同的行爲。

回答

2

Nvm,發現問題。這個魔術變量應該被當作一個指針而不是數據被複制的實際內存單元。

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