前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫漫学习路之Hook总结

漫漫学习路之Hook总结

作者头像
天钧
发布2020-01-13 16:31:04
1.4K0
发布2020-01-13 16:31:04
举报
文章被收录于专栏:渗透云笔记

前言

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

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

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

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

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

喜欢请随手点个在看哦~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透云笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档