私はいくつかのリバース エンジニアリングを試みていますが、インメモリ パッチを行う方法に少し困惑しています。私のターゲット バイナリは、署名された単純な Hello World アプリです。そのため、バイナリに簡単にパッチを当てることができますが、ゲートキーパーは爆発します (当然のことです)。
posix_spawn()
文字列はメモリ内にあるので、 with を使用しPOSIX_SPAWN_START_SUSPENDED
、プロセスのメモリに xnumem でパッチを適用して再開するだけだと思いました。何らかの理由で、それも失敗しているようです。私のテストコード;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <spawn.h>
#include <sys/wait.h>
#include "xnumem.h"
extern char **environ;
void run_cmd(char *cmd)
{
pid_t pid;
char *argv[] = {NULL};
int status;
printf("Run command: %s\n", cmd);
status = posix_spawn(&pid, cmd, NULL, NULL, argv, environ);
if (status == 0) {
printf("Child pid: %i\n", pid);
if (waitpid(pid, &status, 0) != -1) {
printf("Child exited with status %i\n", status);
} else {
perror("waitpid");
}
} else {
printf("posix_spawn: %s\n", strerror(status));
}
}
int main (int argc, const char * argv[]) {
char *arg;
arg = "./hello-world";
run_cmd(arg);
return 0;
}
エラーが発生しているようには見えません。ただのループです。
Run command: ./hello-world
Child pid: 53209
Run command: ./hello-world
Child pid: 53210
...
そして終了します。
誰かが私を正しい方向に向けることができますか? 一時停止状態でプロセスを開始し、そのメモリを変更し、ゲートキーパーをトリップさせずに再開するにはどうすればよいですか?