安卓逆向基础之Hook技术
Hook技术简介
微软MSDN对Hook技术的中文解释:Hook是Windows消息处理机制的一个平台,应用程序可以在上面设置回调例程以监视指定窗口的某种消息,而且所监控的窗口可以是其他进程创建;当消息达到后,在目标窗口函数处理前执行时机。
使用Hook的目的
在关键函数执行前,先执行预先设置的钩子函数,从而达到监控函数调用,改变函数功能的目的。
Hook分类
系统消息Hook
对系统平台自带的函数进行干预和监测(比如检测app的推送消息)
API Hook技术
安卓平台下的API Hook技术分以下三种:
基于异常的Hook
利用SIGILL异常机制实现Hook,对监测的地址设置一条非法指令,当程序执行到非法指令位置时,系统会回调预先设定好的异常处理函数,在异常处理函数中恢复监控地址的原指令,获取上下文的环境信息,然后打印寄存器等信息(主动触发异常)
基于ARM指令集的内联Hook(inlinee Hook)
Inline Hook翻译为内联钩子,它是基于二进制汇编代码替换方式而实现的Hook。(修改指令集实现)
导入表的Hook实现方式
替换需要Hook的导入函数地址,当导入函数调用时Hook函数先获得执行时机。
通常以so文件的导入函数作为目标进行函数指针替换。
安卓进程注入
Android平台可以通过Ptrace方式将共享链接库注入到应用进程中,并执行共享链接库的代码。 因为安卓的大部分应用程序的进程都是由Zygote进程创建,为了防止ptrace的反调试,可以通过ptrace方式注入Zygote进程,然后间接方式注入应用进程。(Xposed的原理)
注入Zygote进程后,在Zygote创建子进程和加载主Activity的函数中设置钩子,从而感知应用进程的创建。
枚举进程模块
读取"/proc/$pid/maps"文件可以获取应用进程中当前加载的所有模块名称,基址,权限等。 其中pid是应用进程的id。
Native层的Hook方式
导入表Hook 通过替换so文件的.Got表中指定的函数地址实现对函数的Hook,基于异常的Hook方式是修改指定位置的代码为异常指令,通过异常处理函数捕捉异常,获取执行权限和当前执行上下文环境。
Inline Hook 实现原理通过修改函数指令并跳转到Hook函数来实现的。
Xposed
不修改APK程序的情况下影响程序运行的框架,通过替换"/system/bin/app_process"程序控制Zygote进程,使app_process在启动过程中加载XposedBridge.jar,从而劫持Zygote进程及其创建的Dalvik虚拟机。
进程注入技术
ptrace的概念
ptrace注入技术是对ptrace函数的使用,ptrace函数是一个为进程提供了监视和控制其他进程的方法,在注入进程后,父进程还可以读取和修改子进程的内存空间数据以及寄存器值。
ptrace函数原型
int ptrace(int request, pid_t pid, caddr_t addr, int data);
作者:cxapython
链接:https://juejin.cn/post/7018745071356870692