当前位置: 首页 > 面试题库 >

使用ptrace进行系统调用跟踪

庾和昶
2023-03-14
问题内容

我编写了一个程序来列出命令执行的所有系统调用(例如/ bin / ls)。现在我想做的就是找到所有可能传递给它的系统调用参数,环境变量,命令行参数

示例:如果我打开一个文件。系统调用sys_access会打开文件吗?但是如何获得这些价值?
想要对系统调用(例如打开,读取,写入,关闭)执行此操作。

根据我的研究,这些必须在寄存器(ebx-
edx)中。如果是,则这些寄存器值表示什么?我知道了这个链接。
但是我真的不能从那里得到很多。同样,对此的任何进一步参考也将很有帮助。


问题答案:

(以上评论的修订形式(以便您可以接受)):

可以在Linux内核头文件syscalls.h中查找详细的syscall参数。在上述情况下,由于sys_access(x86上的#33)只有两个参数:

  • 首先是指向文件名的指针,所以您的文件名存储在地址0x4c4d8e
  • 第二个参数是文件模式(请参阅模式标志定义)
  • 由于此系统调用没有第三个参数,因此edx不相关,并且包含一些未定义的值

此系统调用的返回值为-2(ENOENT,在errno-base.h中定义),表示错误(没有此类文件或目录)。

另请注意(请参阅上面的Basile注释),您正在复制strace实用程序的功能。



 类似资料:
  • 当想知道一个进程在做什么事情的时候,可以通过strace命令跟踪一个进程的所有系统调用。 1、运行 php start.php status 能看到workerman相关进程的信息 如下: Hello admin ---------------------------------------GLOBAL STATUS-----------------------------------------

  • strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 6.1. 输出参数含义 每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是

  • Capistrano 与 Git GitHub Guide on Deploying with Cap Git and Capistrano Screencast

  • 本章描述 Linux 内核中的系统调用概念。 系统调用概念简介 - 介绍 Linux 内核中的系统调用概念 Linux 内核如何处理系统调用 - 介绍 Linux 内核如何处理来自于用户空间应用的系统调用。 vsyscall and vDSO - 介绍 vsyscall 和 vDSO 概念。 Linux 内核如何运行程序 - 介绍一个程序的启动过程。 open 系统调用的实现 - 介绍 open

  • 系统调用sendfile Sendfile是Linux实现的系统调用,可以通过避免文件在内核态和用户态的拷贝来优化文件传输的效率。 其中大名鼎鼎的分布式消息队列服务Kafka就使用sendfile来优化效率,具体用法可参见其官方文档。 优化策略 在普通进程中,要从磁盘拷贝数据到网络,其实是需要通过系统调用,进程也会反复在用户态和内核态切换,频繁的数据传输在此有效率问题。因此我们必须意识到Linux

  • 系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相