ptrace

Linux:有没有办法在不停止/暂停进程(SIGSTOP)的情况下使用 ptrace?

我正在尝试将程序从 Windows 移植到 Linux。 当我发现 Linux 上没有“真正的”ReadProcessMemory 对应对象时,我遇到了一个问题;我搜索了一个替代方案,发现ptrace,一个强大的进程调试器。 我很快用 C++ 编写了两个小型控制台应用程序来测试ptrace,然后在程序中使用它。 TestApp 这是被追踪者;它保持每 50 毫秒打印两个整数,同时每次将它们的值... »

c++

如何获取进程的内存和时间使用情况?

我正在尝试获取进程的内存和时间使用情况,这里是[my code] 但是对于这样一个消耗近 8500Kb 的简单应用程序来说,报告的内存量太大了。我所做的事情是否报告了错误的内存使用情况或有其他原因? #include "trace.h" #include "include.h" #include "trace.cpp" using namespace std; int main(int argc... »

c++

查找与数字关联的系统调用

我正在使用 ptrace 跟踪程序。在系统调用停止后,我使用 PTRACE_PEEKUSER 查看 (ORIG_)EAX 的值。实际上是 RAX,因为我是 64 位的。 有什么好的方法可以将其转换为适当的值? 例如 2->“开放”(IIRC)。... »

ptrace(),我怎样才能停止在子进程中被跟踪?

我只想跟踪 C 程序的一部分以进行系统调用。我正在使用带有 PTRACE_TRACEME 选项的 ptrace() 来开始跟踪。如何在几行代码后阻止此过程被跟踪。我正在尝试使用 PTRACE_DETACH 但它不起作用? 主要的.C文件是: #include<stdio.h> #include<unistd.h> #include<sys/ptrace.h>... »

c

监控程序的读/写路径的程序?

我试图为一个大学项目制作一个程序,但我陷入了困境: 您将如何监控程序写入或读取的文件? 我希望有他们的路径名。 为了让问题更清楚,这里有一个例子: 假设我们要监控的程序是 a.exe,a.exe 首先打开与 a.exe 位于同一文件夹中的名为“a1”的文件,然后打开另一个名为“a2”的文件。 程序必须给出“a1”和“a2”文件的相对或绝对路径,而不管它们被打开以进行读/写.. 如何在 C... »

c++

ELF x86 可执行入口点

void *entrypoint; /*virtual address of process*/ fscanf(debuggedfile, "%p", &entrypoint); 其中 debuggedfile 是指向 int 入口点所在偏移量的 elf 文件的流。 当我使用 ptrace(PTRACE_PEEKTEXT, 0, entrypoint, 0) 它返回 -1... »

在 aarch64 上获取/设置 arm32 可执行文件的寄存器

我的目标是使用ptrace 设置在 64 位处理器上运行 32 位 ARM 可执行文件的进程的程序计数器(和其他寄存器)。 如果这是一个 64 位可执行文件,那么我可以使用 struct user_pt_regs 的 pc 字段(在 asm/ptrace.h 中定义)。 对于 32 位可执行文件,我将使用哪种结构?我看到struct user_regs(在 sys/user.h 中)定义为... »

c

如何同时等待文件描述符和子状态更改?

在 Linux 中,可以使用 select、poll 或 epoll 等待任何 FD。 也可以使用wait、waitpid 或waitid 等待子进程更改状态。 但是,我想不出一种组合这些操作的方法,即阻止调用进程,直到 某些 FD 准备好或子进程更改状态。 p> 我可以使用轮询,通过反复调用非阻塞epoll 然后waitid,但这很浪费。 可以为子进程创建pidfd(被epoll 接受),但p... »

Ptrace 选项在父进程中不起作用(Linux)

当所需的系统调用在父进程中恢复时,Ptrace 选项不会设置正确的状态。我只能使用这里看到的东西,没有 PEEKUSER、SYSGOOD 或 SYSCALL。这几天看了ptrace man,找例子,心力交瘁。 欢迎任何想法/提示,无论多么小。谢谢。 参数:/bin/bash -c "echo 'first test' | wc -c" #include <stdlib.h> #incl... »

c++

为什么 ptrace 显示一个 32 位 execve 系统调用,其 EAX = 59,即 64 位调用号? 32 位系统调用如何在 x86-64 上工作?

我正在使用下面的代码玩弄ptrace。我发现 execve 的系统调用号是 59,即使我使用 -m32 选项编译也是如此。由于我是在 64 位机器上使用 Ubuntu,所以可以理解。 很快,问题出现了:“libc32 在 32 位机器和 64 位机器上的行为是否不同?它们不同吗?”所以我检查了 libc32 在 64 位中的内容。但是,libc 的 execve 系统调用号是 11,这与 32 位... »

