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

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模块实现的)。



临时有事,明天再继续写。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值