首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ptrace提取系统调用名和参数

使用ptrace提取系统调用名和参数
EN

Stack Overflow用户
提问于 2015-10-30 08:53:15
回答 2查看 4.8K关注 0票数 3

我正在执行一项任务,在该任务中,我必须使用ptrace实现类似于ptrace的功能。到目前为止,我已经了解了如何提取系统调用号和返回值,如下所示:

代码语言:javascript
复制
//In parent process
struct user_regs_struct regs;
ptrace( PTRACE_GETREGS, child_pid, 0, &regs ); 
//child_pid is the pid of child process executing the required program
//or system call passed as command line arguments
syscall_num = regs.orig_rax;
syscall_retval = regs.rax;

但是我还没有找到如何提取系统调用的名称和参数。有人能提出建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-30 09:45:25

要获得系统调用的参数,您必须逐个读取寄存器。为此,您需要知道哪些寄存器将存储系统调用的哪些参数。几个月前,我自己写了一个这样的程序。基本上,每个寄存器存储的内容如下:

regs.rdi -存储第一个参数 regs.rsi -存储第二个参数 regs.rdx -存储第三个参数 regs.r10 -存储第四个参数 regs.r8 -存储第五个参数 regs.r9 -存储第六个参数

这个表格提供了一个更详细的描述(注意,它是特定于x8664体系结构的)。

现在,您必须查看每个系统调用的文档,以便分别理解它们并编写代码。阅读不同的论点有不同的方法。

read() 让系统调用来演示这个.

我们将看到不同类型的参数,并查看如何访问它们。

第一次论证(int fd)

因为它是一个数字,所以它将直接保存在寄存器regs.rdi中。

在我的代码中,我需要获得fd所指向的文件,所以我使用了以下代码。

代码语言:javascript
复制
sprintf(fdpath,"/proc/%u/fd/%llu",proc,regs.rdi);
size = readlink(fdpath, filepath, 256);  //this gives the filepath for a particular fd
filepath[size] = '\0';
printf("File-%s-\n", filepath);

第二个参数(void *buf) ptr到输入缓冲区

要读取它,您需要使用PTRACE_PEEKDATA / PTRACE_PEEKTEXT请求(ptrace()的第一个参数)来读取字节。因为ptrace()一次只读取和返回8字节,所以需要使用long变量迭代地这样做。在内存的开头应该有另一个char *,稍后将用于读取字符串。

我使用的代码如下。

代码语言:javascript
复制
char message[1000];
char* temp_char2 = message;
int j = 0;
long temp_long;

while( j < (regs.rdx/8) ) //regs.rdx stores the size of the input buffer
{
    temp_long = ptrace(PTRACE_PEEKDATA, proc, regs.rsi + (j*8) , NULL);
    memcpy(temp_char2, &temp_long, 8);
    temp_char2 += sizeof(long);
    ++j;
}
message[regs.rdx] = '\0';
printf("Message-%s-\n\n", message);

这就是我能说的。我想您可以这样读取大多数系统调用的几乎所有参数。

至于系统呼叫的名称。我对操作系统进行了映射,并制作了一个手动的switch案例来获取系统调用的名称。

希望这能有所帮助。:)

票数 12
EN

Stack Overflow用户

发布于 2021-04-25 18:00:27

我会将regs.orig_rax映射到系统调用的const列表中,您可以从/usr/include/x86_64-linux-gnu/asm/unistd_64获得该列表。

如果您想知道指向注册中心地址的是什么,我建议您读取https://groogroot.eu/the-ptrace-system-call/方法read_addr_into_buff,当检测到__NR_write SC时,我确实使用它来读取regs.rsi。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33431994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档