0x0 前言
在Windows平台,各种Hook技术已经被玩的天花乱坠.软件为了优先获得系统的控制权,都使用了各种Hook技术.常见的SSDT Hook/Inline Hook/IRP Hook/IDT Hook/IAT Hook等等,而Linux平台由于架构不同,Hook实现起来比较困难,但是经过研究,也出现了一些可行的Hook方案.
0x1 LD_PRELOAD原理
和Windows一样,Linux平台的程序也分为静态链接和动态链接两种.静态链接是把所有函数都打包编译到程序当中,而动态链接没有把函数编译到可执行文件当中去,而是在程序运行时动态的载入动态库.程序需要调用的时候,会查找动态链接库的位置,以便从动态库中查找函数的地址给程序使用.系统提供动态链接库可以使多个程序公用相同的代码,节省了磁盘空间,更节省了程序员的效率.同时可以不再修正程序的情况下,升级动态库里的函数就可以完成升级.然而如果动态库不是开发人员所写,而是别人所写的代码,那么程序的流程有可能会被修改.或者说如果我们想要调用别人的动态库,也可以使用这样的方法完成Hook.LD_PRELOAD的利用就这样应运而生,它可以直接影响程序运行时的动态链接.只要通过它抢先加载想要加载的动态链接库,程序在运行时就会优先加载这个动态链接库,从而覆盖正常的动态链接库.那么在Android系统下也是如此吗?下面看看代码分析.
0x2 代码分析
摘自AOSP\bionic\linker\linker.cpp (节选了关键代码)
//初始化环境变量
linker_env_init(args);
//如果执行了setuid()函数,则LD_PRELOAD无效
if (get_AT_SECURE())
{
nullify_closed_stdio();
}
debuggerd_init();
const char* LD_DE