android study 2
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 | jmp got[xx]#第一次调用前,linker会把got表相应的函数填为该jmp的下一条指令 |
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