summaryrefslogtreecommitdiff
path: root/wrapper/ptrace.c
diff options
context:
space:
mode:
authorJakob <jakob@memeware.net>2017-09-03 16:19:33 -0400
committerJakob <jakob@memeware.net>2017-09-03 16:19:33 -0400
commit8927b31b8ef6334a5efd28ea779db5a58ac5d445 (patch)
tree408a4a485ba00dfffe04d4ab4d0b8b4638183ab9 /wrapper/ptrace.c
parent6f0a28b09a670371b22658a295403ab2573ed993 (diff)
Implemented basic machine code injection.
Diffstat (limited to 'wrapper/ptrace.c')
-rw-r--r--wrapper/ptrace.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/wrapper/ptrace.c b/wrapper/ptrace.c
index 8517519..706fd4e 100644
--- a/wrapper/ptrace.c
+++ b/wrapper/ptrace.c
@@ -81,6 +81,18 @@ int cont(int pid) {
return -1;
}
+ waitpid(pid, &s, WNOHANG);
+ return 0;
+}
+
+
+int step(int pid) {
+ int s;
+
+ if ((ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL)) < 0) {
+ return -1;
+ }
+
while (!WIFSTOPPED(s)) {
waitpid(pid, &s, WNOHANG);
}
@@ -108,6 +120,16 @@ unsigned long long getreg(int pid, int idx) {
return ((unsigned long long *) &regs)[idx];
}
+
+void setreg(int pid, int idx, unsigned long long value) {
+ struct user_regs_struct regs;
+
+ ptrace(PTRACE_GETREGS, pid, NULL, &regs);
+
+ ((unsigned long long *) &regs)[idx] = value;
+
+ ptrace(PTRACE_SETREGS, pid, NULL, &regs);
+}
#else
unsigned long getreg(int pid, int idx) {
struct user_regs_struct regs;
@@ -116,4 +138,14 @@ unsigned long getreg(int pid, int idx) {
return ((unsigned long *) &regs)[idx];
}
+
+void setreg(int pid, int idx, unsigned long value) {
+ struct user_regs_struct regs;
+
+ ptrace(PTRACE_GETREGS, pid, NULL, &regs);
+
+ ((unsigned long *) &regs)[idx] = value;
+
+ ptrace(PTRACE_SETREGS, pid, NULL, &regs);
+}
#endif