1

inject_and_interposeコードを使用してインジェクションとインターポーズを実行できるように、実際に実行する前に、新しく起動したプロセス(一般的なクローズドソースユーザーアプリケーション)のPIDを取得する方法が必要です。

明確にするために、私は単に「すぐに気付く」よりもうまくやる必要があります。ポーリングしたり、アクションを実行するまでにプロセスがすでに数ミリ秒実行されていることを意味する非同期通知を受信したりすることはできません。

単一のステートメントが実行される前に、注入と介入を行う機会が必要です。

特定の名前のプロセスが発生したときに同期的に通知されるバックグラウンドプロセスを作成することはできます。また、ターゲットアプリケーションを起動するランチャーアプリケーションを作成することもできます。

すべてのソリューションは、少なくとも10.5(Leopard)から10.8(Mountain Lion)未満の64ビットコードをサポートする必要があります。

これが非常に単純であることが判明した場合は、先に進んで、OSXを初めて使用することを認めます:)ありがとうございます。

4

1 に答える 1

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");  
}
于 2012-07-27T00:16:48.047 に答える