summaryrefslogtreecommitdiff
path: root/wrapper
diff options
context:
space:
mode:
authorjakob <jakob@memeware.net>2017-08-28 14:32:57 -0400
committerjakob <jakob@memeware.net>2017-08-28 14:32:57 -0400
commita4365445d4d32001362f6e8bfae93a3b8f152fde (patch)
treee9fa2d582ccc4cd7e6a914dd7f6d7177922f7841 /wrapper
parent3c6841de48d401e911bb609042d019764b26f507 (diff)
Initial implementation of the ptrace wrapper
Diffstat (limited to 'wrapper')
-rw-r--r--wrapper/Makefile12
-rw-r--r--wrapper/ptrace.c51
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;
+}