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