众所周知Android的动态链接器是linker,iOS是dyld,linux是ld-linux.so.2。由于同是linux内核,所以Android的linker与linux很相似,最大的区别就是linker不支持懒绑定,懒绑定的相关知识请参考我的另一篇博客linux plt 的实现。所以当Android的so或可执行文件在调用外部定义的函数之前linker已经把函数的偏移写到got表中,我们看一下如何通过ELF文件的结构获取到got表的偏移。

首先我要获取.dynsym .dynstr .rel.plt三个节的数据

.rel.plt和dynsym的定义如下:

typedef struct{Elf32_Addr  r_offset;Elf32_Word  r_info;} Elf32_Rel;typedef structelf32_sym{     Elf32_Word    st_name;     Elf32_Addr    st_value;     Elf32_Word    st_size;     unsignedcharst_info;     unsignedcharst_other;     Elf32_Half     st_shndx;} Elf32_Sym;

获取.rel.plt每个重定位表所对应的符号的步骤:
1、使用ELF32_R_SYM宏(参数为.rel.plt的r_info)获取符号在.dynsym中的偏移
2、找到对应的dynsym在获取.dynsym的st_name字段,但这个字段不是字符串,也是一个偏移,是.dynstr节的偏移
3、通过偏移可以获取到相应的符号

以下代码来自于网络,是寻找got符号的程序实现:

for (i = 0; i < relplt_shdr->sh_size / sizeof(Elf32_Rel); i++){     uint16_t ndx = ELF32_R_SYM(rel_ent->r_info);     LOGD("ndx = %d, str = %s", ndx, dynstr + dynsymtab[ndx].st_name);    if (strcmp(dynstr + dynsymtab[ndx].st_name, symbol_name) == 0) {       LOGD("符号%s在got表的偏移地址为: 0x%x", symbol_name, rel_ent->r_offset);       offset = rel_ent->r_offset;       break;    }     if(read(fd, rel_ent, sizeof(Elf32_Rel)) != sizeof(Elf32_Rel)) {    LOGD("获取符号%s的重定位信息失败", symbol_name); return -1; }}

如果是一个静态绑定的符号获取方式就是获取.dynsym结构体st_value字段的值

for(i = 0; i < (dynsym_shdr->sh_size) / sizeof(Elf32_Sym); ++i) {     if(strcmp(dynstr + dynsymtab[i].st_name, symbol_name) == 0) {         LOGD("符号%s的地址位: 0x%x", symbol_name, dynsymtab[i].st_value);         offset = dynsymtab[i].st_value;         break;     } }

以上代码出自Android GOT表HOOK技术

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
  3. android 获取唯一标识
  4. android拍照与读取相册
  5. Android(安卓)热点开关状态的判断和获取热点ssid
  6. Android软键盘适配问题
  7. AIR Native Extension的使用(Android)一 : 打包ane
  8. android之BitMap
  9. Android中GPS定位的简单应用

随机推荐

  1. 学习笔记:Android(安卓)SQLite,并实现SQLit
  2. Android(安卓)6.0 (marshmallow)中新的新技
  3. 深入解析_Android的自定义布局
  4. Android中经常用到的方法--SDcard下文件
  5. Android上安装并运行 Ubuntu 12.04
  6. Android的消息机制
  7. 关于 Android(安卓)程序使用 Support Lib
  8. Ionic3 安卓签名
  9. Android(安卓)文件系统移植总结
  10. android在线更新的SDK的脚本,