【问题标题】:system call tracing using ptrace使用 ptrace 进行系统调用跟踪
【发布时间】:2012-04-03 21:21:33
【问题描述】:

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

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

根据我的研究,这些必须在寄存器中 (ebx - edx) 如果是这样,这些寄存器值意味着什么? 我得到了这个link
但我真的无法从那里得到什么。此外,对此的任何进一步参考都会很有帮助。

【问题讨论】:

  • @dbrank0:非常感谢。确实有帮助。但我还有一个问题。我之前程序的输出是这样的 codeSYSCALL 33: ebx :004c48de ecx: 00000000 edx: 004c8ff4 /access RETURN 33: fffffffe 这里的值是十六进制的。那么我该如何理解呢?我是一个菜鸟程序员。对不起我的无知
  • 文件名存储在 0x4c48de,模式为 0(参见模式标志定义),edx 不相关并包含未定义的内容,返回值为 -2(它抱怨只读文件系统)。
  • @dbrank0 应该添加一个答案,因为他帮助您解决了问题。
  • strace 正在做你想做的事。你可以使用它,或者研究它的源代码。

标签: c linux system-calls ptrace


【解决方案1】:

(上面cmets的修改形式(所以你可以接受)):

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

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

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

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

【讨论】:

  • 再次感谢。我试图在 ptrace 中做到这一点,以便我可以学习它。 Bt ptrace 在 C 中使用不是更友好吗?我的意思是 peekuser、getregs 和一切都很有趣。 :D
  • 如果您的日程安排允许玩它,这很有趣。 :)
猜你喜欢
  • 2019-09-25
  • 2012-04-03
  • 2017-01-04
  • 1970-01-01
  • 2012-06-20
  • 2012-08-14
  • 1970-01-01
  • 2011-07-16
  • 2011-07-26
相关资源
最近更新 更多