--- /dev/null
+CC = gcc
+CFLAGS = -Wall -g
+OBJS = $(patsubst %.c,%.o,$(wildcard src/*.c))
+OUT = hack.out
+
+$(OUT): $(OBJS)
+ $(CC) $(CFLAGS) -o $@ $(OBJS)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $? -o $@
+
+clean:
+ rm -f src/*.o $(OUT)
+#include <stdlib.h>
#include <stdio.h>
+#include <sys/ptrace.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#define ERROR(...) \
+ do { \
+ fprintf(stderr, __VA_ARGS__); \
+ exit(1); \
+ } while (0)
+
+#define LOG(...) \
+ fprintf(stderr, __VA_ARGS__)
int main(int argc, char *argv[])
{
-
+ if (argc < 2) {
+ ERROR("Usage: %s <tracee_pid>\n", argv[0]);
+ }
+
+ int pid;
+ if ((pid = atoi(argv[1])) == 0) {
+ ERROR("Invalid pid '%s'\n", argv[1]);
+ }
+
+ ptrace(PTRACE_ATTACH, pid, NULL, NULL);
+ waitpid(pid, NULL, __WALL);
+ LOG("Attached to process %d\n", pid);
+
+ /* Do stuff ... */
+ sleep(5);
+
+ ptrace(PTRACE_DETACH, pid, NULL, NULL);
+ LOG("Detached from process %d\n", pid);
+
+ return 0;
}