oppo通知栏的那些事儿(如何分析系统级应用)

前言:

oppo系统的默认禁止了第三方应用向通知栏发送通知,它的设置里面有个通知栏的开关,默认是关闭的,导致了我们发送的通知都展示不出来。只有手动打开了才可以展示。既然可以打开那么我们可是否可以直接用代码去打开这个开关从而让我们的应用可以弹出通知栏呢?既然有了目标就开干。

分析:

分析这一类的问题,就是通过系统的log定位稳定,插上oppo的手机,在通知管理的界面里面,随便点击一个条目,过滤tag为ActivityManager,看系统调用的log。

可以很清晰的看到调用了哪个包,哪个Activity.这里我们直接定位到这一行log。

START u0 {act=com.coloros.notificationmanager.app.detail cmp=com.coloros.notificationmanager/.AppDetailPreferenceActivity (has extras)} from uid 1000 from pid 2086 on display 0

既然知道了是这个com.coloros.notificationmanager包就可以导出这个包对应的APK反编译查看到底调用了哪行代码了。

动手:

如果想知道这个包名对应的app叫什么,手机上安装一个包名查看器,看下这个包名对应是什么东西。

看到了吧有个通知栏管理的系统应用,那么我们就开始动手搞吧,看它是怎么搞的。adb进入到/system/app目录下ls一下。

看起来有点像它,那么就abd pull导出来看一波吧。

F:>adb pull /system/app/notification_center D:/notification_center

/system/app/notification_center/: 4 files pulled…files skipped. 6.2 MB/s (603955 bytes in 0.093s)

导出来是一个文件夹,是个这个东西。

看了下是经过系统odex的应用,无法直接使用dex2jar进行反编译查看,因为要先经过一次odex->dex才能使用dex2jar反编译。网上都说使用baksmali这个工具转换,baksmali
但是使用这个工具有个缺陷就是只能反编译一次然后看一次报错在从系统里面导出需要的依赖包,重复这个动作,然后直到没有报错。这可不是我想要的。这里介绍一款比较强大的工具。

lordrid介绍:lordrid是一款可以直接导出系统应用的插件,支持直接插上手机直接导出系统应用,导出系统system目录,分析反dex的过程,经过lordrid出来的apk就使我们一般打包没有经过odex的apk,省去了我们很多重复的工作。更多的介扫请看官方介绍

下载好lordrid,它下载好了就是这个样子。

然后我们进入到这个目录下面直接运行这个jar就好了。

D:\反编译\lordrid_v1.27>java -jar Launcher.jar

然后软件起来了,直接插上手机,点一下Refresh,然后软件就会识别到手机,点击Deodex now!那么软件就会跑起来了。如果很幸运你的system目录就会自动被导出来,如果倒不出来悲剧了,就跟我一样。

不能直接导出,那么就换手动导出吧。它还有一种模式from Folder,这个时候我们在adb下面导出系统的sytem目录。

C:\Users\edsheng>adb pull /system/ D:/system

adb: error: failed to copy ‘/system/etc/partition_permission.sh’ to ‘D:/system\etc\partition_permiss
ion.sh’: Permission denied

导出到etc这个目录的时候挂了。提示没有权限,打开我们导出的目录看一下。

are you kidding me? 我要的是系统的app目录,但是app目录却没有导出来?这个时候就需要换一个方向,可以看到这里导出来一个priv-app这个目录也是属于系统级别的,也是可以用Lordrid这个工具反odex的,最开始我们都把notification_center这个app给导出来,那么我就直接把放在priv-app这个目录下面去吧。这下一切工作都准备就绪了。直接用Loridrid这个工具的From Folder选项吧,把目录选正确。Deodex now!

等待工具到百分之百。然后打开我们选取的目录下面得到我们需要的notification_center看是不是我们需要的没有进过odex的包。路径都没变化。还是在我们的system/priv-app下面,打开我们的notification_center目录,可以看到这就是我们需要的没有经过odex的apk。

