黑马程序员技术交流社区

标题: Android WindowManager解析与骗取QQ密码案例(一) [打印本页]

作者: Android_Robot    时间: 2016-8-26 11:03
标题: Android WindowManager解析与骗取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
  这些函数是用来修改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的月薪

作者: 胡龙彬    时间: 2016-8-26 12:02
现在的QQ太不安全了
作者: 邓显俊    时间: 2016-8-26 12:15
不错不错,非常不错
作者: dongfangletu    时间: 2016-8-26 21:40
观摩观摩
作者: 细听风语为梧桐    时间: 2016-8-27 21:40
技术真牛啊,羡慕;赞一个
作者: aabbcc2    时间: 2016-8-27 22:40
支持一下
作者: xiguapi    时间: 2016-8-28 19:04
略屌啊~~~
作者: 邓显俊    时间: 2016-8-29 12:52
牛啊,不错不错
作者: a623562486    时间: 2016-8-29 21:10
什么意思这是
作者: Beyond_Q800x    时间: 2016-8-29 21:53
感谢作者,实用
作者: 菜菜_f9490    时间: 2016-8-30 12:23
66666666666666
作者: caoshenv5    时间: 2016-8-30 15:29
楼主真帅,谢谢分享
作者: gohw007    时间: 2016-8-31 00:15
大神 怎么做到的
作者: finally    时间: 2016-9-1 18:06
有点没看懂
作者: 小超超    时间: 2016-9-1 20:05
好赞顶,支持
作者: 左冬至1111111    时间: 2016-9-1 20:50
Android 7.0的关键改变包括可在同
作者: a623562486    时间: 2016-9-1 21:05
这是要干啥,有毒的吧?
作者: Rowan    时间: 2016-9-1 23:59
好贴,支持..
作者: zaoan    时间: 2016-9-2 01:36
顶一个。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2