漫漫学习路之Hook总结

  • A+
所属分类:移动安全

前言

    本篇文章是之前我在学习Android Hook技术时的学习总结。闲来无事,回头看到笔记时已发现蜘蛛网已经封存了我的秘籍,辛亏打开一看,My Study总结还完好。

    看了下就是觉得目前的认知已经比以前提高很多了,相信大家也深有体会,要是明年的你看今年的你,并不觉得自己愚蠢,那说明你很可能在这一年里没有进步。所幸,5年后的我才发现自己的愚蠢,WTM?咋就蠢了5年?

 漫漫学习路之Hook总结

    5年了,看着身边的朋友一个个脱单,作为母胎单身的我还在向人类心理渗透,最后得出Hook总结,若有问题,请大哥们嘴下留情,看在母胎单身的我的份上,您看着亲。



Hook是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息进行处理。说白了就是消息拦截机制,可以拦截单个进程的消息(线程钩子),也可以拦截所有进程的消息(系统钩子)。

举个例子:鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。最常见的就是鼠标和键盘钩子,用Hook钩子钩住鼠标、键盘,当你的鼠标、键盘有任何操作时,通过Hook就能知道他们都做了什么了,不管你干什么,都逃不过我钩子Hook的手掌心。(引用了别人的例子,当时我一看了这个例子后就知道Hook是干嘛的,很形象。)

Hook机制是回调机制的一种,普通的回调是静态的,我们必须提前写好回调接口;然而Hook机制在Java中则可以利用反射,针对切入点(通常是一个成员变量),采用替换的手段,使代码在运行时改变。说白了就是偷梁换柱

先找到适合Hook点,然后创建继承自Hook点的对象的子类,根据需求修改其相应的方法,再使用反射将我们自己创建的对象替换到对象实例中的对象。

例如:原本该回调的函数是A函数,但是现在我自己创建一个B函数,使其回调时用的是B函数(对象)。

要实现捕获全局消息功能的钩子,是否要写在单独的DLL里面,取决于钩子的类型以及相应的作用域。也就是如果钩子本身的作用域是全局的,那无论是放在线程还是DLL中,它都可以捕获全局消息;


以上的总结是对Hook机制的理解总结,我会按以下几个方向继续描述

1. Hook工作原理

当您创建一个钩子时,Windows会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个线程钩子,您进程中的钩子函数将被调用;

如果是一个系统钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中。

当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。

原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。

所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。

几点需要说明的地方: 

1) 如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。 

2) 对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 

3) 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。

2. Hook的作用

Hook攻击的目的有很多,作用很广,这取决于你的目的是什么,比如你想在APP插入一段广告,那么你只需要将第三方代码注入到进程当中即可。

3. Hook攻击的本质

在一个目标进程中通过改变函数方法的指向地址,加入一段自定义的代码块。

4. 如何检测APP被Hook

A. 查找设备安装目录中是否存在Hook工具

B. 查找设备存储中是否存在Hook安装文件

C. 查找程序运行的栈中是否存在Hook相关类

D. 综合判断(true为Hook)

Public static boolean isHook(Context context) {

if(findHookAppName(context) || findHookAppFile() || findHookStack()) {

    Return true;

}

    Return false;

}

http://itindex.net/detail/58019-android-hook-技术

5. Hook攻击的前提条件

成功将第三方代码注入到目标应用程序,具有写入内存页面的权限。

6. 如何找适合Hook点

这里引用别人的一篇文章,

https://blog.csdn.net/sparkleyn/article/details/82112212

7. 怎么用Hook攻击

首先我们要使用Hook框架,最出名的莫过于Xposed框架和Frida框架。

使用Xposed进行Hook步骤:

    A. AndroidManifest.xml文件中配置插件名称与API版本号

    B. 新创建一个入口类继承并实现IXposedHookLoadPackage接口

    C. 声明主入口路径

    D. 使用findAndLoadHookMethod方法Hook劫持登录信息

    E. XposedInstaller中启动自定义的模块

    F. 重启验证

大家可以看看这篇文章

https://zhuanlan.zhihu.com/p/25604142

8. 如何防止Hook攻击

A. 拦截VirtualProtect并检查该函数

B. 实时监测动态库

C. Xposed Installer检测:Java层检测和Native层检测

 


参考文章:

https://www.cnblogs.com/miaohj/p/5945244.html

https://blog.csdn.net/weixin_33835103/article/details/87983521

https://zhuanlan.zhihu.com/p/25604142

https://www.52pojie.cn/thread-873013-1-1.html?tdsourcetag=s_pctim_aiomsg

    好了,先暂时写到这里啦,有个妞终于回复我了,她约我出来吃饭,我说我要打游戏。

看来即使月老下凡,也阻挡不了我把钢筋掰断。

                                                            喜欢请随手点个在看哦~漫漫学习路之Hook总结

本文始发于微信公众号(渗透云笔记):漫漫学习路之Hook总结

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: