diff options
| author | jakob <jakob@memeware.net> | 2017-08-28 14:32:57 -0400 |
|---|---|---|
| committer | jakob <jakob@memeware.net> | 2017-08-28 14:32:57 -0400 |
| commit | a4365445d4d32001362f6e8bfae93a3b8f152fde (patch) | |
| tree | e9fa2d582ccc4cd7e6a914dd7f6d7177922f7841 /wrapper | |
| parent | 3c6841de48d401e911bb609042d019764b26f507 (diff) | |
Initial implementation of the ptrace wrapper
Diffstat (limited to 'wrapper')
| -rw-r--r-- | wrapper/Makefile | 12 | ||||
| -rw-r--r-- | wrapper/ptrace.c | 51 |
2 files changed, 63 insertions, 0 deletions
diff --git a/wrapper/Makefile b/wrapper/Makefile new file mode 100644 index 0000000..1019833 --- /dev/null +++ b/wrapper/Makefile @@ -0,0 +1,12 @@ +CC := gcc + +CFLAGS = -Wall -Wextra -Os -std=c99 -pedantic -fstack-protector-all +CFLAGS += $(USER_CFLAGS) + +LDFLAGS = -shared +LDFLAGS += $(USER_LDFLAGS) + +all: libptracew.so + +libtestw.so: ptrace.c + $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) diff --git a/wrapper/ptrace.c b/wrapper/ptrace.c new file mode 100644 index 0000000..3ce42a1 --- /dev/null +++ b/wrapper/ptrace.c @@ -0,0 +1,51 @@ +/* Copyright (C) 2017 Jakob Kreuze, All Rights Reserved. + + This file is part of Hypodermic. + + Hypodermic is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or (at + your option) any later version. + + Hypodermic is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Hypodermic. If not, see <http://www.gnu.org/licenses/>. */ + +#include <sys/ptrace.h> +#include <sys/wait.h> + +#include <stddef.h> + + +int attach(int pid) { + if ((ptrace(PTRACE_ATTACH, pid, NULL, NULL)) < 0) { + return -1; + } + + waitpid(pid, NULL, WUNTRACED); + return 0; +} + + +int detach(int pid) { + return ptrace(PTRACE_DETACH, pid, NULL, NULL) < 0; +} + + +int cont(int pid) { + int s; + + if ((ptrace(PTRACE_CONT, pid, NULL, NULL)) < 0) { + return -1; + } + + while (!WIFSTOPPED(s)) { + waitpid(pid, &s, WNOHANG); + } + + return 0; +} |