游戏安全实验室 首页 技术入门 查看内容

 阅读目录

Android平台导入表Hook方式实现

发布于:2016-5-4 17:46   |    224678次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

本文会介绍Android平台下导入表Hook的实现过程,导入表.Got表)的Hook实现有很多种方法本文选取其中的一种思路用代码的方式实现过程。

1.1 实现原理

由于前面介绍过相关的原理,这里只会简单介绍下本次实现的原理 

首先我们锁定目标so及其导入的函数本次TargetLibryary中gettimeofday为了实验需求,笔者特地让TargetLibryary的foo()函数调用了一次gettimeofday函数

这之后,会打开so文件解析elf格式,找出静态.got表的位置并在内存中找到相应.got表位置,这个时候内存.got表保存着导入的函数的地址,那么读取gettimeofday地址,匹配.got表每一项函数入口地址是否相符,找到的话就直接替换新的函数地址,这样就完成了一次导入表的Hook操作了。

这里有几个关键点说明一下

(1) so文件的绝对路径和加载到内存中的基址可以通过 /proc/[pid]/maps 获取到的。

(2) 修改导入表的函数地址的时候需要修改的权限,增加写权限即可。

(3) 一般导入表Hook是基于注入操作的,把自己的代码注入到目标程序,本次实例重点讲述Hook的实现,采用自加载目标so的方式代替注入,执行目录是:/data/local/tmp/main/

大概的流程掌握后,下面给出一个流程图,通过流程图,读者会直观了解到整个程序的运行机理,后面编写程序做准备。

1.2 实现流程

图1-1 导入表Hook流程图

1.3 实现代码

下面将结合实现代码讲解导入表Hook实现过程。导入表Hook的入口函数,即DoGotHook函数,这个函数的关键在于通过GetGotStartAddrAndSize函数获得导入表的首地址大小,然后获取模块基址计算内存中导入表对应的位置,遍历导入表,判断是否和传入的symbol地址相等,相等即替换不相等即继续找,直到且找不到为止。

GetGotStartAddrAndSize会先调用GetElf32StringTabBaseFromfile获取.shstrtab节的offset和size这个节保存这每个节的名字,如.got,.init_array,.bss等等。然后函数会根据Elf32_ElfHeader信息遍历每一个SectionHeader,同时判断是否Elf32_SectionHeader.sh_name”.got”相等,相等即保存其sh_addrsh_size,并返回这两个值。

 

GetElf32StringTabBaseFromfile是实现通过Elf中的e_shoffe_shstrndxe_shentsize信息找到so文件中SectionHeader里面的.shstrtab节的位置,再把这个位置返回即可

1.4 小结 

本文介绍导入表Hook的原理,并通过流程图代码直观地描述和说明导入表Hook执行过程。


*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩1 赞0

收藏

上一篇:Android平台inline hook实现

下一篇:开发篇——第一道习题

相关阅读
最新评论
引用 DeathMemory 2017-3-31 12:36
感谢大大们无私的贡献和精美的代码,在调试中发现一点Bug

GetGotStartAddrAndSize 函数中

fseek(fp, Elf32_ElfHeader.e_shoff, SEEK_SET);

应该在

pStringTableStartOff = GetElf32StringTabBaseFromfile(fp);

重新重置 fd ,下面的 for 才能正确读出结果。

查看全部评论(1)

B Color Image Link Quote Code Smilies

发表评论