阅读目录
Android平台基于异常的Hook实现
发布于:2015-11-18 10:28 | 236118次阅读 作者: 管理员 | 原作者: TP
一、概述 无论什么平台很多理论都是贯通的,hook技术也不例外。比如windows平台上常见的hook方式有导入导出表、vehseh、inline等等,那么android平台上同样也可以挖掘出类似的很多hook方式,android上的hook方式有got表hook、异常的hook、inline hook,本文介绍基于异常的Hook实现原理并总结方法的优劣势。 二、基于异常的Hook实现 基于异常的hook,顾名思义就是在需要的hook的地方想办法触发异常,并捕获异常,采用的方法是signal+非法指令的方式。 首先了解下信号机制。信号机制是c标准中的信号处理部分,定义了程序执行时如何处理不同的信号。信号种类总共有的40多种,可以从signal.h中获取所有定义,如常见信号有: SIGABRT:由调用abort函数产生,进程非正常退出。 SIGILL:非法指令异常。 SIGKILL:非法处理和忽略。中止某个进程。 基于异常的hook方式就是灵活运用了signal+SIGILL机制,总体思路是在需要hook出填入非法指令,运行到的非法指令时出发SIGILL信号,被已经设置好的信号处理函数捕获到,获取所需求的信息。此方法流程如图2所示: 图1 基于异常的hook方法 hook具体步骤如下: 1)、通过sigaction注册SIGILL信号处理函数。 2)、向目标地址写入非法指令。 如此两步即完成了hook的操作,接下来就要看看SIGILL信号处理函数里面是何如实现,完成处理的。函数原型如下: typedef void (*ExceptionHandlerPointer)(int sig, siginfo_t *info, void *context); 其中context中保存了各个寄存器信息,可以从的此结构中获取你想获取的信息。此函数主要做的事情如下: 1)、根据pc寄存器值判断是否hook地址,如果是则执行的hook handler函数去做你想做的事情,然后向下一条指令处(记得要区别arm thumb)写入非法指令。如此利用第二条指令作为跳板,很好的处理了hook时机点问题。 2)、如果否,则说明是hook地址的下一条指令,直接向的上一条指令处(及hook地址处)写如非法指令。 3)、还原当前触发异常处指令为正确指令,返回即可。 如此一来便完成了基于异常的hook,巧妙的利用了signal+SIGILL,当然利用信号机制还可以实现线程暂停、内存断点等等等功能,此处不一一说明。 三、总结 基于异常方式的Hook实现较为隐蔽,同时与操作系统的软件异常处理方式密切相关,该类hook方式的优劣较为明显。 优点总结如下: 1)、兼容性好,android、ios都可使用。 2)、不需要考虑b系列指令的只能跳转32m的距离。 3)、系统完成回调,修复指令后在原地址执行,免除了b、pc等等指令的重定位问题。 缺点总结如下: 1)、每执行一个hook点,执行hook两次,效率低。 2)、如果想修改寄存器值,无法实现。
|
最新评论
发表评论