有了这个东西我们就很好分析了。解压一下拿到classes.dex然后dex2jar一下,开始分析。根据刚开始抓的log直接进入AppDetailPreferenceActivity这个类。


注意我标红的这一句看起来就是这个东西啊,那么我们跟进去一下.

关键代码。感觉走到了人生巅峰,既然看到了它是怎么调用的我们是不是也有机会了。分析下代码,通过INotificationManager这个接口,拿到NotificationManager然后调用setNotificationsEnabledForPackage,既然都分析到位了,我们就可以写代码了。注意不能用标准的getservcie来调用这个INotificationManager因为它不是SDK里面的代码,在源码里面已经标准为@hid,那么我们就反射吧。这个可是java的强项、反射代码如下。

try {Class servicemanager =  Class.forName("android.os.ServiceManager");Method getservice = servicemanager.getMethod("getService",String.class);Class notificationManagersub = Class.forName("android.app.INotificationManager$Stub");Method asInterface = notificationManagersub.getDeclaredMethod("asInterface",Class.forName("android.os.IBinder"));Object notificaitonmanager = asInterface.invoke(notificationManagersub,getservice.invoke(servicemanager,"notification"));Method setnotificationenableforpackge = notificaitonmanager.getClass().getMethod("setNotificationsEnabledForPackage",String.class,int.class,boolean.class);setnotificationenableforpackge.invoke(notificaitonmanager,"com.oppo.notification.demo",-1,true);} catch (Exception e) {e.printStackTrace();}

ps:如果是hide类型的方法也可以不用反射调用,可以使用带hide包的SDK,直接调用。但是需要自己去编译或者网上下载。

感觉似乎一切都是那么完美,但是一调用就傻逼了直接报了异常。

Caused by: java.lang.SecurityException: Disallowed call for uid 10095
10-18 11:31:41.302 19966-19966/com.oppo.notification.demo W/System.err: at android.os.Parcel.readException(Parcel.java:1556)
10-18 11:31:41.302 19966-19966/com.oppo.notification.demo W/System.err: at android.os.Parcel.readException(Parcel.java:1509)
10-18 11:31:41.302 19966-19966/com.oppo.notification.demo W/System.err: at android.app.INotificationManager Stub StubProxy.setNotificationsEnabledForPackage(INotificationManager.java:602)

到底是怎么回事呢,本着追根到低的办事方法,记得最开始我们通过lordrid这个工具导出了系统system目录,同时进行了deodex,我们就看看在它的framework.jar里面是怎么调用的。找到system/framework/services.jar因为安卓的用到的service基本上都在这个里面,直接通过查看一下我们需要的代码。还是通过dex2jar把service.jar转成java代码直接查看。

直接找到了这个方法,可以看到上面有一个access方法,估计就是用来检测权限的,通过进程的调用的uid来区分是否有权限,虽然没有达到我们想要开启通知栏的目的,但是从上到下,基本上都过了一遍。最后还是没能通过代码来解决这个问题。

后记:其实我还有一个下想法就是通过app_process 这个进程来运行我们的代码,这样执行的代码就能拿到更高的权限,但是目前对我们的项目好像没有太大的帮助所以没有进行尝试。

总结:

分析系统应用一般步骤:

1.通过系统log定位到问题

2.找到相应的app进行deodex

3.反编译进行分析

4.得出结论

在分享一遍系统deodex的神器:Lordroid,在分析系统应用的时候可能会遇到一些其他的坑,欢迎交流。

