android study 2

Author Avatar
Xzhah 5月 13, 2022
  • 在其它设备中阅读本文章

Android native hook原理

1. android got hook

1.1 GOT AND PLT

​ 和windows的IAT HOOK一样,当程序调用外部函数时,需要先跳转到PLT(Procedure Link Table 程序链接表,位于代码段),再跳转到GOT(Global Offset Table 全局偏移表,位于数据段),执行目标函数。

​ 既然GOT表中已经有了外部函数的真实地址,为什么还需要PLT表呢?因为存在延迟绑定(Lazy Binding):当外部函数被调用时,才进行地址解析和重定位。所以PLT表是服务于延迟绑定而存在的。

​ PLT表内容如下:

1
2
3
jmp got[xx]#第一次调用前,linker会把got表相应的函数填为该jmp的下一条指令
pushq $0x? #可以认为是函数标志,告诉_dl_runtime_resolve函数要填哪个函数的got表地址
jmp _dl_runtime_resolve #让Linker填写GOT表地址

1.2 如何完成got hook?

​ 在已经完成注入的情况下,要完成got hook可以拆分为以下四个步骤。感觉和ctf 的一些简单pwn题差异不大,pwn需要泄露基地址,泄露libc的加载地址。只不过呢,pwn菜单题里面拿got表地址是直接拖到IDA里面去拿,而且要找漏洞利用点去覆写got表。got hook因为是已经完成注入,所以可以直接写,只需要解析elf文件自动拿到got偏移和so加载地址就好了。

​ 1.找到GOT表在ELF文件中的偏移

​ 2.找到GOT表所在模块加载的基址

​ 3.定位到想要hook的函数

​ 4.将自定义函数的地址进行覆盖

2.inline hook

​ inline hook就是把目标函数的前几条指令改为jmp 指令,jmp到一块shellcode的地方,然后在shellcode的地方调用自己已经注册的自定义函数,然后再执行之前被覆盖的指令,最后跳回目标函数位置。

3.Exception hook

3.1 Exception hook原理

​ Exception hook的缺点是执行效率较低,原理是每次在目标指令处制造一个不合法指令,这样进程执行到目标指令处会收到信号SIGILL(illegal instruction),从而进入到我们可以注册的Signal handler中,在异常处理函数中首先执行自定义逻辑,然后把原目标指令恢复,把下一条目标指令改为非法指令即可。

3.2 如何注册signal handler

​ 使用sigaction函数,详情见https://www.man7.org/linux/man-pages/man2/sigaction.2.html。这个函数是用来在接收到异常信号后进行处理的,第二个结构体参数里面可以放入用户自定义的处理函数。

References

https://www.cnblogs.com/mmmmar/p/8227915.html