38 lines
934 B
C++
38 lines
934 B
C++
|
#include <unistd.h>
|
||
|
#include <cstring>
|
||
|
#include <cerrno>
|
||
|
#include <sys/ptrace.h>
|
||
|
#include <sys/wait.h>
|
||
|
|
||
|
#include "log.h"
|
||
|
#include "memory.h"
|
||
|
#include "trampoline.h"
|
||
|
#include "ptrace.h"
|
||
|
|
||
|
// Main
|
||
|
int main(__attribute__((unused)) int argc, char *argv[]) {
|
||
|
// Fork
|
||
|
pid_t pid = fork();
|
||
|
if (pid == -1) {
|
||
|
ERR("Unable To Fork Process: %s", strerror(errno));
|
||
|
} else if (pid == 0) {
|
||
|
// Child
|
||
|
ptrace(PTRACE_TRACEME, 0, 0, 0);
|
||
|
execvp(argv[1], (char *const *) &argv[1]);
|
||
|
ERR("Unable To Execute Program: %s: %s", argv[1], strerror(errno));
|
||
|
} else {
|
||
|
// Parent
|
||
|
|
||
|
// Wait For PTrace
|
||
|
waitpid(pid, nullptr, 0);
|
||
|
// Configure PTrace
|
||
|
ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_EXITKILL | PTRACE_O_TRACESYSGOOD);
|
||
|
|
||
|
// Setup Trampoline
|
||
|
init_memory(pid);
|
||
|
init_trampoline();
|
||
|
|
||
|
// Start PTrace Loop
|
||
|
loop_ptrace(pid);
|
||
|
}
|
||
|
}
|