Articles of ptrace

为什么这个ptrace程序说系统调用返回-38?

除了我正在运行execl("/bin/ls", "ls", NULL);之外,它和这个一样execl("/bin/ls", "ls", NULL); 。 结果显然是错误的,因为每个系统调用返回-38 : [user@ test]# ./test_trace syscall 59 called with rdi(0), rsi(0), rdx(0) syscall 12 returned with -38 syscall 12 called with rdi(0), rsi(0), rdx(140737288485480) syscall 9 returned with -38 syscall 9 called with rdi(0), rsi(4096), rdx(3) syscall 9 returned with -38 syscall 9 called with rdi(0), rsi(4096), rdx(3) syscall […]

Linux ptrace如何不安全或包含竞争条件?

我想通过ptrace()开始一个进程,并且所有的subprocess创build一个沙盒(包括孙辈等)。 ptrace()父进程,即主pipe。 将是一个简单的C或Python程序,从概念上讲,它将限制文件系统访问(基于path名和访问方向(读取或写入)和套接字访问(例如,不允许套接字创build))。 我应该注意什么,以便ptrace() d进程及其subprocess(recursion)不能绕过沙箱? 在fork()时间,主pipe应该做什么特殊的事情来避免竞争? 有没有可能从subprocess中读取例如rename()的文件名参数而没有竞争条件? 这是我已经计划要做的事情: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE在fork()时避免(某些)种族PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE 默认情况下禁止所有的系统调用,并组成允许的系统调用的白名单 确保*at()系统调用变体(如openat )得到了适当的保护 还有什么我应该注意的?

使用Ptrace来跟踪正在打开的文件的位置

我正在使用下面的代码,每当打开一个系统调用被调用时,它实际上会让我得到寄存器(eax,ebx,ecx)中的内容。 经过很多的斗争,我明白了这个问题的价值。 ebx包含指向文件名的指针。 但是当我尝试访问它时,我得到了一个分段错误。 我哪里错了? 代码可以从这里访问

如何使用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系统调用或编程方式的解决方法。