前些天在琢磨微信协程库(libco),对库里Hook Library Function相关内容比较感兴趣,自己寻找相关的资料手动实践了一遍,确实很有意思。
核心参考文档 – 点击这里
理解Hook
一般来说我们调用系统API过程是这样:
Program -> Library Function -> System Call
举个例子,如果我们遇见这样的需求:把项目中调用malloc和free的地方打印日志,用作系统调优或者其他。
会遇见2个难题:1、从libc中malloc、free实现处做修改,这样需要重新编译整个libc和项目;2、日志应该是程序级的,若实现了1,那么在该机器上其实使用libc的项目不是也被“修改”了。
所幸Hook技术一直存在,形如:
Program -> Hook -> Library Function -> System Call
这样我们可以在不修改libc源码的情况下满足需求,并且做到程序级的修改。或者比如像Libco一样,hook住socket相关的系统调用添加自己超时相关逻辑。