【问题标题】:Hooking read syscall挂钩读取系统调用
【发布时间】:2013-10-20 15:31:02
【问题描述】:

我有一个挂钩读取系统调用的内核模块。我必须做的一件事是捕获正在执行我的老师提交的外部程序的读取系统调用的内容。

通过 strace,我可以看到老师的程序是如何读取的:

read(6, "\v\0\0\0\tExercise1", 14)

并且读取挂钩正在工作,问题是,我不知道如何从新的读取函数内部读取内容,因为如果我正确,*buf 是空的并且在调用原始系统调用 read 之前不会填充.所以,理论上我应该直接从文件描述符中读取,但不使用 read 系统调用我不知道该怎么做。

有什么想法吗?谢谢!

【问题讨论】:

  • 你能告诉我们你的钩子模块的代码吗?

标签: hook system-calls


【解决方案1】:

基本上,你的钩子函数应该是这样的:

size_t my_hooked_read(int fildes, void *buf, size_t nbytes)
{
  size_t ret;

  //Do something before original call

  ret = original_read(fildes, buf, nbytes); //call the original read !

  //Do something after original call
  //buf is correctly filled here !

  return ret;
}

如果要阅读buf的内容,请在原调用后阅读。

【讨论】:

  • 谢谢迈克尔,但挂钩功能不是问题,或多或少正是您的功能。我的问题位于://在原始调用之前做一些事情。我想要做的是读取buf ...但理论上是空的,因为读取系统调用没有完成,所以我应该读取文件描述符的内容。问题是我不知道该怎么做。
  • 在原始调用之后没有读取缓冲区有什么原因吗?
  • 这可能来自内核模块吗?理论上我应该用钩子来阅读,因为这是我们正在研究的......
  • 好的,你是对的,它必须在原始通话完成后进行。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2016-06-23
  • 1970-01-01
相关资源
最近更新 更多