oppo通知栏的那些事儿(如何分析系统级应用)相关推荐

  1. android 8.0 调系统拍照_Android通知栏微技巧,8.0系统中通知栏的适配

    为什么要进行通知栏适配? 不得不说,通知栏真是一个让人又爱又恨的东西. 通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是A ...

  2. Android通知栏微技巧,8.0系统中通知栏的适配

    转载请注明出处:https://blog.csdn.net/guolin_blog/article/details/79854070 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 ...

  3. 安卓通知栏管理详解及分析 NotificationListenerService

    NotificationListenerService 安卓通知栏管理详解及分析 一. 方法概述 在api 18前可以通过辅助功能'AccessibilityEvent.TYPE_NOTIFICATI ...

  4. 计算机检索的优点,专利检索与分析系统拥有哪些优势?

    专利检索与分析系统拥有哪些优势?现在很多朋友都在了解专利检索与分析系统又有哪些优势,因为他们需要使用这些系统,不少朋友都会利用业余时间搞各种发明专利,并申请发明专利,在申请之前,人们就需要对专利进行检 ...

  5. AI视频行为分析系统项目复盘——技术篇4:deepsort原理图

    0 背景 见<AI视频行为分析系统项目复盘--技术篇1> 1 目标 尽力绘制详尽的原理图,弄懂deepsort的全局和细节,希望具备以下能力: 精通--能够魔改算法. 一叶知秋--深入了解 ...

  6. AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理

    0 背景 见<AI视频行为分析系统项目复盘--技术篇1> 1 tensorRT 介绍 NVIDIA®TensorRT™是一个深度学习平台,用于模型推理加速(仅支持NVIDIA自家GPU,C ...

  7. AI视频行为分析系统项目复盘——技术篇2:视频流GPU硬解码

    0 项目背景 见<AI视频行为分析系统项目复盘--技术篇1> https://blog.csdn.net/weixin_42118657/article/details/118105545 ...

  8. psRobot:植物小RNA分析系统

    psRobot:植物小RNA分析系统 简介 官网:http://omicslab.genetics.ac.cn/psRobot/ PsRobot是中科院遗传发育所王秀杰组的作品,主要实现小RNA的ma ...

  9. SILVAngs:免费在线宏基因组扩增子分析系统

    SILVAngs - rDNA-based microbial community analysis using next-generation sequencing (NGS) data 简介 SI ...

最新文章

  1. 动画库NineOldAndroids
  2. python正确的输入语句_手把手教你在python中如何使用while True语句
  3. xx是一个类型 这在给定的上下文_BERT, ELMo, amp; GPT-2: 这些上下文相关的表示到底有多上下文化?...
  4. 面试必会之HashMap源码分析
  5. spring之依赖注入
  6. 面对 MySQL 查询索引失效,程序员的六大优化技巧!
  7. python的全局变量和局部变量
  8. weblogic查看版本号教程
  9. FastStone Capture 7.7 截图工具下载地址及使用
  10. WPS 删除线快捷键
  11. 【战“疫”案例展】上海临港方舱医院——7天打造“数字方舱”,搭建智能化管理系统平台...
  12. 打开本地安全策略的方式
  13. GitHub使用技巧,在线ide编辑代码、在线运行代码、快速查找阅读代码
  14. ADSL上网速度慢的原因及快速排除方法
  15. ubuntu samba实现linux与windows之间的资源共享
  16. XElement.Load 需要释放吗_蚕茧能清洁毛孔吗 蚕茧护肤的正确方法速Get√|蚕茧|清洁-爱美·BEAUTY...
  17. Anaconda虚拟环境中,让Python3使用ROS的cv_bridge
  18. 笔记整理英语篇(二) - 日常词汇
  19. 开始写博客~~~~~
  20. [ACTF2020 新生赛]Exec1命令注入

热门文章

  1. 中国信通院发布《大数据白皮书(2019年)》(附PPT解读及下载链接)
  2. 微信小程序进行蓝牙初始化、搜索附近蓝牙设备及连接指定蓝牙(一)
  3. vue插件实现循环滚动列表——vue-seamless-scroll
  4. 在哪找中国风水墨滴落泼洒视频转场—56组让人惊叹的视频特效
  5. MapGIS IGServer九州-驾驭国产化环境下的拓展服务开发
  6. 笔记:Sublime Text 3
  7. 【python基础】正则表达式总结
  8. 十二、Redis持久化之AOF原理
  9. 区块链分片技术相关资料收集
  10. Android开发人员不得不收集的代码(持续更新中)(http://www.jianshu.com/p/72494773aace,原链接)