您的位置:首页 > 移动开发 > Android开发

Android通过链接视图和加载视图实现GOT HOOK

2016-03-25 16:42 309 查看
1. 背景

最近在研究android平台的hook技术,发现网上的资料比较凌乱,自己总结一下。

首先要非常熟悉ELF文件格式,自己动手写一个解析ELF文件的小程序基本就可以研究的比较透彻了。

ELF文件中有节和段的概念,相信很多人都不太了解它们的区别:节头表是在链接阶段非常重要的结构,提供了链接器链接符号的重要信息,属于链接视图;而段表是链接完生成可执行文件和动态库后才有的,在被加载和执行的时候需要用到的,属于加载视图。因此可执行文件和动态库肯定包含段表,可以不包含节头表,但一般都有,readelf和objdump这类工具都是通过读取节头表的信息来实现的。另外,段是按照可读、可写和可执行这类的权限把节进行归类,相同权限的分为一段,所以一个段包含一个或多个节,整个ELF文件就这么划分。

这里加一句,一般段表在ELF文件中的位置是紧接着ELF头的位置,而节头表是在ELF文件的末尾。

这里就对ELF文件介绍这么多,具体信息需要自己去查资料了。

2. 什么是GOT HOOK

要了解GOT HOOK首先要清楚什么是GOT,什么类型的函数会在GOT表中存放地址。

GOT,global offset table,顾名思义全局偏移表,程序运行的时候需要引用程序外部的全局变量或全局函数时,用GOT的表项内容作为偏移进行间接寻址,每个外部的符号在GOT表中都有对应的表项;对于程序内部的静态变量和静态函数,GOT表的首地址作为基址,用相对于基址的偏移来寻址内部静态符号,因为现在编译都使用PIC(位置无关代码),这样一来无论被加载到内存的什么位置,内部静态符号与GOT表的偏移是固定的。因此,PIC使用GOT来引用变量和函数的绝对地址,把位置无关的引用重定向到绝对地址。

从上面的解释可以看出来,只有外部的符号才会在GOT表中有对应的表项,所以GOT HOOK只能针对本模块外的函数进行HOOK。所以这也是GOT HOOK的一大缺点。

从ELF的文件格式来看,从节头表和段表都可以找到每个GOT表项对应的符号,所以下面咱们介绍一下链接视图和加载视图两种方式实现GOT HOOK。

3. 通过链接视图实现GOT HOOK

这种实现方式涉及三个模块,一个是hook模块(后面称为a),一个是被hook模块(后面称为b),一个是lib模块(后面称为c)。b模块需要调用到c模块中的某个函数func1,咱们实现a模块来hook b模块,hook成功以后b模块调用func1的时候都会被重定向到另一个函数func2(func2是a模块实现的)。

临时有事,明天再继续写。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: