如何在C中检索传递给linux系统调用的参数?

时间:2016-09-04 03:40:03

标签: c linux system-calls ptrace

我正在使用ptrace跟踪系统调用,如read,write,open等。如果存在打开的系统调用,则可以从user_regs_struct检索传递给此系统调用的参数。第一个参数存储在rdi寄存器中。 rdi的内容是unsigned long long int。如何从中检索字符串文件名,例如。传递给开放系统调用的foo.txt?

1 个答案:

答案 0 :(得分:0)

传递给open的参数(以及系统调用接收字符串的任何其他情况)是指向字符串在内存中的位置的指针。

不幸的是,这些指针适用于debugee的地址空间,不能直接从调试器的地址空间引用。

ptrace文档会让您反复调用ptrace(PTRACE_PEEKDATA...)以一次获取字符串,4(或8,取决于平台)字节。您可以在旧的fakeroot-ng code中看到如何执行此操作的示例。请注意,该代码属于GPL,因此除非您编写兼容许可证的代码,否则不要逐字复制。

幸运的是,有一种方法可以更快地获取更简单的数据。它不太便于携带,但如果您正在编写ptrace代码,则通常无需关心。

跟踪线程可以打开文件/proc/pid/mem(其中 pid 当然是debugee的数字pid)。请注意,只有 pid 的ptracer才能打开该文件。

一旦该文件打开,您可以在所需地址的偏移量处pread(2),并直接从debugee的地址空间获取数据。由于read接口不限于四个字节,您可以猜测字符串的长度,读取多少字节,然后找到终止NULL并知道精确的字符串。

由于您调用的系统调用较少,因此该方法不仅更容易,而且速度更快。