如何hook一个系统调用
浏览:1607次 出处信息
背景 是这样的:某高人写的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。
建议继续学习:
- Apache2中俩种设置PHP的异同 (阅读:5992)
- SVN Hook造成SVN提交速度慢的问题 (阅读:5828)
- 解读PHP开源项目中列表和hook方法:while(has_items()): thme_ite();和apply_filters (阅读:2591)
- IOS安全—阻止tweak注入hook api (阅读:1567)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Docker基础技术:AUFS
后一篇:Docker基础技术:DeviceMapper >>
文章信息
- 作者:bbiao 来源: AgilePHP.net
- 标签: hook
- 发布时间:2016-02-10 23:17:17
建议继续学习
近3天十大热文
-
[917] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[54] 整理了一份招PHP高级工程师的面试题 -
[52] Innodb分表太多或者表分区太多,会导致内 -
[52] 海量小文件存储 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 全站换域名时利用nginx和javascri -
[50] 用 Jquery 模拟 select -
[49] CloudSMS:免费匿名的云短信 -
[48] jQuery性能优化指南
