From 4a3429a96b5b5ea7468540349aeb4535d5738053 Mon Sep 17 00:00:00 2001 From: the lemons Date: Tue, 7 Feb 2023 22:43:58 -0600 Subject: create evilizer --- Makefile | 2 ++ evilize.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 evilize.c diff --git a/Makefile b/Makefile index 4345b7e..903b7e9 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,8 @@ core.c: procfs.h memview.h memview.c: procfs.h memview.h procfs.c: procfs.h +evilize: evilize.o + .SUFFIXES: .c .o .c.o: $(CC) $(CFLAGS) -c -o $@ $< diff --git a/evilize.c b/evilize.c new file mode 100644 index 0000000..e3b13aa --- /dev/null +++ b/evilize.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define ERRCHECK(E)\ + if ((E) == -1) {perror(argv[0]); kill(pid, SIGHUP); return -1;} + +int main(int argc, char *argv[]) { + if (argc < 2) { + fprintf(stderr, "usage: %s COMMAND [ARGS]...\n" , argv[0]); + return -1; + } + pid_t pid = fork(); + if (pid == -1) { + perror(argv[0]); + return -1; + } + if (pid == 0) { + ptrace(PTRACE_TRACEME, 0, NULL, NULL); + raise(SIGSTOP); + if (execvp(argv[1], argv + 1) == -1) { + perror(argv[0]); + return -1; + } + } else { + ERRCHECK(ptrace(PTRACE_ATTACH, pid, NULL, NULL)); + int status; + pid_t w = waitpid(pid, &status, __WALL); + ERRCHECK(w); + ERRCHECK(ptrace(PTRACE_CONT, pid, NULL, NULL)); + while (1) { + pid_t w = waitpid(pid, &status, __WALL); + ERRCHECK(w); + if (WIFEXITED(status)) + return WEXITSTATUS(status); + if (WIFSTOPPED(status)) { + if (WIFSIGNALED(status)) { + errno = 0; + switch (WSTOPSIG(status)) { + case SIGABRT: + case SIGBUS: + case SIGFPE: + case SIGILL: + case SIGSEGV: + ptrace(PTRACE_CONT, pid, NULL, NULL); + break; + default: + ptrace(PTRACE_CONT, pid, NULL, WSTOPSIG(status)); + break; + } + if (errno && errno != ESRCH) { + perror("ptrace"); + kill(pid, SIGHUP); + return -1; + } + } else ptrace(PTRACE_CONT, pid, NULL, NULL); + } + } + } +} -- cgit v1.2.3