Articles of ptrace

如何使用ptrace(2)来改变syscalls的行为?

有没有任何指南或例子(尤其是ARM的)或使用ptrace库来影响其他进程的执行? 例如,为了使它相信一些数据出现在文件描述符上(即释放select/轮询一些结果和“回答”下面的内核之前读取系统调用)。 期待涉及PTRACE_SYSEMU的事情。 可以用便携的方式来完成吗? 我想要像libc重写LD_PRELOAD技巧,但可以在运行时附加。 可以用一些gdb命令来完成吗? 理想的变种是,如果有一些库可以方便地挂载到系统调用中,并在实际调用(或模拟它们)之前进行编辑,就像使用LD_PRELOAD进行调用一样。 @link 使用PTRACE_SYSEMU的任何好的指南?

低开销的方式来访问跟踪过程的内存空间?

我正在寻找一种有效的方法来访问(对于读取和写入操作)我的ptracedsubprocess的内存空间。 被访问块的大小可能会从几个字节到几兆字节大小不等,所以使用PTRACE_PEEKDATA和PTRACE_POKEDATA一次只读取一个字,并在每次被调用时切换上下文的ptrace调用看起来像是毫无意义的浪费资源。 然而我唯一能find的替代解决scheme是/proc/<pid>/mem文件,但是它早已变成只读了。 有没有其他(相对简单)的方式来做这个工作? 理想的解决scheme是以某种方式共享我的subprocess的地址空间,然后使用简单的memcpy调用来双向复制我需要的数据,但是我没有线索如何做以及从哪里开始。 有任何想法吗?

用ptrace()取消系统调用

出于某种安全目的,我使用ptrace来获取系统调用号码,如果这是一个危险的调用(如10取消链接),我想取消这个系统调用。 这里是testing程序del.c的源代码。 用gcc -o del del.c编译。 #include <stdio.h> #include <stdlib.h> int main() { remove("/root/abc.out"); return 0; } 这里是安全pipe理器源代码test.c 用gcc -o test test.c编译。 #include <signal.h> #include <syscall.h> #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <errno.h> #include <sys/user.h> #include <sys/reg.h> #include <sys/syscall.h> int main() { int i; pid_t child; int status; long orig_eax; child = […]

Linux中的CreateRemoteThread

我在Windows中使用CreateRemoteThread ,想知道在Linux中是否可以使用同样的东西。 有没有可能在Linux中做到这一点?

如何得到一个“回溯”(如gdb)只使用ptrace(Linux,x86 / x86_64)

我想像gdb那样得到一个类似于backtrace的输出。 但我想直接通过ptrace()来做到这一点。 我的平台是Linux,x86; 和后来的x86_64。 现在我只想从堆栈中读取返回地址,而不用转换成符号名称。 所以,对于testing程序,由gcc-4.5在-O0模式下gcc-4.5 : int g() { kill(getpid(),SIGALRM); } int f() { int a; int b; a = g(); b = a; return a+b; } int e() { int c; c = f(); } main() { return e(); } 我将开始我的程序,并与ptrace连接,以开始testing程序。 然后,我会做PTRACE_CONT并等待信号。 当testing程序会做自杀时, 信号将被传送到我的程序。 这时我要读取返回地址,他们会像(因为kill函数此刻被激活): 0x00_some_address_in_g 0x00_some_address_in_f 0x00_some_address_in_e 0x00_some_address_in_main 0x00_some_address_in__libc_start_main 如何find当前停止的testing过程的返回地址与ptrace ? 会有帧循环? […]

如何使用PTRACE获得多个线程的一致视图?

当我正在处理这个问题时 ,我遇到了一个使用ptrace的可能的想法,但是我无法正确理解ptrace如何与线程交互。 假设我有一个给定的,multithreading的主进程,我想附加到它的一个特定的线程(也许从一个分叉的孩子)。 我可以附加到特定的线程? (手册在这个问题上有分歧。) 如果是这样,这是否意味着单步只通过一个线程的指示? 它是否会停止所有进程的线程? 如果是这样,当我调用PTRACE_SYSCALL或PTRACE_SINGLESTEP ,或所有线程继续时,所有其他线程保持停止? 有一种方法只能在一个单线程中前进,但保证其他线程保持停止状态? 基本上,我想通过强制所有线程停止来同步原始程序,然后通过单步执行一个跟踪线程来执行一小组单线程指令。 我个人的尝试迄今看起来有点像这样: pid_t target = syscall(SYS_gettid); // get the calling thread's ID pid_t pid = fork(); if (pid > 0) { waitpid(pid, NULL, 0); // synchronise main process important_instruction(); } else if (pid == 0) { ptrace(target, PTRACE_ATTACH, NULL, NULL); // does this work? // […]

有没有像Windows中的Linux ptrace系统调用?

阅读监视由Windows中的进程完成的某些系统调用我想知道一个Windows相当于ptrace系统调用或编程方式的解决方法。