A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

涨薪机密——潮流新技术、新框架资源以后不定期更新,
  
Android WindowManager解析与骗取QQ密码案例(一)

       最近在网上有人在乌云上提了一个漏洞,应用可以开启一个后台Service,检测当前顶部应用,如果为QQ或相关应用,就弹出一个自定义window用来诱骗用户输入账号密码,找了一个demo,界面如下(界面粗糙,应该没人会上当吧,意思到了就行哈=, =):


demo地址:https://github.com/zhaozepeng/GrabQQPWD


一、Window&&WindowManager介绍
  分析demo之前,先要整理总结一下相关的知识。先看看Window类,Window是一个抽象类,位于代码树frameworks\ android\view\Window.java文件。连同注释,这个文件总共一千多行,它概括了Android窗口的基本属性和基本功能。唯一实现了这个抽象类的是PhoneWindow,实例化PhoneWindow需要一个窗口,只需要通过WindowManager即可完成,Window类的具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。Android中的所有视图都是通过Window来呈现的,不管是Activity,Dialog还是Toast,他们的视图实际上都是附加在Window上的,因此Window实际上是View的直接管理者,点击事件也是由Window传递给view的。WindowManager.LayoutParams.type参数表示window的类型,共有三种类型,分别是应用Window,子Window和系统Window。应用Window对应着一个Activity,类似Dialog之类的子Window不能单独存在,他需要附属在应用Window上才可以,系统Window则不需要,比如Toast之类,可以直接显示。每个Window都有对应的z-orderd,层级大的window会覆盖在层级小的window之上,应用window的层级范围是1~99,子window的范围是1000~1999,系统window的范围是2000~2999,这些层级范围都对应着相关的type,type的相关取值:官网链接中文资料。WindowManager.LayoutParams.flags参数表示window的属性,默认为none,flags的相关取值:官方链接
  再详细分析一下WindowManager,WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。通过代码Context.getSystemService(Context.WINDOW_SERVICE)可以获得WindowManager的实例。WindowManager所提供的功能很简单,常用的只有三个方法,即添加View、更新View和删除View,这三个方法定义在ViewManager中,而WindowManager继承了ViewManager
  • addView();
  • updateViewLayout();
  • removeView();
  这些函数是用来修改Window的,它的真正实现是WindowManagerImpl类,WindowManagerImpl这种工作模式是典型的桥接模式,Window 为抽象部分,WindowManagerImpl 为实现部分。WindowManagerImpl类并没有直接实现Window的三大操作,而是全部交给了WindowManagerGlobal来处理,WindowManagerGlobal以单例模式的形式向外提供自己的实例,在WindowManagerGlobal中有如下一段代码:
[AppleScript] 纯文本查看 复制代码
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getinstance()

将所有的操作全部交给WindowManagerGlobal来实现。
  View是Android中视图的呈现方式,但是View不能单独存在,他必须要附着在Window这个抽象的概念上面,每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,因此有视图的地方就有Window,比如常见的Activity,Dialog,Toast等。
  对于每个activity只有一个decorView也就是ViewRoot,window是通过下面方法获取的
[AppleScript] 纯文本查看 复制代码
Window mWindow = PolicyManager.makeNewWindow(this);

创建完Window之后,Activity会为该Window设置回调,Window接收到外界状态改变时就会回调到Activity中。在activity中会调用setContentView()函数,它是调用 window.setContentView()完成的,而Window的具体实现是PhoneWindow,所以最终的具体操作是在PhoneWindow中,PhoneWindow的setContentView方法第一步会检测DecorView是否存在,如果不存在,就会调用generateDecor函数直接创建一个DecorView;第二步就是将Activity的视图添加到DecorView的mContentParent中;第三步是回调Activity中的onContentChanged方法通知Activity视图已经发生改变。这些步骤完成之后,DecorView还没有被WindowManager正式添加到Window中,最后调用Activity的onResume方法中的makeVisible方法才能真正地完成添加和现实过程,Activity的视图才能被用户看到
  Dialog Window 的创建过程和 Activity 类似,第一步也是用 PolicyManager.makeNewWindow 方法来创建一个 Window,不过这里传入的context必须要为activity的context;第二步也是通过 setContentView 函数去设置dialog 的布局视图;第三步调用 show 方法,通过 WindowManager 将 DecorView添加到Window中显示出来。
  Toast和Dialog不同,它稍微复杂一点,首先Toast也是基于Window来实现的,但是由于Toast具有定时取消的这一个功能,所以系统采用了Handler。在Toast的内部有两类IPC过程,第一类是Toast访问NotificationManagerService,第二类是NotificationManagerService回调Toast里的TN接口。在Toast类中,最重要的用于显示该toast的show方法调用了service.enqueueToast(pkg, tn, mDuration);也就是说系统为我们维持了一个toast队列,这也是为什么两个toast不会同时显示的原因,该方法将一个toast入队,显示则由 系统维持显示的时机。

[AppleScript] 纯文本查看 复制代码
private static INotificationManager sService;
static private INotificationManager getService() {
    if (sService != null) {
        return sService;
    }
    sService = INotificationManager.Stub.asInterface(ServiceManager.getService("notification"));
    return sService;
}

该服务sService就是系统用于维护toast的服务。最后NMS会通过IPC调用Toast类内部的一个静态私有类TN,该类是toast的主要实现,该类完成了toast视图的创建,显示和隐藏。


其他精华资源推荐:
平均薪资近12K,Android续写“刷薪”记录!
[持续更新]2016最新Android视频教程+源码+技巧/经验+软件+面试
为什么黑马程序员能给你2W的月薪

18 个回复

倒序浏览
胡龙彬 来自手机 中级黑马 2016-8-26 12:02:57
沙发
现在的QQ太不安全了
回复 使用道具 举报
不错不错,非常不错
回复 使用道具 举报
观摩观摩
回复 使用道具 举报
技术真牛啊,羡慕;赞一个
回复 使用道具 举报
支持一下
回复 使用道具 举报
略屌啊~~~
回复 使用道具 举报
牛啊,不错不错
回复 使用道具 举报
什么意思这是
回复 使用道具 举报
感谢作者,实用
回复 使用道具 举报
66666666666666
回复 使用道具 举报
caoshenv5 来自手机 中级黑马 2016-8-30 15:29:58
12#
楼主真帅,谢谢分享
回复 使用道具 举报
大神 怎么做到的
回复 使用道具 举报
有点没看懂
回复 使用道具 举报
好赞顶,支持
回复 使用道具 举报
Android 7.0的关键改变包括可在同
回复 使用道具 举报
这是要干啥,有毒的吧?
回复 使用道具 举报
好贴,支持..
回复 使用道具 举报
顶一个。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马