问题标签 [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.
linux - 为什么我通过 ptrace 注入的这个 sendmsg() 调用不起作用?
我正在尝试将命令注入到我拥有的进程中 - 具体来说,我目前正在尝试将 ptraced 进程的文件描述符传递给 ptracing 进程。我成功地创建了一个 unix 域套接字并连接它(据我所见),如下所示:
但是,实际上发送带有以下代码的文件描述符(这是this的修改形式)失败了:
sendmsg()
总是失败-1
。所以,我的问题是,有谁知道为什么这不起作用,或者至少能够告诉我如何尝试找到 errno 以获取有关错误的一些线索?我试过这个来找到errno,但PTRACE_PEEKDATA
总是失败:
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 安装。
linux - 带有请求 PTRACE_POKETEXT 的 ptrace 失败
我正在尝试在跟踪的进程中注入代码...我能够正确读取寄存器(PTRACE_GETREGS
)并且也可以PTRACE_PEEKTEXT
工作...我已经使用 GDB 进行了验证。但是,如果我ptrace
用PTRACE_POKETEXT
请求调用它会返回0
但在同一地址再次读取我找不到预期的字节:
第一个print_word
精确打印 GDB 显示的四个字节。第二个print_word
代替打印奇怪的字节而不是0xAABBCCDD
.
有任何想法吗?
c - 使用 ptrace() 取消系统调用
出于某种安全目的,我使用 ptrace 来获取系统调用号,如果它是一个危险的调用(比如 10 表示取消链接),我想取消这个系统调用。
这是测试程序的源代码del.c
。用 编译gcc -o del del.c
。
这是安全管理器源代码test.c
。用 编译gcc -o test test.c
。
创建abc.out
文件,然后运行测试程序:
该文件/root/abc.out
应该仍然存在。
我如何实现这个要求?
debugging - utrace 项目死了吗?
我试图使用 stap 来跟踪用户空间可执行文件,正如这个答案所建议的: https ://stackoverflow.com/a/324709/368507
为此,内核必须有 utrace 补丁,但我找不到最新内核的任何 utrace 补丁。
邮件列表已关闭,官方网站上的许多链接都已损坏。
有人知道这个项目的去向吗?它死了吗?这是否意味着我们不能再使用 stap 来跟踪最近内核上的可执行文件?
谢谢
ptrace - 是否可以使用 PTRACE_SETREGS 来更改进程的执行顺序?
是否可以使用 PTRACE_SETREGS 来更改进程的执行顺序?我在进程执行的某个点保存进程寄存器文件,我想稍后使用它来设置进程的当前寄存器文件(此时再次重复执行)。下面是我尝试使用的代码,但它不起作用。有人可以向我解释它有什么问题或我对 ptrace 有什么误解吗?
c - C 和 execve(3) 参数
我正在做一个与strace(1)
使用ptrace()
. 基本上,我们有一个 controller.c 程序,它接受一个可执行文件作为参数,它输出可执行文件所做的任何系统调用(例如% controller ls -l
)我们正在使用execve()
来运行可执行文件,但是我们遇到了一些麻烦。execve 采用以下参数
其中 filename 在这种情况下是"ls"
, 并且argv[]
是给定文件名的参数列表。所以我们有一些看起来像这样的东西(在 C 文件中)
因此,如果我们得到一个可执行文件,例如controller ls -l
、where argv[0] = "controller"
、argv[1] = "ls"
和argv[2] = "-l"
,我们如何在“ARGUMENT LIST”中传递正确的参数(这种情况下的参数只是"-l"
但可能更多)?
基本上,我们如何初始化一个类型的数组,以const char *
使该数组具有可执行文件的参数值?我们是否甚至需要担心数组中有额外的值并且只是过去argv
的 ARGUMENT LIST?
谢谢你的帮助!
linux - fork 后的 Linux 用户空间 ELF 加载程序极其奇怪的行为
考虑以下代码(由于公众需求重新编译:):
a.out 程序是一个简单的 main() { return 0; } 程序。
如果您编译并运行此代码,您将看到子进程尝试 mmap()父fopen("log") 调用打开的文件。您将通过失败的断言看到这一点。
我进一步研究并发现这发生在加载子进程期间。
这很奇怪,原因有两个:
- 孩子根本不应该知道 fopen() 调用,因为它发生在 fork() 之后
- 为什么加载程序会尝试映射此文件?它甚至不是可执行文件。
我在 glibc 中查看了 dl-load.c ,但没有看到任何应该调用这种行为的东西。
有任何想法吗?
谢谢
xcode - 使用 vm_read 和 vm_write 在 OS X 10.8.2 上读/写内存
这是我仅适用于 Xcode(4.5 版)的代码:
我也在尝试 ptrace 和其他东西,这就是为什么我也包含其他库。
第一个问题是这仅适用于 Xcode,我可以使用调试器找到变量的位置(内存地址)(在这种情况test
下value
为test
上test1
。
我实际上不明白 vm_write 是如何工作的(不完全)task_for_pid()
,对于 2° 的问题是我需要在另一个进程上读写,这只是测试函数是否在同一个进程上工作,它可以工作(仅在 Xcode 上)。
我如何在其他进程上做到这一点?我需要读取一个位置(如何找到“某物”的地址?),这是第一个目标。
linux - linux ptrace() 获取函数信息
我想使用 ptrace() 调用从用户定义的函数中捕获信息。
但函数地址不稳定(因为 ASLR)。
如何以编程方式获取其他程序的功能信息,例如 gdb?