问题标签 [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.
c - 为什么这个 ptrace 错误?
我只是通过调用测试读写内存ptrace()
,但是当我运行下面显示的代码时,我收到了这样的错误。
如您所见,readmem()
工作正常,但之后会readmem()
打印错误。
但是——这让我发疯了——当我测试没有函数的代码(只是在 中内联代码main()
)时,整个代码运行良好!
有谁知道为什么会发生这种情况...?
c++ - 如何防止使用 ptrace 执行系统调用
我正在开发一个类似 Ideone 的系统,其中不受信任的用户代码必须在沙盒模式下运行。
为此,我一直在寻找ptrace
第一层保护的可能性。然而,经过几次实验后,似乎:
- 我可以在调用之前拦截系统调用并修改输入参数。
- 我可以在调用系统调用后拦截它并更改返回值。
- 但是,似乎根本没有办法阻止调用发生(除了杀死整个应用程序)。
我想拦截某些系统调用并返回一个虚假的结果代码,而不会实际发生调用。有没有办法实现这个?
memory-management - Ptrace 和内存分配
我已经玩了一段时间了ptrace
。我遵循了一些教程,例如this one或this one。到目前为止,当我有一个ptrace
-d 子进程时,我能够:
- 检测系统调用并浏览寄存器。
- 借助.
PTRACE_PEEKDATA
_ptrace
- 借助.
PTRACE_POKEDATA
_ptrace
我的问题如下:假设我刚刚检测到一个open
系统调用。由于存储在 ebx 寄存器中的地址,我可以修改要打开的文件的文件名。但是,我想知道是否可以将文件名更改为任何我想要的任何大小。如果我要更改的名称非常大(假设是原始文件名长度的 50 倍),我不会弄乱一些我不应该写的内存吗?我应该在孩子的记忆空间中“分配”一些记忆吗?如果是这样,这将如何完成?
请注意,子进程是一些用 执行的程序execve
,我无法访问它的源代码。
c++ - 在多线程应用程序中使用 ptrace
我想用来ptrace
检查我的程序生成的程序的系统调用是什么。我从本教程开始,正如我在上一个问题的答案中所解释的那样。我修改了代码,使其适应我正在使用的平台(SLES 11 64 位),并将以下测试代码放在一起,打印出生成的进程进行的每个系统调用:
它工作得很好:它打印程序进行的系统调用的 id(实际上它打印每个两次,一次在进入时,一次在退出时,但现在没关系)。但是,我的程序除了检查系统调用之外还需要做其他事情,所以我决定将检查移到一个单独的线程中(我对 C++ 比对 C 更舒服,所以我用 C++ 的方式来做,但是我不要认为这很重要)。当然在这个最新的程序中,我只是启动线程然后加入它。
这次我收到一条错误消息:
为什么是这样?我试图寻找答案,但没有找到这样的答案。我发现ptrace
不会跟踪子进程启动的线程,但这是另一件事需要稍后处理。甚至可以从不同的therad检查子进程吗?
另一个奇怪的事情是,在我的实际应用程序中,我基本上做同样的事情(但来自更复杂的上下文:类、互斥体等),但我得到了另一种错误。而不是ptrace
返回错误,wait
甚至不返回子进程的系统调用(并且子进程甚至不会停止)。另一方面,wait
当子进程退出时按预期工作。
linux - 如何使用 ptrace(2) 改变系统调用的行为?
是否有任何指南或示例(尤其是 ARM 的)或ptrace
用于影响其他进程执行的库?例如,让它相信一些数据出现在文件描述符上(即释放选择/轮询并在内核之前“回答”以下读取系统调用)。期待涉及 PTRACE_SYSEMU 的事情。
它可以以便携式方式完成吗?我想要类似 libc-overriding LD_PRELOAD 技巧的东西,但可以在运行时附加。
可以用一些 gdb 命令来完成吗?
理想的变体是,如果有一些库,我可以轻松且可移植地挂接到系统调用并在实际调用(或模拟它们)之前或之后对其进行编辑,例如使用 LD_PRELOAD 进行操作时。
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()
父进程中系统调用的返回点,这意味着子进程成功完成,但父进程挂起它的分叉点。
c - 带有 ptrace 的内存调试器
我想使用内存调试器的功能(只是泄漏检测)扩展现有工具。
我知道一些内存调试器通过替换 malloc/free 并跟踪待释放的内容以及分配它的人来工作;或者通过在某种虚拟机上运行进程并监视内存访问。
我想知道使用ptrace()
在 malloc/free 上设置断点是否有意义,而不是使用dmalloc进行重建,并在单独的进程中监视分配。会不会太慢?有其他工具以这种方式工作吗?
python - 如何在linux中读取python中进程的内存?
我正在尝试使用 python 和 python ptrace 来读取外部进程的内存。我需要完全在 python 中工作,我一直在尝试读取和打印 linux 中进程的内存。
因此,例如,我尝试了以下代码,它不断给我 IO 错误:
大多数情况下,我只想反复转储进程的内存并寻找随时间的变化。如果这是正确的方法,那么我的问题是什么?或者有没有更合适的方法来做到这一点?
c++ - 使用 ptrace 时 mmap 的返回值
我正在学习如何使用 ptrace,但遇到了一个奇怪的问题:
我写了一个程序:
它只是使用错误的参数进行 mmap 系统调用。然后它打印返回值(也是二进制)和errno。
这里我有这个程序执行后的输出:
我用 strace 运行它:
并且 strace 告诉这个错误的 mmap 返回 -1 并带有错误 ENOMEM。
到现在一切正常。
这是我的 ptrace 代码(我剪掉了所有不需要的东西):
它应该打印与子打印相同的东西——返回 mmap2 系统调用的值。
但这是输出:
为什么 mmap 返回 -12?我是否错误地捕获了返回值?
c - 跟踪进程产生的所有线程
当被跟踪的进程 t1 调用 clone() 和 fork() 并产生另一个线程 t2 时,我正在努力理解 ptrace 的行为。根据文档,内核通过 SIGSTOP 信号停止 t1,而跟踪器开始跟踪 t2。t2过程什么时候会继续?它将如何被唤醒?让我们考虑一下我有一个线程池并且我想监视它们的情况。如果同时执行多个线程,我该如何跟踪它们?