安卓逆向基础之Hook技术

1,111 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

截屏2021-10-13 上午11.33.06.png

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);