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模块实现的)。
临时有事,明天再继续写。。
最近在研究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模块实现的)。
临时有事,明天再继续写。。
相关文章推荐
- Android Apk加固(安全专项)
- android studio可恶的so文件
- Android安全攻防战,反编译与混淆技术完全解析(上)
- android剪切成圆形图片CircleBitmap
- Android Cache 解析
- Android 软件盘始终无法隐藏解决办法
- Android自定义Dialog带Dialog的显示消失动画(一)
- Android设计模式之责任链模式
- android graphic(14)—EGL和OpenGL ES之间的关系
- Android集成百度地图SDK
- 下载Android源码
- Android 特色开发,使用传感器
- 每天读文档
- Androidstudio下打包apk提示Error: Expected resource of type id [ResourceType]解决办法
- android 点击事件分发总结
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android Service 的介绍与基本使用
- 加速Android Studio/Gradle构建
- 5. Android Framework - RemoteViews
- Android--智能机器人聊天