1

爲了能夠使用inject_and_interpose代碼進行一些注入和插入,我需要在實際執行之前獲取新啓動的進程(典型的閉源用戶應用程序)的PID。要清楚,我需要做的比只是「注意到它快」 - 我不能輪詢,或接收到一些異步通知,這意味着該進程已經執行了幾毫秒的時間我採取行動。如何在執行之前獲取新進程的PID?

我需要有機會在執行單個語句之前執行注入和插入操作。

我打算編寫一個後臺進程,當一個特定名稱的進程出現時,會同步通知後臺進程。我也願意編寫一個啓動應用程序,然後啓動目標應用程序。

任何解決方案都需要支持64位代碼,至少在10.5(Leopard)到10.8(Mountain Lion)之間。

如果這證明是痛苦的簡單,我會繼續承認我是新來的OS X :)謝謝!

+0

在windows上,您可以通過在調用'CreateProcess'時通過設置'CREATE_SUSPENDED'標誌來啓動處於掛起狀態的進程來執行此操作。然後,一旦你完成了任何棘手的事情,你就可以調用'ResumeThread'。也許這會幫助你朝正確的方向前進。 – 2012-07-27 00:13:01

+0

我非常確定,除非您控制流程啓動,否則在執行單個語句之前無法同步攔截新啓動的流程。 – 2012-07-27 00:14:20

+0

@JonathonReinhart,我已經參與了這個Windows的開發,但是在OS X下沒有運氣,所以「在正確的方向看」就是我在這裏嘗試的;)謝謝! – bland328 2012-07-27 00:19:46

回答

1

我知道如何在Linux上這樣做,所以也許它會在OSX上相同(-ish)。

您首先撥打fork()複製您的過程。 fork()的返回值表示您是父母還是子女。父母獲得子進程的PID,並且孩子得到零。

然後,孩子調用exec()實際開始執行新的可執行文件。通過使用在調用fork之前創建的管道,孩子可以等待父級執行所需的任何操作,然後再執行新的可執行操作。

pid_t pid = fork(); 
if (pid == -1) { 
    perror("fork"); 
    exit(1); 
} 
if (pid > 0) { 
    // I am the parent, and pid is the PID of the child process. 

    //TODO: If desired, somehow notify child to proceed with exec 
} 
else { 
    // I am the child. 

    //TODO: If desired, wait no notification from parent to continue 

    execl("path/to/executable", "executable", "arg1", NULL); 

    // Should never get here. 
    fprintf(stderr, "ERROR: execl failed!\n"); 
} 
+0

我不太關注,喬納森。這是如何讓我在執行之前獲得「新的可執行文件」的PID?你是否說父母會從fork()獲得子進程的PID,而exec()進程是否會在子進程的上下文中運行,因此是否具有該PID? – bland328 2012-07-27 00:24:58

+0

是的,確切地說。這就是執行官的工作方式;它*代替當前正在執行的過程映像。 – 2012-07-27 00:47:23

+0

查看我的編輯:添加了一些示例代碼。 – 2012-07-27 00:51:04