问题标签 [ptrace]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1486 浏览

c - 为什么这个 ptrace 错误?

我只是通过调用测试读写内存ptrace(),但是当我运行下面显示的代码时,我收到了这样的错误。

如您所见,readmem()工作正常,但之后会readmem()打印错误。

但是——这让我发疯了——当我测试没有函数的代码(只是在 中内联代码main())时,整个代码运行良好!

有谁知道为什么会发生这种情况...?

0 投票
2 回答
1375 浏览

c++ - 如何防止使用 ptrace 执行系统调用

我正在开发一个类似 Ideone 的系统,其中不受信任的用户代码必须在沙盒模式下运行。

为此,我一直在寻找ptrace第一层保护的可能性。然而,经过几次实验后,似乎:

  • 我可以在调用之前拦截系统调用并修改输入参数。
  • 我可以在调用系统调用后拦截它并更改返回值。
  • 但是,似乎根本没有办法阻止调用发生(除了杀死整个应用程序)。

我想拦截某些系统调用并返回一个虚假的结果代码,而不会实际发生调用。有没有办法实现这个?

0 投票
1 回答
1507 浏览

memory-management - Ptrace 和内存分配

我已经玩了一段时间了ptrace。我遵循了一些教程,例如this onethis one。到目前为止,当我有一个ptrace-d 子进程时,我能够:

  • 检测系统调用并浏览寄存器。
  • 借助. PTRACE_PEEKDATA_ptrace
  • 借助. PTRACE_POKEDATA_ptrace

我的问题如下:假设我刚刚检测到一个open系统调用。由于存储在 ebx 寄存器中的地址,我可以修改要打开的文件的文件名。但是,我想知道是否可以将文件名更改为任何我想要的任何大小。如果我要更改的名称非常大(假设是原始文件名长度的 50 倍),我不会弄乱一些我不应该写的内存吗?我应该在孩子的记忆空间中“分配”一些记忆吗?如果是这样,这将如何完成?

请注意,子进程是一些用 执行的程序execve,我无法访问它的源代码。

0 投票
1 回答
1573 浏览

c++ - 在多线程应用程序中使用 ptrace

我想用来ptrace检查我的程序生成的程序的系统调用是什么。我从本教程开始,正如我在上一个问题的答案中所解释的那样。我修改了代码,使其适应我正在使用的平台(SLES 11 64 位),并将以下测试代码放在一起,打印出生成的进程进行的每个系统调用:

它工作得很好:它打印程序进行的系统调用的 id(实际上它打印每个两次,一次在进入时,一次在退出时,但现在没关系)。但是,我的程序除了检查系统调用之外还需要做其他事情,所以我决定将检查移到一个单独的线程中(我对 C++ 比对 C 更舒服,所以我用 C++ 的方式来做,但是我不要认为这很重要)。当然在这个最新的程序中,我只是启动线程然后加入它。

这次我收到一条错误消息:

为什么是这样?我试图寻找答案,但没有找到这样的答案。我发现ptrace不会跟踪子进程启动的线程,但这是另一件事需要稍后处理。甚至可以从不同的therad检查子进程吗?

另一个奇怪的事情是,在我的实际应用程序中,我基本上做同样的事情(但来自更复杂的上下文:类、互斥体等),但我得到了另一种错误。而不是ptrace返回错误,wait甚至不返回子进程的系统调用(并且子进程甚至不会停止)。另一方面,wait当子进程退出时按预期工作。

0 投票
1 回答
4835 浏览

linux - 如何使用 ptrace(2) 改变系统调用的行为?

是否有任何指南或示例(尤其是 ARM 的)或ptrace用于影响其他进程执行的库?例如,让它相信一些数据出现在文件描述符上(即释放选择/轮询并在内核之前“回答”以下读取系统调用)。期待涉及 PTRACE_SYSEMU 的事情。

它可以以便携式方式完成吗?我想要类似 libc-overriding LD_PRELOAD 技巧的东西,但可以在运行时附加。

可以用一些 gdb 命令来完成吗?

