Libco Hook 机制浅析
Libco Hook 机制浅析
之前的文章里我们提到过 Libco 有一套 Hook 机制,可以通过协程的让出(yield)原语将系统的阻塞系统调用改造为非阻塞的,这篇文章我们将深入解析 Hook 机制到底是怎么运作的
Hook 机制的核心有两点
- 提供自己的实现覆盖标准库(
libc.so)的实现 - 在自己实现的代码里要有办法能够调用标准库的实现
也就是说,我们提供的实现其实是标准库实现的 wrapper
为了搞明白 Hook 机制,我们首先要了解 Linux 动态库究竟是怎么运作的
动态库的加载和符号表
动态库是在运行时链接的,这个工作是由动态链接器来完成的(Linux 下是 /lib/ld-linux.so.2 ),主要涉及到的步骤有
- 搜索可执行文件依赖的所有动态库,并将它们加载到进程的虚拟地址空间中
- 做符号解析和重定位
- 动态库的符号会被加到全局符号表里
- 执行共享对象的初始化代码
如果可执行文件依赖的多个动态库定义了同一个符号时,以先加载的动态库为准,那么如果想要覆盖掉动态库 A 里的符号,最简单的做法就是让我们的库在动态库 A 之前加载,通常使用环境变量 LD_PRELOAD 来实现这点
LD_PRELOAD中列出的动态库会在所有其他动态库之前加载,包括libc.so- 如果我们想要提供自己的 malloc 实现,只需要在自己的动态库里实现 malloc,然后将它加入
LD_PRELOAD中,这样就会覆盖掉标准库的 malloc 实现
命令
LD_DEBUG=files ./a.out可以查看动态库的加载顺序和初始化顺序,这些顺序是实现相关的
dlsym
解决了第一个问题,那么剩下的问题就是如何在我们的实现里调用标准库实现了,直接用函数名调用肯定是不行的,那么我们能想到的办法就是能否给标准库的实现改一个名字呢?
为了实现这点,我们需要用到 dlsym 函数, 它的函数原型为
void *dlsym(void *restrict handle, const char *restrict symbol);
dlsym 的原意是用来获得动态加载进来的动态库中的接口(Linux 中的动态库不仅可以在程序启动时加载,还可以在程序运行过程中加载和卸载),其中 handle 是动态库的句柄,symbol 是要搜索的符号
此外,dlsym 还支持两个伪 handle
RTLD_DEFAULT- 按默认搜索顺序搜索第一次出现的 symbol,搜索范围包含全局符号表里的所有符号
- 程序可执行文件本身的符号
- 动态链接器加载的动态库中的符号
- 如果用 dlopen 加载动态库时,指定了
RTLD_GLOBAL选项,那么它的符号也会出现在全局符号表里
- 按默认搜索顺序搜索第一次出现的 symbol,搜索范围包含全局符号表里的所有符号
RTLD_NEXT- 从当前可执行文件或动态库开始,搜索下一次出现的 symbol
- 假设搜索顺序是 A -> B -> C -> D,在动态库 B 里调这个接口搜索 symbol1,就会依次去 C 和 D 中搜索 symbol1,返回先找到的 symbol1 地址
- 从当前可执行文件或动态库开始,搜索下一次出现的 symbol
利用 RTLD_NEXT 就可以实现我们想要的功能,假设说我们用 LD_PRELOAD 覆盖了标准库 malloc 实现,就可以通过 dlsym 拿到标准库的 malloc 地址(前提是在 libc.so 之前没有其他库定义了 malloc),给它的函数指针起一个其他的名字,就可以在我们的实现里调用标准库 malloc 了
可以看到 Libco 里就是用这种方法拿到所有标准库实现的函数指针
typedef ssize_t (*read_pfn_t)(int fildes, void *buf, size_t nbyte);
static read_pfn_t g_sys_read_func = (read_pfn_t)dlsym(RTLD_NEXT, "read");
Libco Hook 机制浅析的更多相关文章
- Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- Hook机制里登场的角色
稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 ...
- typecho流程原理和插件机制浅析(第二弹)
typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...
- typecho流程原理和插件机制浅析(第一弹)
typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...
- 黄聪:WordPress 的 Hook 机制与原理(add_action、add_filter)
稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 ...
- oracle的resetlogs机制浅析
oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?它的原理 ...
- 【repost】JS中的hook机制
hook机制也就是钩子机制,由表驱动实现,常用来处理多种特殊情况的处理.我们预定义了一些钩子,在常用的代码逻辑中去适配一些特殊的事件,这样可以让我们少些很多if else语句.举个高考加分的例子,比如 ...
- webpack模块机制浅析【一】
webpack模块机制浅析[一] 今天看了看webpack打包后的代码,所以就去分析了下代码的运行机制. 下面这段代码是webpack打包后的最基本的形式,可以说是[骨架] (function(roo ...
- 插件开发之360 DroidPlugin源码分析(二)Hook机制
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52124397 前言:新插件的开发,可以说是为插件开发者带来了福音,虽然还很多坑要填补, ...
随机推荐
- CSS3实现环形进度条?
两个对半矩形遮罩, 使用rotate以及overflow: hidden进行旋转
- Grep 命令有什么用?如何忽略大小写?如何查找不含该串的行?
是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来. grep [stringSTRING] filename grep [^string] filename
- 在 Spring 框架中如何更有效地使用 JDBC?
使用 SpringJDBC 框架,资源管理和错误处理的代价都会被减轻.所以开发者只 需写 statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供 的模板类 ...
- 使用conda管理python环境和包
操作系统:CentOS7使用virtualenv管理python虚拟环境virtualenv是一款轻量级第三方虚拟环境管理工具,不像Anaconda大小达上百M,virtualenv大小只有10M左右 ...
- 学习Squid(三)
Squid 缓存服务 1.缓存服务器结束 缓存服务器(cache server),即用来存储(介质为内存及硬盘)用户访问的网页.图片.文件等等信息的专用服务器,这种服务器不仅可以使用户可以最快的得到他 ...
- OpenCV+QT5在Window下的环境配置记录
在安装OpenCV时最需要注意的是,OpenCV库,也就是我们需要的dll和动态库需要我们使用CMake来生成. 虽然在官网上下载得到的文件中已经包含了库文件和.h等头文件,但是在具体开发中编译器编译 ...
- WzwJDBC 自定义工具类(获取连接,释放资源)
package wzwUtil;import java.io.IOException;import java.io.InputStream;import java.sql.*;import java. ...
- ctfhub密码口令
弱口令 进入环境 使用burpsuit抓包爆破 密码长度不一样应该密码就为他 即可找到 默认口令 进入环境一开始不懂百度借鉴原来是要看常见设备默认口令 很快就找到了 一个一个的试 即可获得答案
- (stm32学习总结)—spi基本原理
参考:spi详解 spi协议 SPI的基本介绍 SPI的简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是Motorola首先在其M ...
- 深入理解ES6之《用模块封装代码》
什么是模块 模块是自动运行在严格模式下并且没有办法退出运行的Javascript代码 在模块的顶部this的值是undefined 其模块不支持html风格的代码注释除非用default关键字,否则不 ...