问题标签 [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 投票
0 回答
456 浏览

linux - 为什么我通过 ptrace 注入的这个 sendmsg() 调用不起作用?

我正在尝试将命令注入到我拥有的进程中 - 具体来说,我目前正在尝试将 ptraced 进程的文件描述符传递给 ptracing 进程。我成功地创建了一个 unix 域套接字并连接它(据我所见),如下所示:

但是,实际上发送带有以下代码的文件描述符(这是this的修改形式)失败了:

sendmsg()总是失败-1。所以,我的问题是,有谁知道为什么这不起作用,或者至少能够告诉我如何尝试找到 errno 以获取有关错误的一些线索?我试过这个来找到errno,但PTRACE_PEEKDATA总是失败:

0 投票
3 回答
1563 浏览

linux - 在系统调用中停止时如何获得正确的 orig_eax 值?

我正在使用 ptrace(PTRACE_ATTACH...) 附加到一个进程,而它处于系统调用中(如 nanosleep())。我可以使用 PTRACE_GETREGS 来获取寄存器内容,并且 eip 位于预期位置(在 __kernel_vsyscall 中)。但是,eax 和 orig_eax 寄存器有意外的内容:eax 通常包含 -516,而 orig_eax 通常为 0。

这是我使用的测试程序(取自http://www.linuxjournal.com/article/6210并稍作修改):

附加到在另一个终端中运行的“sleep 10000”命令时的输出:

eax中的值是什么意思?为什么 orig_eax 不包含原始系统调用号(如 162)?在这种情况下,我如何实际获取系统调用号?

另外,为什么 gdb 正确显示“print $orig_eax”的“162”?

顺便提一句。这是在 Ubuntu 12.04 上,内核为 3.2.0:

  • uname -a:“Linux edgebox 3.2.0-24-generic-pae #37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012 i686 athlon i386 GNU/Linux”
  • /proc/cpuinfo:“AMD Athlon(tm) II Neo K345 双核处理器”
  • 文件which sleep:“/bin/sleep:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.24,BuildID[sha1]=0x0965431bde4d183eaa2fa3e3989098ce46b92129,已剥离”。

所以它是一个 32 位 PAE 内核和 64 位 CPU 上的 32 位 Ubuntu 安装。

0 投票
1 回答
3791 浏览

linux - 带有请求 PTRACE_POKETEXT 的 ptrace 失败

我正在尝试在跟踪的进程中注入代码...我能够正确读取寄存器(PTRACE_GETREGS)并且也可以PTRACE_PEEKTEXT工作...我已经使用 GDB 进行了验证。但是,如果我ptracePTRACE_POKETEXT请求调用它会返回0但在同一地址再次读取我找不到预期的字节:

第一个print_word精确打印 GDB 显示的四个字节。第二个print_word代替打印奇怪的字节而不是0xAABBCCDD.

有任何想法吗?

0 投票
3 回答
4657 浏览

c - 使用 ptrace() 取消系统调用

出于某种安全目的,我使用 ptrace 来获取系统调用号,如果它是一个危险的调用(比如 10 表示取消链接),我想取消这个系统调用。

这是测试程序的源代码del.c。用 编译gcc -o del del.c

这是安全管理器源代码test.c。用 编译gcc -o test test.c

创建abc.out文件,然后运行测试程序:

该文件/root/abc.out应该仍然存在。

我如何实现这个要求?

0 投票
2 回答
2017 浏览

debugging - utrace 项目死了吗?

我试图使用 stap 来跟踪用户空间可执行文件,正如这个答案所建议的: https ://stackoverflow.com/a/324709/368507

为此,内核必须有 utrace 补丁,但我找不到最新内核的任何 utrace 补丁。

邮件列表已关闭,官方网站上的许多链接都已损坏。

有人知道这个项目的去向吗?它死了吗?这是否意味着我们不能再使用 stap 来跟踪最近内核上的可执行文件?

谢谢

0 投票
0 回答
1420 浏览

ptrace - 是否可以使用 PTRACE_SETREGS 来更改进程的执行顺序?

是否可以使用 PTRACE_SETREGS 来更改进程的执行顺序?我在进程执行的某个点保存进程寄存器文件,我想稍后使用它来设置进程的当前寄存器文件(此时再次重复执行)。下面是我尝试使用的代码,但它不起作用。有人可以向我解释它有什么问题或我对 ptrace 有什么误解吗?

0 投票
2 回答
2675 浏览

c - C 和 execve(3) 参数

我正在做一个与strace(1)使用ptrace(). 基本上,我们有一个 controller.c 程序,它接受一个可执行文件作为参数,它输出可执行文件所做的任何系统调用(例如% controller ls -l)我们正在使用execve()来运行可执行文件,但是我们遇到了一些麻烦。execve 采用以下参数

其中 filename 在这种情况下是"ls", 并且argv[]是给定文件名的参数列表。所以我们有一些看起来像这样的东西(在 C 文件中)

因此,如果我们得到一个可执行文件,例如controller ls -lwhere argv[0] = "controller"argv[1] = "ls"argv[2] = "-l",我们如何在“ARGUMENT LIST”中传递正确的参数(这种情况下的参数只是"-l"但可能更多)?

基本上,我们如何初始化一个类型的数组,以const char *使该数组具有可执行文件的参数值?我们是否甚至需要担心数组中有额外的值并且只是过去argv的 ARGUMENT LIST?

谢谢你的帮助!

0 投票
2 回答
521 浏览

linux - fork 后的 Linux 用户空间 ELF 加载程序极其奇怪的行为

考虑以下代码(由于公众需求重新编译:):

a.out 程序是一个简单的 main() { return 0; } 程序。

如果您编译并运行此代码,您将看到子进程尝试 mmap()fopen("log") 调用打开的文件。您将通过失败的断言看到这一点。

我进一步研究并发现这发生在加载子进程期间。

这很奇怪,原因有两个:

  1. 孩子根本不应该知道 fopen() 调用,因为它发生在 fork() 之后
  2. 为什么加载程序会尝试映射此文件?它甚至不是可执行文件。

我在 glibc 中查看了 dl-load.c ,但没有看到任何应该调用这种行为的东西。

有任何想法吗?

谢谢

0 投票
2 回答
4597 浏览

xcode - 使用 vm_read 和 vm_write 在 OS X 10.8.2 上读/写内存

这是我仅适用于 Xcode(4.5 版)的代码:

我也在尝试 ptrace 和其他东西,这就是为什么我也包含其他库。

第一个问题是这仅适用于 Xcode,我可以使用调试器找到变量的位置(内存地址)(在这种情况testvaluetesttest1

我实际上不明白 vm_write 是如何工作的(不完全)task_for_pid(),对于 2° 的问题是我需要在另一个进程上读写,这只是测试函数是否在同一个进程上工作,它可以工作(仅在 Xcode 上)。

我如何在其他进程上做到这一点?我需要读取一个位置(如何找到“某物”的地址?),这是第一个目标。

0 投票
2 回答
1857 浏览

linux - linux ptrace() 获取函数信息

我想使用 ptrace() 调用从用户定义的函数中捕获信息。

但函数地址不稳定(因为 ASLR)。

如何以编程方式获取其他程序的功能信息,例如 gdb?