问题标签 [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.
java - 多线程、带 STOP 和继续信号的多处理
我正在开发一个项目,我需要在其中获取 Java 应用程序的本机堆栈。我能够部分地实现这一点。感谢 ptrace/multiprocessing 和信号。
在 Linux 上,普通的 java 应用程序至少有 14 个线程。在这 14 个中,我只对必须获取本机堆栈的主线程感兴趣。考虑到这个目标,我已经使用 fork() 启动了一个单独的进程,它正在监视主线程的本机堆栈。简而言之,我有 2 个单独的进程:一个正在被监控,另一个使用 ptrace 和信号处理进行监控。
监测过程中的步骤:
1) 从进程中的其他 14 个线程中获取主线程 ID。
2) ptrace_attach main_ID
3) ptrace_cont main_ID
连续循环开始
{
4)杀死(main_ID,SIGSTOP),
5) nanosleep 并从 /proc/[pid]/stat 目录检查状态
6) ptrace_peekdata 读取堆栈和导航
7) ptrace_cont main_ID
8) nanosleep 并从 /proc/[pid]/stat 目录检查状态
}
9) ptrace_detach main_ID
这完美地连续提供了本机堆栈信息。但有时我面临一个问题。
问题:
当我将 kill(main_ID, SIGSTOP) 发送到主线程时,进程中的其他线程进入完成或停止状态(T)并且整个进程阻塞。这不是一致性行为,整个过程正确执行。我无法理解这种行为,因为我只是在向主线程发出信号,为什么其他线程会受到影响?有人可以帮我分析问题吗?
我也尝试在进程的所有线程上执行 CONT 和 STOP 信号,但有时问题仍然存在。
谢谢,桑迪普
c++ - 使用 ptrace 在用户空间编写程序管理器
我将寻找建议/资源来编写一个程序,该程序可以拦截来自程序的系统调用以监督它的文件系统、网络等访问。
这样做的目的是编写一个在线判断,以便不受信任的代码可以在服务器上安全运行。
这是在 linux 上的,我更喜欢编写 C++ 或脚本语言(ruby、python 等),而且库会很棒!
谢谢。
signals - ptrace 时如何在调试器中获取信号详细信息?
我有一个调试器,我正在从 linux 移植到 *bsd。目前,我正在开发 OpenBSD 版本。
在某些情况下,我想知道所传递信号的详细信息。例如,假设交付了一个 SIGSEGV,我想知道故障地址是什么,如果可能的话,它是读取还是写入。
另一个例子是如果我收到一个陷阱,它是一个单步事件吗?或者可能是一个 INT3 操作码。
在 linux 上,我通过调用以下命令获取此信息:
这很有效,因为它让我可以访问我可能想知道的关于信号的所有信息。OpenBSD 上似乎没有等价物。我查看了哪些可以使用 KVM API 访问kinfo_proc
,kinfo_proc2
但没有什么能像 siginfo_t 那样拥有相同类型的信息。获取此信息的正确方法是什么?
linux - Linux ptrace 如何不安全或包含竞争条件?
我想通过ptrace()
创建一个我启动的进程以及它的所有子进程(包括孙子进程等)来实现一个沙盒。父进程,ptrace()
即主管。将是一个简单的 C 或 Python 程序,从概念上讲,它将限制文件系统访问(基于路径名和访问方向(读或写)和套接字访问(例如,不允许创建套接字)。
我应该注意什么,以使ptrace()
d 进程及其子进程(递归)无法绕过沙箱?主管有什么特别的事情应该做fork()
以避免竞争条件吗?rename()
是否可以在没有竞争条件的情况下从子进程中读取 eg 的文件名参数?
这是我已经计划做的事情:
PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE
避免(某些)比赛fork()
规则- 默认禁止所有系统调用,并组成允许系统调用的白名单
- 确保
*at()
系统调用变体(例如openat
)得到适当保护
我还应该注意什么?
linux - UNIX ptrace() 阻止子系统调用
我正在为编程竞赛开发一个分级机。基本上,评分者必须在“孤立”的过程中运行解决方案。所以,我希望解决方案不要调用任何有害的系统调用(例如 system()、fork() 等)。我可以使用 ptrace() 来实现吗?
c - Using ptrace to track all execve() calls across children
I am trying to write a tool on Linux CentOS to track all spawned processes and what is run. In essence, I'm interested in walking all fork/clones and emitting all the command-lines from execve()
. Strace already does (some of) this, but it also truncates the calls and the arguments. I also wanted to better understand how ptrace()
works.
So, the first roadblock was figuring out how to use ptrace()
to walk a fork/clone without having the tracing program require to fork a copy of itself. I dug in and found out how strace does this. Since fork is implemented with clone on Linux, I noticed that strace pounds some bits into the clone syscall to enable child tracing w/o any extra headache.
So, in essence the code is just a big:
This works fine for relatively simple processes like /bin/sh
, however, some processes are causing the wait()
to hang indefinitely. The only thing I've been able to determine is that the process I'm tracing is performing a sys_rt_sigsuspend()
on it's child (so, the tracer's grandchild) and then things wedge.
I was curious if there's a sane way I can debug what might be happening. Something is clearly preventing the process tree from making forward progress
Here's the source code of the program in question:
linux - ptrace 附加到 vsftpd 挂起
我正在尝试在 linux 上跟踪 vsftpd 服务器进程,以便能够在 vsftpd 进程进行系统调用时获得控制。我启动 vsftpd 进程并将这个进程 ID 作为命令行传递给跟踪 vsftpd 的以下程序。
但是,当我运行以下程序时,它只是挂起并且不打印任何内容。谁能指出可能出了什么问题?非常感谢你的帮助!!
linux - 关于使用 PTRACE_SYSEMU 的任何好的指南?
有人对PTRACE_SYSEMU的使用有任何好的解释、教程、书籍或指南吗?
c - 如何 ptrace 多线程应用程序?
编辑(取得进展):
我正在尝试 ptrace 一个 vsftpd 守护进程。我有以下附加到守护程序的代码。然后它成功地显示了第一个生成的进程的 PID。但是,对于这个衍生进程的子进程,它将 PID 返回为 2,3,.. 该程序确实捕获了衍生进程的退出,这让我觉得我很接近。
有任何想法吗?
样本输出:
linux - sys_open 的 ptrace %edx 不一致
我正在尝试使用 ptrace 从 sys_open 系统调用中获取文件名。我获得了文件路径指针,并且能够从该地址获得正确的数据,但是,我需要一种方法来知道要获得多少数据,即文件名的长度。我认为这个值应该在 edx 中,但这里似乎并非如此。有什么想法吗?
样本输出:
只是edx: