#include #include #include #include #include "log.h" #include "memory.h" #include "trampoline.h" #include "ptrace/ptrace.h" #include "pipe/pipe.h" #include "signals.h" // Main int main(__attribute__((unused)) int argc, char *argv[]) { // Check Arguments if (argc < 2) { ERR("Invalid Arguments"); } bool use_ptrace = getenv(TRAMPOLINE_USE_PTRACE_ENV) != nullptr; // Setup if (!use_ptrace) { init_pipe_common(); } // Fork pid_t pid = fork(); if (pid == -1) { ERR("Unable To Fork Process: %s", strerror(errno)); } else if (pid == 0) { // Setup setpgid(0, 0); if (use_ptrace) { init_ptrace_guest(); } else { init_pipe_guest(); } // Execute Program execvp(argv[1], (char *const *) &argv[1]); ERR("Unable To Execute Program: %s: %s", argv[1], strerror(errno)); } else { // Parent // Setup Trampoline init_signals(pid); init_memory(pid); init_trampoline(); // Start PTrace if (use_ptrace) { init_ptrace_host(pid); } else { init_pipe_host(pid); } } }