加拿大快乐8最快开奖
当前位置:首页 > 开发教程 > 手机开发 >

Android Hook 机制之简单实战

时间:2019-09-12 13:53 来源: 作者:迷你奇 浏览: 收藏 挑错 推荐 打印

什么是 Hook Hook 又叫钩子,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。 Hook 分类 1.根据Android开发模式,Native模式(C/C

什么是 Hook

Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。

Hook 分类

1.根据Android开发模式,Native模式(C/C++)和Java模式(Java)区分,在Android平台上

Java层级的Hook;

Native层级的Hook;

2.根 Hook 对象与 Hook 后处理事件方式不同,Hook还分为:

消息Hook;

API Hook;

3.针对Hook的不同进程上来说,还可以分为:

全局Hook;

单个进程Hook;

常见 Hook 框架

在Android开发中,有以下常见的一些Hook框架:

1.Xposed

通过替换 /system/bin/app_process 程序控制 Zygote 进程,使得 app_process 在启动过程中会加载 XposedBridge.jar 这个 Jar 包,从而完成对 Zygote 进程及其创建的 Dalvik 虚拟机的劫持。

Xposed 在开机的时候完成对所有的 Hook Function 的劫持,在原 Function 执行的前后加上自定义代码。

2.Cydia Substrate

Cydia Substrate 框架为苹果用户提供了越狱相关的服务框架,当然也推出了 Android 版 。Cydia Substrate 是一个代码修改平台,它可以修改任何进程的代码。不管是用 Java 还是 C/C++(native代码)编写的,而 Xposed 只支持 Hook app_process 中的 Java 函数。

3.Legend

Legend 是 Android 免 Root 环境下的一个 Apk Hook 框架,该框架代码设计简洁,通用性高,适合逆向工程时一些 Hook 场景。大部分的功能都放到了 Java 层,这样的兼容性就非常好。

原理是这样的,直接构造出新旧方法对应的虚拟机数据结构,然后替换信息写到内存中即可。

 

Hook 必须掌握的知识

反射

如果你对反射还不是很熟悉的话,建议你先复习一下 java 反射的相关知识。?#34892;?#36259;的,可以看一下我的这一篇博客 Java 反射机制详解

java 的动态代理

动态代理是指在运行时动态生成代理类,不需要我们像静态代理那个去手动写一个个的代理类。在 java 中,我们可以使用 InvocationHandler 实现动态代理.

Hook 使用实例

Hook 选择的关键点

  • Hook 的选择点:尽量静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。
  • Hook 过程:
  • 寻找 Hook 点,原则是尽量静态变量或者单例对象,尽量 Hook public 的对象和方法。
  • 选择合?#23454;?#20195;理方式,如果是接口可以用动态代理。
  • 偷梁换柱——?#20040;?#29702;对象替换原?#32423;?#35937;。
  • Android 的 API 版本比较多,方法和类可能不一样,所以要做好 API 的兼容工作。

简单案例一: 使用 Hook 修改 View.OnClickListener 事件

首先,我们先分析 View.setOnClickListener 源码,?#39029;?#21512;?#23454;?Hook 点。可以看到 OnClickListener 对象被保存在了一个叫做 ListenerInfo 的内部类里,其中 mListenerInfo 是 View 的成员变量。ListeneInfo 里面保存了 View 的各种监听事件。因此,我们可以想办法 hook ListenerInfo 的 mOnClickListener 。

Android Hook 机制之简单实战

 

接下来,让我们一起来看一下怎样 Hook View.OnClickListener 事件?

大概分为三步:

第一步:获取 ListenerInfo 对象

从 View 的源代码,我们可以知道我们可以通过 getListenerInfo 方法获取,于是,我们利用反射得到 ListenerInfo 对象

第二步:获取原始的 OnClickListener事件方法

从上面的分析,我们知道 OnClickListener 事件被保存在 ListenerInfo 里面,同理我们利用反射获取

第三步?#21644;?#26753;换柱,用 Hook代理类 替换原始的 OnClickListener

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

执行以下代码,将会看到当我们点击该按钮的时候,会弹出 toast “Hook Click Listener”

Android Hook 机制之简单实战

 

简单案例二: HooK Notification

发送消息到通知栏的核心代码如下:

Android Hook 机制之简单实战

 

跟踪 notify 方法发现最终会调用到 notifyAsUser 方法

Android Hook 机制之简单实战

 

而在 notifyAsUser 方法中,我们惊喜地发现 service 是一个单例,因此,我们可以想方法 hook 住这个 service,而 notifyAsUser 最终会调用到 service 的 enqueueNotificationWithTag 方法。因此 hook 住 service 的 enqueueNotificationWithTag 方法即可

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

综上,要 Hook Notification,大概需要三步:

第一步:得到 NotificationManager 的 sService

第二步:因为 sService 是接口,所以我们可以使用动态代理,获取动态代理对象

第三步?#21644;?#26753;换柱,使用动态代理对象 proxyNotiMng 替换系统的 sService

 

于是,我们可以写出如下的代码

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Hook 使用进阶

Hook ClipboardManager

第一种方法

从上面的 hook NotificationManager 例?#21448;校?#25105;们可以得知 NotificationManager 中有一个静态变量 sService,这个变量是远端的 service。因此,我们尝试查找 ClipboardManager 中是不是也存在相同的类似静态变量。

查看它的源码发现它存在 mService 变量,该变量是在 ClipboardManager 构造函数中初始化的,而 ClipboardManager 的构造方法用 @hide 标记,表明该方法对调用者不可见。

而我们知道 ClipboardManager,NotificationManager 其实这些都是单例的,即系统只会创建一次。因此我们也可以认为

ClipboardManager 的 mService 是单例的。因此 mService 应该是可以考虑 hook 的一个点。

Android Hook 机制之简单实战

 

接下来,我们再来一个看一下 ClipboardManager 的相关方法 setPrimaryClip , getPrimaryClip

Android Hook 机制之简单实战

 

可以发现这些方法最终都会调用到 mService 的相关方法。因此,ClipboardManager 的 mService 确实是一个可以 hook 的一个点。

hook ClipboardManager.mService 的实现

大概需要三个步骤

第一步:得到 ClipboardManager 的 mService

第二步:初始化动态代理对象

第三步?#21644;?#26753;换柱,使用 proxyNotiMng 替换系统的 mService

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

第二种方法

对 Android 源码有基本了解的人都知道,Android 中的各种 Manager 都是通过 ServiceManager 获取的。因此,我们可以通过 ServiceManager hook 所有系统 Manager,ClipboardManager 当然也不例外。

Android Hook 机制之简单实战

 

老套路

第一步?#21644;?#36807;反射获取剪切板服务的远程Binder对象,这里我们可以通过 ServiceManager getService 方法获得

第二步:创建我们的动态代理对象,动态代理原来的Binder对象

第三步?#21644;?#26753;换柱,把我们的动态代理对象设置进去

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战

 

Android Hook 机制之简单实战
Android Hook 机制之简单实战转载<\/script>');
下一篇?#22909;?#26377;了

手机开发阅读排行

最新文章

加拿大快乐8最快开奖
天津快乐10分走势 体球即吋比分网 今日河北快3开奖结果 江西多乐彩基本走势图 311山东时时彩 彩9彩票app地址大全 山西快乐10分钟玩法 企业如何从股票融资 福彩3d跨度走势图浙江风采 总进球数必赚