Android:如何拦截本机函数调用?

时间:2017-06-20 19:51:12

标签: android android-ndk arm elf

我是计算机科学专业的学生。作为我的主人项目的一部分,我试图拦截对Android平台上本机库中的函数的调用。目标是决定是允许呼叫还是拒绝呼叫以提高安全性。

按照研究论文1的方法,我想修改ELF文件的过程链接表(PLT)和全局偏移表(GOT)。我的想法是,我想让所有函数调用都指向我自己的拦截函数,该函数决定是阻止调用还是将其传递给原始目标函数。

ELF规范2表示(在第三册,第2章程序加载和动态链接,第2-13页,章节“全局偏移表”和“程序链接表”)中的实际内容和形式PLT和GOT取决于处理器。但是,在文档“ARM架构的ELF”3中,我无法看到这些表中任何一个的确切规范。我现在专注于ARM而不考虑其他架构。

我有3个问题:

  • 如何将符号映射到GOT或PLT条目?
  • 我在哪里可以找到ARM处理器的GOT和PLT的精确规格?
  • 由于PLT包含机器代码;我是否必须解析该代码才能修改目标地址,或者所有PLT条目看起来都相同,以便我可以在每个PLT条目的常量偏移处修改内存?

谢谢, 曼努埃尔

1 个答案:

答案 0 :(得分:0)

  1. 您需要解析ELF标头并通过SHT_DYNSYM中的字符串名称查找符号索引。然后迭代GOT(将被称为“.rela.plt”)并找到具有匹配索引的条目。
  2. 我不知道正式的规范,但你总是可以研究android链接器源并反汇编一些二进制文件以注意模式
  3. 通常PLT只是常用代码,您无需修改​​它。它实际上是这样设计的,因为如果链接器必须修改它,你最终会得到RWX内存,这是不可取的。所以你只需要重写GOT中的条目。默认情况下,GOT条目指向将找到所需函数的解析程序例程并将条目写入GOT。这是在Linux上。在Android上,地址已经解决。
  4. 我为x86_64 Linux做了一些事情 https://github.com/astarasikov/sxge/blob/vaapi_recorder/apps/src/sxge/apps/demo1_cube/hook-elf.c

    还有一个关于在Android上做你想做的事情的博客 https://www.google.de/amp/shunix.com/android-got-hook/amp/