如何hook一个系统调用

背景 是这样的:某高人写的library里判断了新sock出来的socket的文件句柄要>0,且不谈这个assertion是否,我们的系统在运行到某个时间后,会不满足这个断言,说明有人把stdin给关了。

仔细想了一下,没有什么地方是需要把stdin关闭掉的,只能说明程序里有bug,比如某个fd被错误的赋予了0这个初始值,在没有初始化的情况下被关闭了。这是个bug。首先想到的办法是在所有调用close的地方都加上日志,这个工作量巨大,而且很容易出现遗露。其实在Linux里可以通过插入so的方式,hook某些动态连接库里的函数。只要用户没有选择静态编译,就会调用我们替换的版本。经过一翻Google,主要参考了 这篇 文章。最后成品的代码如下:

my_close.c

使用这个方法编译:

然后在运行程序前定义LD_PRELOAD,方法为

或者

如上代码在调用close时,如果fd等于0,会coredump。

2014年7月21日 | 归档于 Linux, 工作
标签: , , , ,
  1. zaykl
    2014年7月22日 13:17 | #1

    应该是export LD_PRELOAD=$PWD/my_close.so, 文件后缀错了

    • bbiao
      2014年7月22日 14:50 | #2

      嗯,笔误了。已修正。
      看样子还是得解决下tmux与iterm2的冲突,选中的行不能自动拷贝,这些命令是写文章的时候手工打的。从iterm2里直接复制的话就没有问题了。

  2. bbiao
    2014年7月22日 15:09 | #3

    iTerm里,只要按住Option键,再用鼠标选择文本就可以了。

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">