HOOK简单理解
简介
在英文中,hook翻译出来是钩的意思,而在IT行业,这是一个术语。
作用就是去调用或者篡改APP代码。
具体目的实现
在关键函数执行前,先执行预先设置的钩子函数,从而达到监控函数调用,改变函数功能的目的
原理
有学过PE文件的朋友可能都会这样一个感染文件的方法:
1、 新建一个区段。
2、 把代码放入这个区段里。
3、 在原始代码入口前,增加一条指令,jmp到这个区段中。
4、 执行完整个区段之后,在区段的末尾,jmp回到原始代码的入口。
这样就完成了一个程序的Hook,我们可以直接在程序入口添加一个Hook,弹出信息框,选确定方可进入程序,选否则退出程序。
其实这也就是一个hook,不过这样的Hook并不实用。因为我们并不是想控制程序的运行与否,而是控制程序执行过程而达到我们的一些目的。
分类
1.系统消息HOOK
对系统平台自带的函数进行干预和监测(比如检测app的推送消息)
2.API HOOK技术(拦截方面的重点)
安卓平台下的API Hook技术分以下三种:
基于异常的Hook
利用SIGILL异常机制实现Hook,对监测的地址设置一条非法指令,当程序执行到非法指令位置时,系统会回调预先设定好的异常处理函数,在异常处理函数中恢复监控地址的原指令,获取上下文的环境信息,然后打印寄存器等信息(主动触发异常)
基于ARM指令集的内联Hook(inlinee Hook)
Inline Hook翻译为内联钩子,它是基于二进制汇编代码替换方式而实现的Hook。(修改指令集实现)
导入表的Hook实现方式
替换需要Hook的导入函数地址,当导入函数调用时Hook函数先获得执行时机。
通常以so文件的导入函数作为目标进行函数指针替换。
划分不同
1.根据Android开发模式,Native模式(C/C++)和Java模式(Java)区分,在Android平台上
Java层级的Hook;
Native层级的Hook;
2.根Hook对象与Hook后处理事件方式不同,Hook还分为:
消息Hook;
API Hook;
3.针对Hook的不同进程上来说,还可以分为:
全局Hook;
单个进程Hook;
安卓进程注入(略)
枚举进程模块(略)
Native层的Hook方式(略)
常用框架
sub框架:该框架作用于so层
xpsoed框架:作用于java层
frida框架:作用于java层与so层
常见API函数
远程Hook
1、OpenProcess 打开一个进程,返回进程句柄
2、WriteProcessMemory 在一个进程中写入数据
3、CloseHandle 关闭一个内核对象
4、ReadProcessMemory 读取进程数据
5、VirtualAllocEx 在目标进程中申请一段内存空间(存放Hook代码)
6、VirtualFreeEx 在目标进程中释放申请的内存空间
因为是要动态修改程序代码,所以这节课的原程序有所改变,是一个静态编译的Windows窗口程序。
APIHOOK
对本程序中的函数调用进行Hook
GetModuleHandle 获取库句柄
lpModuleName 库名称,如 kernel32.dll
GetProcAddress 获取库函数地址
hModule 库句柄
lpProcName 库函数名称
VirtualProtect 修改虚拟保护
lpAddress 修改的虚拟保护区域首地址
dwSize 修改的虚拟保护长度
flNewProtect 新的虚拟保护
lpflOldProtect 保存旧的虚拟保护
我们要知道,程序的任何地方都可以调用API函数,所以我们不能Hook程序的某个地方,我们要Hook API函数的某个地方。一般情况下,我们都选择Hook API首地址的前5个字节。
大概手法
修改返回代码->手写一段汇编,保存寄存器等->跳转到Hook子程序区->进行处理->返回到保存的API的返回代码(ret xxxx)进行返回。
Hook工作流程
1.Android相关内核函数:
ptrace函数:跟踪一个目标进程,结束跟踪一个目标进程,获取内存字节,像内存写入地址;
dlopen函数:以指定模式打开指定的动态链接库文件;
mmap函数:分配一段临时的内存来完成代码的存放;
2.向目标进程注入代码总结后的步骤分为以下几步:
用ptrace函数attch上目标进程;
发现装载共享库so函数;
装载指定的.so;
让目标进程的执行流程跳转到注入的代码执行;
使用ptrace函数的detach释放目标集成;