android 黑科技 Xposed框架 hook 全局系统通知


什么是Xposed

Xposed框架(Xposed Framework)是一套开源的、在Android高权限模式下运行的框架服务,可以在不修改APK文件的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。 ----- 来源百度搜索

背景

首先,先介绍一下之前项目中使用的抓取通知栏内容的一套方案:

  • 方案一、自定义继承 NotificationListenerService 的服务,并通过监听通知变化回调获取通知方式。

    缺点: android5.0以后,存在应用杀死后服务监听收不到的情况,需要重启手机才能再次使用。

  • 方案二、使用android辅助功能,自定义继承 AccessibilityService 的服务,监听系统通知栏的行为变化,获取通知。
    缺点:应用需要一直停留在前台,后台服务容易被系统杀死,导致监听失败情况,可以采用两个服务互为守护解决。

下面介绍一下直接hook系统 NotificationManager 的 notify 方法实现全局通知监听,这种方法通过拦截系统通知方法,截取 Notification 来直接从源头获取通知内容。

如何使用

先配环境

  • 安装android模拟器:Genymotion, 这个模拟器启动速度快,且系统拥有root权限,使用起来比较流畅,具体安装过程不多提。当然如果有一台root的手机就更好了。
    下载地址https://www.genymotion.com/
  • 为模拟器android arm 架构支持(非必须),下载地址
    https://github.com/m9rco/Genymotion_ARM_Translation/tree/master/package,下载后直接拖拽到模拟器中安装后重启模拟器即可。
  • 安装Xposed框架下载(andriod 5.0-7.0可用) 下载地址 https://pan.baidu.com/s/1T1s37QowFOVZ9X-ejB8eZg,
    下载好的apk,直接拖拽到模拟器里安装,安装后打开应用,对框架进行激活。
    至此,基本工作已经做好,剩下就是开始写代码了。
    image.png

再写代码

1.Xposed模块创建
使用android studio 创建一个工程,并增加Xposed框架依赖。

 compileOnly 'de.robv.android.xposed:api:82'
 compileOnly 'de.robv.android.xposed:api:82:sources'

2.hook 系统 NotifacationManager 类的notify方法
新建一个类HookTest类实现 IXposedHookLoadPackage 方法并重写 handleLoadPackage 方法。

  @Override
  public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
                final Class clazz = XposedHelpers.findClass(
                "android.app.NotificationManager", loadPackageParam.classLoader);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            XposedHelpers.findAndHookMethod(clazz, "notify"
                    , String.class, int.class, Notification.class
                    , new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                        }

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            XposedBridge.log("methodHookParam.args:  " + Arrays.toString(param.args));
                            Notification a = (Notification) param.args[2];
                            String aPackage = notification.contentView.getPackage();
                            String title = "";
                            String text = "";
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                                Bundle bundle = notification.extras;
                                title = (String) bundle.get("android.title");
                                text = (String) bundle.get("android.text");
                                XposedBridge.log("loadpackage"+ aPackage);
                                XposedBridge.log("tickerText" + a.tickerText.toString());
                                XposedBridge.log("title"+ title);
                                XposedBridge.log("text"+ text);
                            }
                        }
                    });
        }
    }
    
}

3.新建assets目录,并创建文件xposed_init, 文件内容为hook类的全类名。


image.png

4.AndroidManifest.xml中为application配置meta-data标识为`xposed`框架可识别模块。




5.运行应用,并在安装好的xposed框架应用中,找到配置的模块,并勾选,重启后生效。

image.png

6.直接看效果。

image.png

6.至此,hook全局通知完成。具体实现的原理以及xposed的框架这里就不过多介绍了,请自行百度即可。
项目git地址:https://github.com/lengku8e/XposeDemo

你可能感兴趣的:(android 黑科技 Xposed框架 hook 全局系统通知)