IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

如何hook一个系统调用

AgilePHP.net 2016-02-10 23:17:17 累计浏览 1,940 次
本机暂存

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

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

   my_close.c

#define _GNU_SOURCE
#include <dlfcn.h>
#include <assert.h>

typedef int (*orig_close_f_type)(int fd);

int close(int fd)
{
    /* Some evil injected code goes here. */
    assert(fd > 0);
    orig_close_f_type orig_close;
    orig_close = (orig_close_f_type)dlsym(RTLD_NEXT, "close");
    return orig_close(fd);
}

   使用这个方法编译:

gcc -g -shared -fPIC my_close.c -o my_close.so -ldl

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

export LD_PRELOAD=$PWD/my_close.so
./run_your_app

   或者

LD_PRELOAD=$PWD/my_close.so ./run_your_app

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

同分类推荐文章

  1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
  2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
  3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

查看更多 安全 文章 →

建议继续学习

  1. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 10,844)
  2. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 8,840)
  3. 浅析linux kernel network之socket创建 (累计阅读 6,740)
  4. python中的socket代理 (累计阅读 6,344)
  5. netstat和web主机socket文件分析 (累计阅读 5,539)
  6. php socket为什么这么慢,直到超时 (累计阅读 5,028)
  7. 为flash建立socket安全策略文件服务器 (累计阅读 4,786)
  8. node.js调研与服务性能测试 (累计阅读 4,559)
  9. TCP网络协议以及其思想的应用 (累计阅读 4,183)
  10. 手机应用/服务器开发的一些总结(二) (累计阅读 4,022)