精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android攔截AMS請求實戰(zhàn)

移動開發(fā)
下面從各個 Android 版本看一下系統(tǒng)這個過程的實現(xiàn)方法以及我們是怎么攔截的,主要看一下 Android P 的源碼,其它版本的雖然過程不一樣,但是 Hook 的方式是類似的。

概述

接著上次后臺啟動 Activity 的需求,依照 實戰(zhàn)|Android后臺啟動Activity實踐之路 中的一些方法處理后,雖然在 Android Q 版本上還是有一些問題,但后臺啟動的能力算是基本完成了,后來我又解開了小米 ROM 的源碼,找到了他們后臺啟動這一項權(quán)限的實現(xiàn)方式以及怎么繞開這項權(quán)限的方法,發(fā)現(xiàn)結(jié)果意外的簡單..(這部分以后有機會單獨寫一篇文章)。

[[377520]]

這篇文章發(fā)生在后臺啟動的調(diào)研之后,如果我們要后臺啟動的 Activity 頁面在第三方 SDK 里,且啟動該頁面的動作(startActivity)也發(fā)生在第三方 SDK 中,那么它們直接 startActivity 的方式是不具備后臺啟動的能力的,因為一些原因我們不能要求 SDK 方修改啟動 Activity 的方法,因此需要找個方法能夠在不修改第三方 SDK 調(diào)用 startActivity 代碼的情況下,讓其具備后臺啟動的能力。第一個反應(yīng)就是攔截 startActivity 的請求,參考 Android之system_server進程 和 Android-Activity啟動流程,我們知道 AMS 是 system_server 進程中的一個線程,它負責(zé)啟動 Activity 的具體工作,在它的工作完成之后,會通過 Binder 調(diào)用回調(diào) APP 進程中 Activity 實例的生命周期方法。當(dāng) APP 進程調(diào)用 startActivity 時,會由 Instrumentation 獲取到 AMS 的 Binder 代理,然后通過它來跨進程調(diào)用 AMS 的相關(guān)方法,我們能做 Hook 攔截的地方就是這個 Binder 代理對象!

下面從各個 Android 版本看一下系統(tǒng)這個過程的實現(xiàn)方法以及我們是怎么攔截的,主要看一下 Android P 的源碼,其它版本的雖然過程不一樣,但是 Hook 的方式是類似的。

Android P

Android 8 到 Android 9 版本的 AOSP 獲取 AMS 代理的方式是一樣的,APP 進程在調(diào)用 context.startActivity 后,會來到 Instrumentation 中的相關(guān)方法里調(diào)用如下代碼:

  1. int result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent, ...); 