使被跟踪者停止的条件,即使它的父级不需要它

我正在尝试学习使用 ptrace,我编写了一个简单的程序集存根,它 1/ 调用 ptrace(0,0,0,0)(系统调用,而不是 libc 函数)。然后显示 hello world 然后生成一个 shell。我从 bash shell 运行我的代码。 显示 Hello world,但是我的进程在 execve(/bin/sh) 之前停止(我收到后台进程的 bash 通知) 是因为 ptrace 吗... »

将 posix_memalign 调用到附加程序中时出现 RUST 错误 ENOMEM

我会试着总结一下,但这会很复杂。 我在我的大学里有操作系统课程,我有一个实验室工作要做。 我在 Rust 工作(据说实验室工作可以用任何编译语言完成,但最初主要是为 C 设计的)。 所以我有一个tracer程序和一个traced程序。 实验室工作这一步的目标是使用 ptrace 将 tracer 附加到 traced,然后在以下位置注入“trap-call-trap”指令用 traced 中的函数... »

gdb 如何启动一个汇编编译程序并一次执行一行?

Valgrind 在他们的文档页面上说以下内容 然后您的程序将在 Valgrind 内核提供的合成 CPU 上运行 但是 GDB 似乎没有这样做。它似乎启动了一个独立执行的单独进程。据我所知,也没有 c 库。这就是我所做的 使用 clang 或 gcc 编译 gcc -g tiny.s -nostdlib(-g 似乎是必需的) gdb ./a.out 写信starti 按s多次 您会看到... »

仅使用 PTRACE_SINGLESTEP 拦截系统调用

我们有一个学校项目,我们需要重新编码“strace”。 我们只需要拦截像写和读这样的系统调用,但我们不能使用PTRACE_SYSCALL。我正在寻找一种使用PTRACE_SINGLESTEP 的方法,我已经编写了一种打印系统调用的方法,当我使用PTRACE_SYSCALL 它工作正常,但是当我使用PTRACE_SINGLESTEP 我不能找到一种只打印系统调用的方法。 这是我使用的代码,也许有人可... »

c

为什么 ls 的这些指令计数差异如此之大? (ptrace vs perf vs qemu)

我想统计运行 /bin/ls 时执行的指令总数。 我使用了 3 种结果差异很大的方法,但我不知道为什么。 1.使用 ptrace 进行指令计数 我编写了一段代码,它调用 ls 的一个实例并使用 ptrace 单步执行: #include <stdio.h> #include <sys/ptrace.h> #include <sys/types.h> #inclu... »

c

使用 ptrace (linux, c) 从入口点跟踪程序

我想使用 ptrace 跟踪程序的寄存器和指令。为了更好地理解我的代码,我将其减少到只计算“/bin/ls”的指令数量的程度。 这是我的代码(忽略不必要的包含): #include <stdio.h> #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #inclu... »

c

使用 ptrace 的远程 mmap 系统调用(Linux,C)

我已经被这个问题困扰了几天,但仍然没有设法解决它。基本上,我想从攻击者程序到目标进行远程系统调用。但在展示代码之前,我认为展示我的思考过程是个好主意,因为此时问题可能是任何问题。 我正在通过以下步骤执行此远程系统调用: 解析 /proc//maps 文件以获取可执行区域。 将数据存储在可执行区域并编写一个自定义缓冲区,对其进行系统调用。 存储旧寄存器并设置新寄存器以进行系统调用 写入新寄存器并继... »

c

是否可以从 Go 进程应用 Linux 内核 SECCOMP 配置文件?

我正在尝试实现一个支持kernel SECCOMP过滤器的系统调用跟踪器,以通过过滤一些系统调用类型来减少开销。 我发现的所有实现都在 C 中,由于 Go 线程/go-routines 和 fork() 的特殊考虑,我无法弄清楚如何将其映射到 Go。 示例代码(C): if ((pid = fork()) == 0) { ptrace(PTRACE_TRACEME, 0, 0, 0); ... »

go

Ptrace 在子进程中读取 errno 值

strace 如何从它所跟踪的进程中的失败系统调用中获取 errno? 例如,如果我执行strace ls,strace 会在调用失败时显示符号 errno 值(例如 ENOENT)。我知道 strace 在后台使用 ptrace。 如果我使用 ptrace 来跟踪一个进程的系统调用,我如何才能在被跟踪的进程中读取 errno 的值? 更具体地说,如何获取子进程中errno的地址,以便使... »

c