理想的变体是,如果有一些库,我可以轻松且可移植地挂接到系统调用并在实际调用(或模拟它们)之前或之后对其进行编辑,例如使用 LD_PRELOAD 进行操作时

@link关于使用 PTRACE_SYSEMU 有什么好的指南吗?

0 投票
1 回答
4002 浏览

c++ - 跟踪进程和所有分叉进程的系统调用

ptrace用来跟踪进程的系统调用。分叉进程后,我使用PTRACE_TRACEME开始跟踪进程。代码如下所示:

然后是handleTrace函数,看起来像这样。

这一切都很好,但是如果程序分叉(或创建一个新线程),我还想跟踪跟踪的进程创建的子进程(以及该进程创建的线程)。我知道它可以使用PTRACE_O_TRACEFORK,PTRACE_O_TRACEVFORK和来完成PTRACE_O_TRACECLONE,但是从man文档中很难弄清楚它是如何完成的。我需要一些例子。

编辑:

我在这里发现了一个类似的问题:How to ptrace a multi-threaded application?我用下面的代码试了一下。此代码跟踪启动进程的系统调用,它也应该跟踪分叉进程。它fork()在父进程中的 a 之后运行(子进程调用 aPTRACE_TRACEME和 an exec())。

编辑2:

我对代码进行了更多修改,并取得了更多进展。

CHECK_ERROR_VALUE只是一个检查结果代码并抛出异常的宏,其中的描述errno

显然,当我收到 fork/clone 事件时,新进程还不存在,如果我尝试对其进行 ptrace,则会收到“进程不存在”错误消息。如果我在尝试 ptrace 新进程之前进入睡眠状态,我不会收到错误消息。现在当程序到达fork/clone点时,它开始跟踪新进程,但它永远不会到达clone()父进程中系统调用的返回点,这意味着子进程成功完成,但父进程挂起它的分叉点。

0 投票
1 回答
424 浏览

c - 带有 ptrace 的内存调试器

我想使用内存调试器的功能(只是泄漏检测)扩展现有工具。

我知道一些内存调试器通过替换 malloc/free 并跟踪待释放的内容以及分配它的人来工作;或者通过在某种虚拟机上运行进程并监视内存访问。

我想知道使用ptrace()在 malloc/free 上设置断点是否有意义,而不是使用dmalloc进行重建,并在单独的进程中监视分配。会不会太慢?有其他工具以这种方式工作吗?

0 投票
2 回答
5475 浏览

python - 如何在linux中读取python中进程的内存?

我正在尝试使用 python 和 python ptrace 来读取外部进程的内存。我需要完全在 python 中工作,我一直在尝试读取和打印 linux 中进程的内存。

因此,例如,我尝试了以下代码,它不断给我 IO 错误:

大多数情况下,我只想反复转储进程的内存并寻找随时间的变化。如果这是正确的方法,那么我的问题是什么?或者有没有更合适的方法来做到这一点?

0 投票
1 回答
1178 浏览

c++ - 使用 ptrace 时 mmap 的返回值

我正在学习如何使用 ptrace,但遇到了一个奇怪的问题:

我写了一个程序:

它只是使用错误的参数进行 mmap 系统调用。然后它打印返回值(也是二进制)和errno。

这里我有这个程序执行后的输出:

我用 strace 运行它:

并且 strace 告诉这个错误的 mmap 返回 -1 并带有错误 ENOMEM。

到现在一切正常。

这是我的 ptrace 代码(我剪掉了所有不需要的东西):

它应该打印与子打印相同的东西——返回 mmap2 系统调用的值。

但这是输出:

为什么 mmap 返回 -12?我是否错误地捕获了返回值?

0 投票
0 回答
182 浏览

c - 跟踪进程产生的所有线程

当被跟踪的进程 t1 调用 clone() 和 fork() 并产生另一个线程 t2 时,我正在努力理解 ptrace 的行为。根据文档,内核通过 SIGSTOP 信号停止 t1,而跟踪器开始跟踪 t2。t2过程什么时候会继续?它将如何被唤醒?让我们考虑一下我有一个线程池并且我想监视它们的情况。如果同时执行多个线程,我该如何跟踪它们?