问题标签 [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 回答
465 浏览

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 信号,但有时问题仍然存在。

谢谢,桑迪普

0 投票
2 回答
1178 浏览

c++ - 使用 ptrace 在用户空间编写程序管理器

我将寻找建议/资源来编写一个程序,该程序可以拦截来自程序的系统调用以监督它的文件系统、网络等访问。

这样做的目的是编写一个在线判断,以便不受信任的代码可以在服务器上安全运行。

这是在 linux 上的,我更喜欢编写 C++ 或脚本语言(ruby、python 等),而且库会很棒!

谢谢。

0 投票
1 回答
762 浏览

signals - ptrace 时如何在调试器中获取信号详细信息?

我有一个调试器,我正在从 linux 移植到 *bsd。目前,我正在开发 OpenBSD 版本。

在某些情况下,我想知道所传递信号的详细信息。例如,假设交付了一个 SIGSEGV,我想知道故障地址是什么,如果可能的话,它是读取还是写入。

另一个例子是如果我收到一个陷阱,它是一个单步事件吗?或者可能是一个 INT3 操作码。

在 linux 上,我通过调用以下命令获取此信息:

这很有效,因为它让我可以访问我可能想知道的关于信号的所有信息。OpenBSD 上似乎没有等价物。我查看了哪些可以使用 KVM API 访问kinfo_prockinfo_proc2 但没有什么能像 siginfo_t 那样拥有相同类型的信息。获取此信息的正确方法是什么?

0 投票
2 回答
2690 浏览

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

我想通过ptrace()创建一个我启动的进程以及它的所有子进程(包括孙子进程等)来实现一个沙盒。父进程,ptrace()即主管。将是一个简单的 C 或 Python 程序,从概念上讲,它将限制文件系统访问(基于路径名和访问方向(读或写)和套接字访问(例如,不允许创建套接字)。

我应该注意什么,以使ptrace()d 进程及其子进程(递归)无法绕过沙箱?主管有什么特别的事情应该做fork()以避免竞争条件吗?rename()是否可以在没有竞争条件的情况下从子进程中读取 eg 的文件名参数?

这是我已经计划做的事情:

  • PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE避免(某些)比赛fork()规则
  • 默认禁止所有系统调用,并组成允许系统调用的白名单
  • 确保*at()系统调用变体(例如openat)得到适当保护

我还应该注意什么?

0 投票
2 回答
1235 浏览

linux - UNIX ptrace() 阻止子系统调用

我正在为编程竞赛开发一个分级机。基本上,评分者必须在“孤立”的过程中运行解决方案。所以,我希望解决方案不要调用任何有害的系统调用(例如 system()、fork() 等)。我可以使用 ptrace() 来实现吗?

0 投票
3 回答
12434 浏览

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:

0 投票
1 回答
768 浏览

linux - ptrace 附加到 vsftpd 挂起

我正在尝试在 linux 上跟踪 vsftpd 服务器进程,以便能够在 vsftpd 进程进行系统调用时获得控制。我启动 vsftpd 进程并将这个进程 ID 作为命令行传递给跟踪 vsftpd 的以下程序。

但是,当我运行以下程序时,它只是挂起并且不打印任何内容。谁能指出可能出了什么问题?非常感谢你的帮助!!

0 投票
2 回答
2426 浏览

linux - 关于使用 PTRACE_SYSEMU 的任何好的指南?

有人对PTRACE_SYSEMU的使用有任何好的解释、教程、书籍或指南吗?

0 投票
4 回答
6945 浏览

c - 如何 ptrace 多线程应用程序?

编辑(取得进展):

我正在尝试 ptrace 一个 vsftpd 守护进程。我有以下附加到守护程序的代码。然后它成功地显示了第一个生成的进程的 PID。但是,对于这个衍生进程的子进程,它将 PID 返回为 2,3,.. 该程序确实捕获了衍生进程的退出,这让我觉得我很接近。

有任何想法吗?

样本输出:

0 投票
1 回答
785 浏览

linux - sys_open 的 ptrace %edx 不一致

我正在尝试使用 ptrace 从 sys_open 系统调用中获取文件名。我获得了文件路径指针,并且能够从该地址获得正确的数据,但是,我需要一种方法来知道要获得多少数据,即文件名的长度。我认为这个值应该在 edx 中,但这里似乎并非如此。有什么想法吗?

样本输出:

只是edx: