游戏安全实验室 首页 技术入门 查看内容

 阅读目录

Android平台基于异常的Hook实现

发布于:2015-11-18 10:28   |    231874次阅读 作者: 管理员    |   原作者: TP

一、概述

无论什么平台很多理论都是贯通的,hook技术也不例外。比如windows平台上常见的hook方式有导入导出表、vehsehinline等等,那么android平台上同样也可以挖掘出类似的很多hook方式,android上的hook方式有gothook、异常的hookinline 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)、兼容性好,androidios都可使用。

2)、不需要考虑b系列指令的只能跳转32m的距离。

3)、系统完成回调,修复指令后在原地址执行,免除了bpc等等指令的重定位问题。

缺点总结如下:

1)、每执行一个hook点,执行hook两次,效率低。

2)、如果想修改寄存器值,无法实现。

 

 *转载请注明来自游戏安全实验室(https://gslab.qq.com

分享到:
踩1 赞0

收藏

上一篇:【转载】Shellcode In X64-1Find Kernel32.dll

下一篇:函数调用约定实现分析

最新评论
B Color Image Link Quote Code Smilies

发表评论