這里通過 Binder 跨進程調(diào)用到 AMS 中的相關(guān)方法,看一下 ActivityManager.getService() 的實現(xiàn):

 

  1. /** @hide */ 
  2. public static IActivityManager getService() { 
  3.     return IActivityManagerSingleton.get(); 
  4.  
  5. private static final Singleton<IActivityManager> IActivityManagerSingleton = new Singleton<IActivityManager>() { 
  6.      
  7.  
  8.  
  9.     protected IActivityManager create() { 
  10.         // 1... 
  11.     } 
  12. }; 

可以看到 IActivityManagerSingleton 是 Singleton 類型的實例,很顯然這個 Singleton 是一個懶加載的單例模板類:

  1. public abstract class Singleton<T> { 
  2.     private T mInstance; 
  3.  
  4.     protected abstract T create(); 
  5.  
  6.     public final T get() { 
  7.         synchronized (this) { 
  8.             if (mInstance == null) { 
  9.                 mInstance = create(); 
  10.             } 
  11.             return mInstance; 
  12.         } 
  13.     } 

于是可以知道 IActivityManagerSingleton.get() 返回的便是 create 方法中的實例,給出上面 1 處省略的 create 方法代碼:

  1. final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE); 
  2. final IActivityManager am = IActivityManager.Stub.asInterface(b); 
  3. return am; 

熟悉 Binder 的同學(xué)一眼就能看出這里的 am 是一個 Binder 代理對象,存在 ServiceManager.getService 方法就肯定存在 ServiceManager.addService 方法,一個是從 ServiceManager 中查詢 Binder 服務(wù),一個是往 ServiceManager 中注冊服務(wù),注冊的時機在系統(tǒng)啟動 system_server 進程的時候,參考 AMS啟動流程,這里就不深入描述了。

所以 ActivityManager.getService() 方法其實就是返回了 AMS 的一個 Binder 代理對象,用來跨進程調(diào)用 AMS 相關(guān)方法,因此可以通過 JDK 動態(tài)代理的方式,通過 Proxy.newProxyInstance 方法創(chuàng)建 am 的代理 Proxy 對象,并通過反射的方式將 ActivityManager.getService() 方法返回的 am 對象替換成我們的 Proxy 對象,那么在 App 進程調(diào)用 ActivityManager.getService().XXX 方法時都會被我們的 Proxy 攔截到,進而做一些處理。JDK 動態(tài)代理也是 Java 常用的設(shè)計模式之一,不太熟悉的同學(xué)可以參考 Jdk動態(tài)代理 的使用。

這個過程可以分成三個步驟:

  1. 反射獲取 am 對象,由于 ActivityManager.getService() 是一個隱藏方法,因此可以通過反射調(diào)用它拿到原 am 對象;
  2. 創(chuàng)建代理對象Proxy;
  3. 通過反射用 Proxy 替換 am 對象;

我們看到 am 對象其實就是 Singleton(其實例是IActivityManagerSingleton) 中的 mInstance 屬性,因此第三步只需通過反射將 mInstance 屬性設(shè)置為我們的 Proxy 對象即可,下面的 AmsHooker 是一個抽象類,在不同的 Android 平臺上有不同的實現(xiàn),主要用來獲取不同 Android 平臺的 am 對象及通過反射替換 am 對象:

  1. abstract class AmsHooker { 
  2.     // 通過反射,將am替換成proxy 
  3.     fun hookAms(proxy: Any?) { 
  4.         try { 
  5.             val hookObj = getHookObj() 
  6.             val hookField = getHookField() 
  7.             if (hookObj != null && hookField != null && proxy != null) { 
  8.                 hookField.set(hookObj, proxy) 
  9.             } 
  10.         } catch (e: Exception) { 
  11.             e.printStackTrace() 
  12.         } 
  13.     } 
  14.  
  15.     // 即IActivityManagerSingleton實例 
  16.     protected abstract fun getHookObj(): Any
  17.  
  18.     // 即mInstance 
  19.     protected abstract fun getHookField(): Field? 
  20.  
  21.     // 即am 
  22.     abstract fun getTarget(): Any
  23.  
  24.     // 接口,用來創(chuàng)建Proxy 
  25.     abstract fun getInterfaces(): Array<Class<*>> 

在 Android P 平臺上的實現(xiàn)如下,具體看注釋:

  1. class AmsPHooker : AmsHooker() { 
  2.     override fun getHookObj(): Any? { 
  3.         val amClass = ReflectUtils.getClass("android.app.ActivityManager"
  4.         // 拿到 IActivityManagerSingleton 屬性 
  5.         return ReflectUtils.readStaticField(amClass, "IActivityManagerSingleton"
  6.     } 
  7.  
  8.     override fun getHookField(): Field? { 
  9.         // 獲取 mInstance Field 
  10.         return ReflectUtils.getField(ReflectUtils.getClass("android.util.Singleton"), "mInstance"
  11.     } 
  12.  
  13.     override fun getTarget(): Any? { 
  14.         // ActivityManager.getService()返回 am 
  15.         return ReflectUtils.getClass("android.app.ActivityManager").getDeclaredMethod("getService").invoke(null
  16.     } 
  17.  
  18.     // 獲取interfaces,用來創(chuàng)建動態(tài)代理 
  19.     override fun getInterfaces(): Array<Class<*>> { 
  20.         return arrayOf(ReflectUtils.getClass("android.app.IActivityManager")) 
  21.     } 

接下來創(chuàng)建代理類(代碼有刪減):

 

  1. public class AMSProxy implements InvocationHandler { 
  2.     private AmsHooker hooker; // 根據(jù)不同 Android 平臺返回不同實現(xiàn) 
  3.     private Object origAm; // 原有 am 對象 
  4.  
  5.     private boolean ensureInit() { 
  6.         // ... 
  7.         hooker = getHooker(); 
  8.         origAm = hooker.getTarget(); 
  9.     } 
  10.  
  11.     private AmsHooker getHooker() { 
  12.         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { 
  13.             return new AmsQHooker(); 
  14.         } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { 
  15.             return new AmsPHooker(); 
  16.         } else { 
  17.             return new AmsNHooker(); 
  18.         } 
  19.     } 
  20.  
  21.      
  22.  
  23.  
  24.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  25.         // ... 
  26.     } 
  27.  
  28.     // 創(chuàng)建代理 
  29.     Object proxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
  30.                 hooker.getInterfaces(), this); 
  31.     // 替換系統(tǒng)am對象 
  32.     hooker.hookAms(proxy); 

上面以 AMSProxy 實例為參數(shù)創(chuàng)建了一個代理對象 Proxy,并用這個 Proxy 對象通過 hookAms 方法替換掉了 am 對象,這樣在本進程通過 ActivityManager.getService() 來調(diào)用相關(guān)方法時,會調(diào)用到上述的 invoke 方法,在這可以做攔截:

  1. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  2.     try { 
  3.         if (callback.canIntercept(method, args)) { 
  4.             if (callback.autoRemove()) { 
  5.                 // 將am對象還原 
  6.                 // ... 
  7.             } 
  8.             // 攔截am的請求,做自己的業(yè)務(wù)處理 
  9.             return callback.intercept(origAm, method, args); 
  10.         } 
  11.         return method.invoke(origAm, args); 
  12.     } catch (Exception e) { 
  13.         e.printStackTrace(); 
  14.     } 
  15.     return null

當(dāng)本進程中有代碼嘗試通過 am 來調(diào)用相關(guān)方法(比如說startActivity等)時,都會被 invoke 方法所攔截,然后通過我們設(shè)置的攔截條件(canIntercept)去選擇是否攔截。建議每次完成了攔截的業(yè)務(wù)需求后,就把原 am 對象通過 hookAms 方法還原,防止的本次進程中持續(xù)攔截系統(tǒng)請求。這里一直強調(diào)是本次進程,顯而易見,通過反射去替換 am 對象的方式,只會針對本進程起作用。

Android Q

在 Android Q 上,上述 Instrumentation 中的調(diào)用變成如下:

  1. int result = ActivityTaskManager.getService().startActivity(whoThread, who.getBasePackageName(), intent, ...); 

這變成了 ActivityTaskManager.getService():

 

  1. /** @hide */ 
  2. public static IActivityTaskManager getService() { 
  3.     return IActivityTaskManagerSingleton.get(); 
  4.  
  5. private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton = new Singleton<IActivityTaskManager>() { 
  6.      
  7.  
  8.  
  9.     protected IActivityTaskManager create() { 
  10.         final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE); 
  11.         return IActivityTaskManager.Stub.asInterface(b); 
  12.     } 
  13. }; 

可以看到在 Android Q 上從 ActivityManager 變成了 ActivityTaskManager 系列的類,于是我們的 AmsQHooker 實現(xiàn)如下:

  1. class AmsQHooker : AmsHooker() { 
  2.     override fun getHookObj(): Any? { 
  3.         val amClass = ReflectUtils.getClass("android.app.ActivityTaskManager"
  4.         // 拿到 IActivityTaskManagerSingleton 屬性 
  5.         return ReflectUtils.readStaticField(amClass, "IActivityTaskManagerSingleton"
  6.     } 
  7.  
  8.     override fun getHookField(): Field? { 
  9.         return ReflectUtils.getField(ReflectUtils.getClass("android.util.Singleton"), "mInstance"
  10.     } 
  11.  
  12.     override fun getTarget(): Any? { 
  13.         // Reflective access to getService is forbidden when targeting API 29 and above 
  14.         // val getServiceMethod = amClass.getDeclaredMethod("getService"
  15.         return ReflectUtils.getClass("android.util.Singleton").getDeclaredMethod("get").invoke(getHookObj()) 
  16.     } 
  17.  
  18.     override fun getInterfaces(): Array<Class<*>> { 
  19.         return arrayOf(ReflectUtils.getClass("android.app.IActivityTaskManager")) 
  20.     } 

其它的步驟跟 Android P 是一樣的。

Android N

在 Android 7.1 及以下,Instrumentation 的調(diào)用又不一樣:

  1. int result = ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent, ...); 

這變成了 ActivityManagerNative.getDefault():

  1. static public IActivityManager getDefault() { 
  2.     return gDefault.get(); 
  3.  
  4. private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { 
  5.     protected IActivityManager create() { 
  6.         IBinder b = ServiceManager.getService("activity"); 
  7.         IActivityManager am = asInterface(b); 
  8.         return am; 
  9.     } 
  10. }; 

可以看到雖然類名和方法有所變化,但還是借助了 Singleton 類,所以只需要繼承 AmsHooker 重寫相關(guān)方法即可:

  1. class AmsNHooker : AmsHooker() { 
  2.     override fun getHookObj(): Any? { 
  3.         val amNativeClass = ReflectUtils.getClass("android.app.ActivityManagerNative"
  4.         // 獲取gDefault實例 
  5.         return ReflectUtils.readStaticField(amNativeClass, "gDefault"
  6.     } 
  7.  
  8.     override fun getHookField(): Field? { 
  9.         return ReflectUtils.getField(ReflectUtils.getClass("android.util.Singleton"), "mInstance"
  10.     } 
  11.  
  12.     override fun getTarget(): Any? { 
  13.         return getHookField()?.get(getHookObj()) 
  14.     } 
  15.  
  16.     override fun getInterfaces(): Array<Class<*>> { 
  17.         return arrayOf(ReflectUtils.getClass("android.app.IActivityManager")) 
  18.     } 

其它的也是重用 Android P 上的邏輯。

總結(jié)

通過上面的方式,可以實現(xiàn) 在本進程內(nèi)攔截通過 AMS 的 Binder 代理調(diào)用的相關(guān)方法,可以用來實現(xiàn)一些非常規(guī)的功能,雖然最近做的需求都比較非常規(guī)(liumang),不過拋開需求,對于開發(fā)而言去調(diào)研這些技術(shù),還是挺有意思的..哈~

寫博客是一件有意思有收獲也有難度的事情,需要爭取把文章的脈絡(luò)和邏輯梳理清楚,怎么寫才能把文章寫得更加清晰易懂,又有好久沒更新了,最近太忙了都沒有時間做這些事情,想到自己寫的文章(可)能被點贊,瞬間又有了動力,于是忙里偷魚寫了一篇,內(nèi)容沒啥深度,就當(dāng)平時的開發(fā)筆記吧。

責(zé)任編輯:未麗燕 來源: 蒼耳的微博
相關(guān)推薦

2021-10-28 09:36:12

高并發(fā)數(shù)據(jù)實踐

2024-08-05 09:29:00

前端接口請求

2021-10-29 16:36:53

AMSAndroidActivityMan

2021-01-12 08:20:51

AndroidActivity系統(tǒng)

2019-03-01 09:55:28

HTTPMock架構(gòu)

2012-07-20 11:13:07

云計算

2021-03-27 22:21:48

HTTPPython數(shù)據(jù)

2025-04-18 10:26:29

后端接口通用封裝

2024-05-20 08:21:36

Activity內(nèi)部類接口

2012-02-03 09:14:44

谷歌惡意應(yīng)用Android

2021-03-26 06:01:45

日志MongoDB存儲

2012-11-08 20:39:18

2024-09-02 08:17:18

2024-05-13 09:32:06

攔截器HTTP中間件

2012-04-26 10:50:37

2012-04-11 09:51:50

2012-02-20 13:44:08

2015-05-15 11:25:53

2020-11-12 09:55:02

OAuth2

2021-02-25 15:14:16

.NET項目攔截器
點贊
收藏

51CTO技術(shù)棧公眾號

91久久久久久久久| 色狠狠av一区二区三区香蕉蜜桃| 成人在线播放网址| 韩国免费在线视频| 国产乱码精品一区二区三区忘忧草| 欧美丰满少妇xxxxx| 天堂久久久久久| 中文幕av一区二区三区佐山爱| 亚洲欧美国产77777| 国产一区二区免费在线观看| 午夜一区二区三区四区| 亚洲网站在线| 日韩中文字幕av| 东京热av一区| 伊人久久大香线蕉综合影院首页| 婷婷一区二区三区| 4444在线观看| se在线电影| av电影一区二区| 91免费欧美精品| 中文字幕免费观看| 91亚洲成人| 亚洲高清久久久久久| 午夜剧场高清版免费观看 | japanese色系久久精品| 欧美日韩极品在线观看一区| 亚洲自偷自拍熟女另类| 日本动漫同人动漫在线观看| 国产精品情趣视频| 免费在线观看一区二区| 成人免费视频国产| 精品一区二区精品| 国产精品美女久久久久av超清| 国产精品1000| 欧美日韩国产在线一区| 久久精品国产69国产精品亚洲 | 午夜啪啪小视频| 欧美va在线观看| 欧美性色视频在线| 日韩一级性生活片| 欧美日韩在线视频免费观看| 日韩理论片一区二区| 亚洲一区在线直播| 午夜免费视频在线国产| 中文字幕欧美三区| 日本一区二区三区视频在线播放| 亚洲色图欧美视频| 成人av网站在线观看免费| 999精品视频一区二区三区| 国产伦理一区二区| 国产最新精品精品你懂的| 国产精品18久久久久久麻辣| 亚洲天堂男人av| 久久综合影音| 国产精品电影久久久久电影网| 国产福利拍拍拍| 亚洲青涩在线| 日本免费久久高清视频| 黄色片视频免费| 日韩精品亚洲专区| 国产一区二区丝袜| 国产极品久久久| 国产91丝袜在线18| 国产欧美一区二区三区不卡高清| 欧美熟妇交换久久久久久分类| 国产 日韩 欧美大片| 国产精品一区二区三区观看| 手机看片1024国产| 久久久久久影视| 日本成人黄色免费看| 永久免费在线观看视频| 亚洲精品日产精品乱码不卡| 国产真实老熟女无套内射| 麻豆视频在线观看免费网站黄| 欧美视频中文在线看| 国产精品igao| 欧美日韩黄网站| 亚洲国产免费av| 99在线视频免费| 一本一道久久a久久精品蜜桃 | 国产一区二区三区四| 99久久精品免费看国产四区| 特级丰满少妇一级aaaa爱毛片| 久久青草欧美一区二区三区| 一区二区视频国产| 波多野结衣中文字幕久久| 色婷婷精品久久二区二区蜜臂av| 性猛交ⅹ×××乱大交| jizz18欧美18| 尤物精品国产第一福利三区| 青娱乐国产盛宴| 久久久噜噜噜久久狠狠50岁| 91香蕉嫩草影院入口| 天天操天天爱天天干| 国产精品每日更新在线播放网址| 日韩一区二区高清视频| 成人一区视频| 亚洲精品v天堂中文字幕| 蜜桃av.com| 日韩视频不卡| 91久久中文字幕| 青青青草原在线| 亚洲精品高清在线观看| 热久久精品免费视频| 好吊妞国产欧美日韩免费观看网站 | 欧美性感美女一区二区| 久久久在线免费观看| 91极品身材尤物theporn| 91老司机福利 在线| 蜜臀av.com| 97精品国产99久久久久久免费| 欧美成人艳星乳罩| 四虎国产成人精品免费一女五男| 亚洲成人中文| 91视频免费进入| 99中文字幕一区| 色综合久久久网| 欧美丰满熟妇bbb久久久| 日韩欧美国产精品综合嫩v| 91高潮精品免费porn| 亚洲精品无码久久久| 中文字幕亚洲不卡| 色七七在线观看| 国产精品嫩模av在线| 午夜精品久久久久久久99热浪潮| 国产女18毛片多18精品| 中文字幕av一区二区三区| 大肉大捧一进一出好爽视频| 北条麻妃一区二区三区在线观看| 久久精品国产亚洲| 亚洲中文一区二区三区| 欧美激情中文字幕一区二区| 少妇人妻互换不带套| 亚洲自拍都市欧美小说| 91a在线视频| 三级网站在线看| 黄网站色欧美视频| 大尺度做爰床戏呻吟舒畅| 国内视频精品| 国产aⅴ精品一区二区三区黄| 在线观看三级视频| 日韩一级视频免费观看在线| 日韩欧美国产成人精品免费| 老鸭窝一区二区久久精品| 亚洲人成人77777线观看| 欧洲成人一区| 综合久久五月天| 91国在线视频| 一区二区三区欧美日韩| 丰满饥渴老女人hd| 1024成人| 久久伦理网站| 日韩天堂在线| 最近2019中文免费高清视频观看www99 | 91久久精品在线| 日本高清在线观看wwwww色| 欧美美女喷水视频| 福利所第一导航| 国产99久久久国产精品| 日韩在线一级片| 欧美日韩国产高清电影| 国产色视频一区| 久草在线视频资源| 精品一区精品二区| 在线观看黄色国产| 一区二区三区在线免费视频 | 国产女人18毛片水真多成人如厕 | 久久尤物电影视频在线观看| 玩弄japan白嫩少妇hd| 日韩国产欧美一区二区| 亚洲影院色无极综合| 1区2区3区在线| 亚洲午夜性刺激影院| 国产一区二区麻豆| 亚洲国产精品一区二区www | 伊人成人222| 欧美理论在线| 青青草成人网| 麻豆精品久久| 国产不卡av在线免费观看| 国产原创精品视频| 日韩大陆毛片av| 伊人精品一区二区三区| 亚洲大片精品永久免费| 色屁屁草草影院ccyy.com| 国产精品99久久久久久有的能看| 日韩av黄色网址| 亚洲一区欧美| 日韩国产精品一区二区| 亚洲综合网狠久久| 国产精品久久久久999| 在线中文字幕第一页| 亚洲品质视频自拍网| 99国产精品一区二区三区| 黑人巨大精品欧美一区二区免费| 网爆门在线观看| 成人av电影在线网| 久久国产激情视频| 国产免费成人| 国产精品av免费观看| 九九热线有精品视频99| 国产91aaa| 国产成人精品一区二区三区视频 | 99精品美女视频在线观看热舞| 羞羞色国产精品| 顶级网黄在线播放| 伊人男人综合视频网| 人妻与黑人一区二区三区| 欧美日韩国产一区二区三区地区| 天堂网一区二区三区| 亚洲卡通动漫在线| 2017亚洲天堂| 国产欧美精品一区| wwwwww日本| 99精品在线观看视频| 黑人巨大猛交丰满少妇| 麻豆国产欧美一区二区三区| 亚洲国产精品久久久久爰色欲| 午夜精品影院| 欧洲xxxxx| 日韩欧美视频在线播放| 欧美主播一区二区三区美女 久久精品人 | 国产欧美日韩综合一区在线观看 | 欧美aa在线视频| 无码播放一区二区三区| 精品999成人| 久久99久久99精品| 好看的日韩av电影| 9色porny| 欧美日韩国产色综合一二三四| 日韩视频在线免费播放| 91亚洲国产高清| 在线观看免费91| 国产精品91一区二区三区| 亚洲伊人婷婷| 91亚洲国产成人久久精品| 亚洲三区四区| 88国产精品视频一区二区三区| 亚洲一区三区视频在线观看| 久久理论电影| 在线观看欧美亚洲| 一区二区三区毛片免费| 日韩欧美视频免费在线观看| 欧美影院一区| 久久在线中文字幕| 国产一区二区三区成人欧美日韩在线观看 | 黄色免费在线播放| 中文字幕国产精品| 黄色在线论坛| 欧美伦理91i| 成年人视频免费在线播放| 97精品视频在线播放| 午夜影视一区二区三区| 国产精品扒开腿爽爽爽视频| 欧美黄色a视频| 91中文字幕在线| 高清日韩欧美| 麻豆av一区二区| 精品免费在线| 一级一片免费播放| 伊人蜜桃色噜噜激情综合| 极品美女扒开粉嫩小泬| 视频一区在线播放| 五月天婷婷亚洲| 丰满白嫩尤物一区二区| 久久人人妻人人人人妻性色av| 久久精品亚洲国产奇米99| 天堂av网手机版| 亚洲精品一二三| 国产成人自拍视频在线| 欧美性感一区二区三区| 精品国产一级片| 精品视频在线观看日韩| 一区二区高清不卡| 久久久久久亚洲| 欧美三级精品| 99re视频在线| 国产精品一在线观看| 中文字幕色呦呦| 亚洲欧美高清| 亚洲理论中文字幕| 91在线视频在线| 精品国产视频一区二区三区 | 亚洲综合成人av| 日韩欧美综合一区| 人妻丰满熟妇av无码区hd| 在线看日韩av| bbw在线视频| 国产精品成人va在线观看| 999精品嫩草久久久久久99| 免费成人在线观看av| 亚洲精品电影| 久久九九国产视频| 成人一区在线观看| 麻豆一区在线观看| 欧美日韩一区二区免费视频| 国产精品污视频| 亚洲欧美激情一区| 超免费在线视频| 91久久精品国产| 精品久久中文| 日韩免费毛片视频| 成人永久看片免费视频天堂| 亚洲色图100p| 欧洲精品在线观看| 四虎影视精品成人| 日韩在线www| 午夜av成人| 久久99精品久久久久久秒播放器 | 免费不卡av网站| 中文字幕的久久| 亚洲第一在线播放| 亚洲电影免费观看高清| 成人免费看片| 国产精品三级美女白浆呻吟| 欧美精品密入口播放| 免费在线看黄色片| 国产经典欧美精品| 裸体武打性艳史| 欧美片网站yy| 日韩三级影院| 国产欧美精品一区二区三区| 成人黄色片在线观看| 日韩欧美国产麻豆| 日韩精品黄色| 国产精品精品一区二区三区午夜版| 成人av动漫| 久久综合亚洲精品| 国产在线视频精品一区| 欧美一级特黄高清视频| 欧美三级一区二区| 国产小视频福利在线| 国产不卡一区二区在线播放| 要久久电视剧全集免费| 免费观看日韩毛片| 91一区二区在线观看| 精品在线播放视频| 亚洲精品国产suv| 美女av在线免费看| 久久99精品久久久水蜜桃| 99热免费精品在线观看| 理论片大全免费理伦片| 亚洲超碰精品一区二区| 日本成人动漫在线观看| 91精品国产乱码久久久久久蜜臀| 国产精品对白久久久久粗| 欧美二区在线视频| 久久午夜羞羞影院免费观看| 一级一片免费看| 亚洲日韩中文字幕在线播放| 四虎4545www国产精品| 亚洲日本一区二区三区在线不卡| 久久国产精品免费| 91 在线视频| 欧美一二三四区在线| 人妖欧美1区| 黑人另类av| 老色鬼久久亚洲一区二区| 阿v天堂2014| 在线播放亚洲一区| 成人免费一区二区三区牛牛| 精品免费国产| 日本视频一区二区| 婷婷激情四射网| 欧美tickling挠脚心丨vk| 成人bbav| 亚洲欧洲一二三| 国产一区二区伦理| 日韩av一区二区在线播放| 亚洲精品之草原avav久久| 国产91欧美| 日韩精品一区二区免费| 久久蜜桃av一区精品变态类天堂| 国产精品第六页| 欧美美女15p| 国产99精品一区| 亚洲精品在线视频播放| 香蕉av福利精品导航| 91porn在线观看| 69堂成人精品视频免费| 羞羞视频在线观看欧美| 小嫩苞一区二区三区| 亚洲精品在线观| 久久精品国产精品亚洲毛片| 国产真实老熟女无套内射| 国产三级精品视频| www日本在线| 国产精品6699| 在线播放不卡| 香蕉久久久久久久| 亚洲精品动漫久久久久| 成人久久精品| 不卡影院一区二区| 一区二区三区四区在线| 国产精品久久久久久久龚玥菲 | 在线播放精品一区二区三区| 亚洲1区在线| 国产免费又粗又猛又爽| 精品高清一区二区三区| 成人ww免费完整版在线观看|