青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

好久沒寫博客了, 一個月一篇還是要盡量保證,今天談下Hook技術。

在Window平臺上開發任何稍微底層一點的東西,基本上都是Hook滿天飛, 普通應用程序如此,安全軟件更是如此, 這里簡單記錄一些常用的Hook技術。

SetWindowsHookEx
基本上做Windows開發都知道這個API, 它給我們提供了一個攔截系統事件和消息的機會, 并且它可以將我們的DLL注入到其他進程。
但是隨著64位時代的到來和Vista之后的UAC機制開啟,這個API很多時候不能正常工作了:

首先,32位DLL沒法直接注入到64位的應用程序里面, 因為他們的地址空間完全不一樣的。當然盡管沒法直接注入,但是在權限范圍內,系統會盡量以消息的方式讓你能收到64位程序的消息事件。

其次,UAC打開的情況下低權限程序沒法Hook高權限程序, 實際上低權限程序以高權限程序窗口為Owner創建窗口也會失敗, 低權限程序在高權限程序窗口上模擬鼠標鍵盤也會失敗。

有人說我們可以關閉UAC, Win7下你確實可以,但是Win8下微軟已經不支持真正關閉UAC, 從這里我們也可以看到微軟技術過渡的方式, 中間會提供一個選項來讓你慢慢適應,最后再把這個選項關掉, UAC和Aero模式都是如此。

那么我們如何解決這些問題?

對于64位問題 , 解決方法是提供2個DLL,分別可以Hook32和64位程序。

對于權限問題, 解決方法是提升權限, 通過注冊系統服務, 由服務程序創建我們的工作進程。這里為什么要創建一個其他進程而不直接在服務進程里干活? 因為Vista后我們有了Session隔離機制,服務程序運行在Session 0,我們的其他程序運行在Session 1, Session 2等, 如果我們直接在服務程序里干活,我們就只能在Session 0里工作。通過創建進程,我們可以在DuplicateTokenEx后將Token的SessionID設置成目標Session,并且在CreateProcessAsUser時指定目標WinStation和Desktop, 這樣我們就既獲得了System權限,并且也可以和當前桌面進程交互了。

SetWinEventHook
很多人可能都不知道這個API, 但是這個API其實挺重要的, 看名字就知道它是Hook事件(Event)的, 具體哪些事件可以看這里.

為什么說這個API重要, 因為這個API大部分時候沒有SetWindowsHookEx的權限問題, 也就是說這個API可以讓你Hook到高權限程序的事件, 它同時支持進程內(WINEVENT_INCONTEXT)和進程外(WINEVENT_OUTOFCONTEXT)2種Hook方式, 你可以以進程外的方式Hook到64位程序的事件。

為什么這個API沒有權限問題, 因為它是給Accessibility用的, 也就是它是給自動測試和殘障工具用的, 所以它要保證有效。

我曾經看到這樣一個程序,當任何程序(無論權限高低)有窗口拖動(拖標題欄改變位置或是拖邊框改變大小), 程序都能捕獲到, 當時很好奇它是怎么做到的?
Spy了下窗口消息, 知道有這樣2個消息:WM_ENTERSIZEMOVE和WM_EXITSIZEMOVE表示進入和退出這個事件, 但是那也只能獲得自己的消息,其他程序的消息它是如何捕獲到的?當時懷疑用的是Hook, 卻發現沒有DLL注入。查遍了Windows API 也沒有發現有API可以查詢一個窗口是否在這個拖動狀態。最后發現用的是SetWinEventHookEVENT_SYSTEM_MOVESIZESTART和EVENT_SYSTEM_MOVESIZEEND。

API Hook
常見的API Hook包括2種, 一種是基于PE文件的導入表(IAT), 還有一種是修改前5個字節直接JMP的inline Hook.

對于基于IAT的方式, 原理是PE文件里有個導入表, 代表該模塊調用了哪些外部API,模塊被加載到內存后, PE加載器會修改該表,地址改成外部API重定位后的真實地址, 我們只要直接把里面的地址改成我們新函數的地址, 就可以完成對相應API的Hook?!禬indows核心編程》里第22章有個封裝挺好的CAPIHook類,我們可以直接拿來用。
我曾經用API Hook來實現自動測試,見這里 API Hook在TA中的應用

對于基于Jmp方式的inline hook, 原理是修改目標函數的前5個字節, 直接Jmp到我們的新函數。雖然原理挺簡單, 但是因為用到了平臺相關的匯編代碼, 一般人很難寫穩定。真正在項目中用還是要求穩定, 所以我們一般用微軟封裝好的Detours, 對于Detours的原理,這里有篇不錯的文章 微軟研究院Detour開發包之API攔截技術。

比較一下2種方式: 
IAT的方式比較安全簡單, 但是只適用于Hook導入函數方式的API。
Inline Hook相對來說復雜點, 但是它能Hook到任何函數(API和內部函數),但是它要求目標函數大于5字節, 同時把握好修改時機或是Freeze其他線程, 因為多線程中改寫可能會引起沖突。

還有一種是Hook被調用模塊的導出表(EAT), 但是感覺一般用得用的不多。原理是調用模塊里IAT中的函數地址是通過被調用模塊的EAT獲取的, 所以你只要修改了被調用模塊的EAT中的函數地址,對方的調用就自然被你Hook了。但是這里有個時機問題, 就是你替換EAT表要足夠早,要在IAT使用它之前才行。但是感覺這個行為是由PE加載器決定的, 一般人很難干涉, 不知道大家有什么好方法? 

我們一般可以將IAT Hook和EAT Hook結合起來使用, 先枚舉所有模塊Hook IAT,這樣當前已有模塊的API都被你Hook了,然后再Hook EAT, 這樣后續的模塊也被你Hook了(因為要通過EAT獲取函數地址)。 

如果你只用Hook IAT而不Hook EAT, 當有新模塊加載時,你要Hook它的IAT, 所以你就要Hook LoadLibrary(Ex)和GetProcAddress來攔截新模塊的加載。所以理論上感覺 Hook EAT不是很有必要, 因為單用Hook IAT已經可以解決我們所有的問題了, HOOK IAT還有一種優勢是我們可以過濾某個模塊不Hook,而一旦hook EAT, 它就會影響我們所有調用該函數的模塊。

COM Hook
Window上因為有很多開發包是以COM方式提供的(比如DirectX), 所以我們就有了攔截COM調用的COM Hook。
因為COM里面很關鍵的是它的接口是C++里虛表的形式提供的, 所以COM的Hook很多是時候其實就是虛表(vtable)的Hook。
關于C++ 對象模型和虛表可以看我這篇 探索C++對象模型

對于COMHook,考慮下面2種case:

一種是我們Hook程序先運行,然后啟動某個游戲程序(DirectX 9), 我們想Hook游戲的繪畫內容。

這種方式下, 我們可以先Hook API Direct3DCreate9, 然后我們繼承于IDirect3D9, 自己實現一個COM對象返回回去, 這樣我們就可以攔截到所有對該對象的操作,為所欲為了, 當然我們自己現實的COM對象內部會調用真正的Direct3DCreate9,封裝真正的IDirect3D9。

當然有時我們可能不用替代整個COM組件,我們只需要修改其中一個或幾個COM函數, 這種情況下我們可以創建真正的IDirect3D9對象后直接修改它的虛表, 把其中某些函數改成我們自己的函數地址就可以了。

其實ATL就是用接口替代的方式來調試和記錄COM接口引用計數的次數, 具體可以看我這篇 理解ATL中的一些匯編代碼

還有一種case是游戲程序已經在運行了, 然后才啟動我們的Hook進程, 我們怎么樣才能Hook到里面的內容?

這種情況下我們首先要對程序內存有比較詳細的認識, 才能思考創建出來的D3D對象的虛表位置, 從而進行Hook, 關于程序內存布局,可見我這篇 理解程序內存。

理論上說COM對象如果是以C++接口的方式實現, 虛表會位于PE文件的只讀數據節(.rdata), 并且所有該類型的對象都共享該虛表, 所以我們只要創建一個該類型對象,我們就可以獲得其他人創建的該類型對象的虛表位置,我們就可以改寫該虛表實現Hook(實際操作時需要通過VirtualProtect修改頁面的只讀屬性才能寫入)。

但是實際上COM的虛表只是一塊內存, 它并不一定是以C++實現, 所以它可以存在于任何內存的任何地方。另外對象的虛表也不一定是所有同類型的對象共享同一虛表, 我們完全可以每個對象都有自己的一份虛表。比如我發現IDirect3D9是大家共享同一虛表的(存在D3D9.dll), 但是IDirect3DDevice9就是每個對象都有自己的虛表了(存在于堆heap)。所以如果你要Hook IDirect3DDevice9接口,通過修改虛表實際上沒法實現。

但是盡管有時每個對象的虛表不一樣,同類型對象虛表里的函數地址卻都是一樣的, 所以這種情況下我們可以通過inline Hook直接修改函數代碼。當然有些情況下如果是靜態鏈接庫,即使函數代碼也是每個模塊都有自己的一份, 這種情況下就只能反匯編獲取虛表和函數的地址了。

最后,總結一下, 上面主要探討了Windows上的各種Hook技術,通過將這些Hook技術組起來, 可以實現很多意想不到的功能, 比如我們完全可以通過Hook D3D實現Win7任務欄那種Thumbnail預覽的效果(當然該效果可以直接由DWM API實現, 但是如果我們可以通過HOOK以動畫的方式實現是不是更有趣 )。
posted on 2013-10-30 11:03 Richard Wei 閱讀(30298) 評論(13)  編輯 收藏 引用 所屬分類: windows desktop

FeedBack:
# re: HOOK技術的一些簡單總結
2013-10-30 20:58 | zgpxgame
mark  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2013-10-30 21:04 | StarsunYzL
總結的不錯,API Hook還可以加一個EAT Hook。但是要是程序加了殼,IAT/EAT Hook通常就會失效,因為導入/導出表已被加密,所以最通用的還是Inline Hook,同時也是最復雜的,主要是要修正包含相對地址的指令。  回復  更多評論
  
# re: HOOK技術的一些簡單總結[未登錄]
2013-10-31 10:16 | 春秋十二月
搞windows技術,就是要讓你不斷跟著微軟跑,兼容性是個很大的問題  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2013-10-31 10:34 | Richard Wei
@StarsunYzL
已經加上, 如有不正確的地方,歡迎指正.  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2013-10-31 16:38 | Richard Wei
@春秋十二月
同意,相對Unix/Linux的穩定, Windows開發要累得多  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2013-11-09 16:30 | 紅色代碼
好文.再可以加上SSDT HOOK等驅動級的文章,就更全面了  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2014-02-07 15:42 | allen
“ 但是IDirect3DDevice9就是每個對象都有自己的虛表了(存在于堆heap)。所以如果你要Hook IDirect3DDevice9接口,通過修改虛表實際上沒法實現?!?br>
這個說法是錯誤的,只要是C++對象,虛表都只會存在一份。  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2014-02-07 16:13 | Richard Wei
@allen
嗯, 單看這句話確實是錯的, 但是你要結合我的上下文來看。
我的意思是你這里修改IDirect3DDevice9的虛表內容, 修改的也僅是你當前對象的, 而不會影響其他IDirect3DDevice9對象, 因為他們不是所有對象共享同一虛表的, 但是同一標準C++類的所有對象會共享同一虛表。  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2014-05-27 19:06 | allen
@Richard Wei
這也錯了,我hook過IDirect3DDevice9的虛表函數,按你的說法我去hook這個借口完全無作用無意義,因為修改的都是自己的表,不會影響其它的IDirect3DDevice9。但實際上,IDirect3DDevice9只有一個虛函數表,對某個對象的虛函數表進行修改則影響所有的對象。  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2014-05-27 19:57 | Richard Wei
@allen
剛才有簡單測試了下, 測試代碼如下:
D3DPRESENT_PARAMETERS ps = {0};
ps.Windowed = TRUE;
ps.SwapEffect = D3DSWAPEFFECT_DISCARD;
ps.BackBufferFormat = D3DFMT_UNKNOWN;

pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL
, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &ps, &g_pD3dDevice);
if(g_pD3dDevice == NULL) break;


LPDIRECT3DDEVICE9 pNewD3dDevice = NULL;
pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL
, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &ps, &pNewD3dDevice);

創建了2個IDirect3DDevice9對象, 然后分別打印它們的虛表指針和內容:

0:000> ?? g_pD3dDevice
struct IDirect3DDevice9 * 0x02815c00
+0x000 __VFN_table : 0x0281899c
0:000> ?? pNewD3dDevice
struct IDirect3DDevice9 * 0x0241bfe0
+0x000 __VFN_table : 0x0241ed7c
0:000> dps 0x0281899c
0281899c 6fe56f19 d3d9!CBaseDevice::QueryInterface
028189a0 6fe56992 d3d9!CBaseDevice::AddRef
028189a4 6fe56969 d3d9!CBaseDevice::Release
028189a8 6fe72587 d3d9!CBaseDevice::TestCooperativeLevel
028189ac 6ff0c6ad d3d9!CBaseDevice::GetAvailableTextureMem
028189b0 6ff49c8f d3d9!CD3DBase::EvictManagedResources
028189b4 6fe6b1c5 d3d9!CBaseDevice::GetDirect3D
028189b8 6fe56ff8 d3d9!CBaseDevice::GetDeviceCaps
028189bc 6fe8d144 d3d9!CBaseDevice::GetDisplayMode
028189c0 6fe7084e d3d9!CBaseDevice::GetCreationParameters
028189c4 6ff0bb74 d3d9!CBaseDevice::SetCursorProperties
028189c8 6ff0c04d d3d9!CBaseDevice::SetCursorPosition
028189cc 6fe8def0 d3d9!CBaseDevice::ShowCursor
028189d0 6fe6e9a0 d3d9!CBaseDevice::CreateAdditionalSwapChain
028189d4 6fe69ac7 d3d9!CBaseDevice::GetSwapChain
028189d8 6fe993ca d3d9!CBaseDevice::GetNumberOfSwapChains
028189dc 6feaf251 d3d9!CBaseDevice::Reset
028189e0 6fe9a064 d3d9!CBaseDevice::Present
028189e4 6feb1418 d3d9!CBaseDevice::GetBackBuffer
028189e8 6fe6bfe9 d3d9!CBaseDevice::GetRasterStatus
028189ec 6ff0c139 d3d9!CBaseDevice::SetDialogBoxMode
028189f0 6ff0c3bf d3d9!CBaseDevice::SetGammaRamp
028189f4 6ff0c4fd d3d9!CBaseDevice::GetGammaRamp
028189f8 6fe85ddb d3d9!CBaseDevice::CreateTexture
028189fc 6ff0ca68 d3d9!CBaseDevice::CreateVolumeTexture
02818a00 6feacb2d d3d9!CBaseDevice::CreateCubeTexture
02818a04 6fe72d69 d3d9!CBaseDevice::CreateVertexBuffer
02818a08 6fe732e6 d3d9!CBaseDevice::CreateIndexBuffer
02818a0c 6fea0127 d3d9!CBaseDevice::CreateRenderTarget
02818a10 6ff0cd88 d3d9!CBaseDevice::CreateDepthStencilSurface
02818a14 6ff0e0e0 d3d9!CBaseDevice::UpdateSurface
02818a18 6fe846ab d3d9!CBaseDevice::UpdateTexture
0:000> dps 0x0241ed7c
0241ed7c 6fe56f19 d3d9!CBaseDevice::QueryInterface
0241ed80 6fe56992 d3d9!CBaseDevice::AddRef
0241ed84 6fe56969 d3d9!CBaseDevice::Release
0241ed88 6fe72587 d3d9!CBaseDevice::TestCooperativeLevel
0241ed8c 6ff0c6ad d3d9!CBaseDevice::GetAvailableTextureMem
0241ed90 6ff49c8f d3d9!CD3DBase::EvictManagedResources
0241ed94 6fe6b1c5 d3d9!CBaseDevice::GetDirect3D
0241ed98 6fe56ff8 d3d9!CBaseDevice::GetDeviceCaps
0241ed9c 6fe8d144 d3d9!CBaseDevice::GetDisplayMode
0241eda0 6fe7084e d3d9!CBaseDevice::GetCreationParameters
0241eda4 6ff0bb74 d3d9!CBaseDevice::SetCursorProperties
0241eda8 6ff0c04d d3d9!CBaseDevice::SetCursorPosition
0241edac 6fe8def0 d3d9!CBaseDevice::ShowCursor
0241edb0 6fe6e9a0 d3d9!CBaseDevice::CreateAdditionalSwapChain
0241edb4 6fe69ac7 d3d9!CBaseDevice::GetSwapChain
0241edb8 6fe993ca d3d9!CBaseDevice::GetNumberOfSwapChains
0241edbc 6feaf251 d3d9!CBaseDevice::Reset
0241edc0 6fe9a064 d3d9!CBaseDevice::Present
0241edc4 6feb1418 d3d9!CBaseDevice::GetBackBuffer
0241edc8 6fe6bfe9 d3d9!CBaseDevice::GetRasterStatus
0241edcc 6ff0c139 d3d9!CBaseDevice::SetDialogBoxMode
0241edd0 6ff0c3bf d3d9!CBaseDevice::SetGammaRamp
0241edd4 6ff0c4fd d3d9!CBaseDevice::GetGammaRamp
0241edd8 6fe85ddb d3d9!CBaseDevice::CreateTexture
0241eddc 6ff0ca68 d3d9!CBaseDevice::CreateVolumeTexture
0241ede0 6feacb2d d3d9!CBaseDevice::CreateCubeTexture
0241ede4 6fe72d69 d3d9!CBaseDevice::CreateVertexBuffer
0241ede8 6fe732e6 d3d9!CBaseDevice::CreateIndexBuffer
0241edec 6fea0127 d3d9!CBaseDevice::CreateRenderTarget
0241edf0 6ff0cd88 d3d9!CBaseDevice::CreateDepthStencilSurface
0241edf4 6ff0e0e0 d3d9!CBaseDevice::UpdateSurface
0241edf8 6fe846ab d3d9!CBaseDevice::UpdateTexture

可以看到g_pD3dDevice的虛表地址是0x0281899c, pNewD3dDevice的虛表地址是0x0241ed7c,他們各自擁有自己虛表,盡管虛表里的內容是一樣。如果你改變第一個對象的虛表內容,理論上不會影響第二個對象。  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2014-06-23 14:36 | allen
@Richard Wei

哦,之前理解錯了。
應該說,我hook的不是虛表,而是hook的虛表里面函數指針指向的函數。  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2016-08-18 20:09 | 陳利敏
博主,我現在遇到一個問題,對于不同游戲,有的能Hook到createdevice函數,進入自定義的createdevice函數,但是有的游戲不行,不知道博主有沒有遇到過,能否給予幫助,我的代碼來源http://bbs.pediy.com/showthread.php?t=85368  回復  更多評論
  
# re: HOOK技術的一些簡單總結
2016-08-19 12:23 | Richard Wei
@陳利敏
可以用先用API Monitor 或者WinDbg的API斷點看看對方程序是如何工作的  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品爱啪在线线免费观看| 亚洲性感激情| 欧美v亚洲v综合ⅴ国产v| 国产亚洲欧美日韩一区二区| 久久精品一区| 久久久久久一区二区三区| 伊人久久大香线| 欧美国产一区二区在线观看| 欧美黄色免费网站| 亚洲图片欧洲图片日韩av| 亚洲天堂网站在线观看视频| 国产欧美日韩精品丝袜高跟鞋| 午夜视频久久久久久| 欧美亚洲综合网| 亚洲福利国产| 日韩亚洲不卡在线| 国产亚洲精品成人av久久ww| 免费日本视频一区| 欧美日韩一级黄| 欧美在线观看你懂的| 牛牛精品成人免费视频| 亚洲一品av免费观看| 午夜精品亚洲| 日韩视频在线观看免费| 亚洲一区二区三区影院| 亚洲第一在线综合网站| 一区二区三区www| 国产综合第一页| 亚洲激情欧美激情| 亚洲欧美清纯在线制服| 亚洲高清不卡一区| 正在播放欧美一区| 在线观看视频一区二区欧美日韩| 亚洲精品在线三区| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美日韩中文在线| 久久亚洲精品网站| 欧美日韩影院| 麻豆亚洲精品| 国产精品网红福利| 亚洲精品偷拍| 亚洲成色777777在线观看影院| 一区二区三区四区国产| 亚洲日本激情| 久久精品99| 欧美一二三区精品| 国产精品高潮呻吟久久av黑人| 久久综合久色欧美综合狠狠| 国产精品wwwwww| 日韩午夜在线| 亚洲精品乱码久久久久久按摩观 | 一本色道久久综合狠狠躁篇的优点| 国产亚洲毛片在线| 亚洲综合色丁香婷婷六月图片| 国产精品99久久久久久久女警| 欧美成人免费全部| 蜜臀91精品一区二区三区| 国产日韩一区二区三区在线| 一区二区三区国产在线| 在线性视频日韩欧美| 欧美顶级大胆免费视频| 欧美激情视频在线免费观看 欧美视频免费一 | 午夜精品一区二区在线观看| 欧美日韩国产系列| 亚洲人成免费| 亚洲精品欧美一区二区三区| 久久欧美中文字幕| 麻豆成人综合网| 亚洲第一精品电影| 免费久久99精品国产自在现线| 猛干欧美女孩| 亚洲国产精品va在线看黑人动漫| 久久嫩草精品久久久精品一| 欧美二区在线播放| 亚洲精品字幕| 国产精品久久久久久妇女6080 | 午夜免费日韩视频| 久久久水蜜桃| 欧美14一18处毛片| 亚洲日本电影在线| 亚洲自拍啪啪| 国产日产精品一区二区三区四区的观看方式| 一区二区三区欧美在线| 性色av一区二区三区在线观看 | 国产综合久久久久久鬼色| 久久久亚洲国产天美传媒修理工| 久久久91精品| 欧美区一区二| 亚洲性感美女99在线| 亚洲欧美在线网| 国产欧美精品在线| 亚洲欧美日韩综合aⅴ视频| 久久综合色天天久久综合图片| 狠狠色狠狠色综合人人| 久久这里有精品视频| 亚洲国产精品成人久久综合一区| 亚洲精品在线三区| 欧美三日本三级少妇三99| 性欧美长视频| 农夫在线精品视频免费观看| 亚洲日本激情| 国产精品免费网站在线观看| 欧美一区二区三区在线| 每日更新成人在线视频| 国产精品萝li| 农村妇女精品| 亚洲午夜电影| 美女在线一区二区| 一区二区三区.www| 国产精品中文在线| 久久一区二区精品| 亚洲欧美国产日韩中文字幕| 六月婷婷久久| 亚洲一区二区三区成人在线视频精品| 国产精品亚洲综合色区韩国| 久久嫩草精品久久久久| 在线视频你懂得一区二区三区| 欧美专区在线观看一区| 91久久国产自产拍夜夜嗨| 欧美四级在线| 免费试看一区| 亚洲欧美久久久| 最新中文字幕亚洲| 国产精品99久久久久久久女警| 亚洲成色777777在线观看影院| 欧美视频在线播放| 久久久视频精品| 国产精品99久久久久久久久| 麻豆91精品91久久久的内涵| 亚洲五月六月| 亚洲国产精品一区二区第一页 | 亚洲午夜羞羞片| 亚洲国产福利在线| 欧美一级视频免费在线观看| 日韩一区二区电影网| 伊人影院久久| 欧美精品色一区二区三区| 免费成人av资源网| 欧美永久精品| 亚洲欧美精品中文字幕在线| 亚洲精品免费看| 亚洲国产成人精品久久久国产成人一区| 一区二区三区高清视频在线观看| 亚洲欧洲精品一区二区三区不卡 | 欧美精品色网| 亚洲精品中文在线| 久久精品欧美日韩| 久久久久久伊人| 欧美在线视频免费观看| 亚洲欧美日韩直播| 亚洲一区二区三区视频播放| 亚洲欧洲日韩在线| 国产亚洲精品bt天堂精选| 国产主播喷水一区二区| 国产一区二区欧美日韩| 欧美色图天堂网| 欧美不卡激情三级在线观看| 欧美一进一出视频| 欧美在线free| 久久国产精品第一页| 久久青草欧美一区二区三区| 久久久www成人免费无遮挡大片| 久久精品欧洲| 久久久国产91| 美女91精品| 久久夜色精品亚洲噜噜国产mv| 欧美成人中文| 欧美日韩大片| 国产精品久久久久久久久久三级| 国产精品xxxav免费视频| 国产精品久久久久久亚洲调教| 国产日韩欧美夫妻视频在线观看| 国产午夜精品久久久久久久| 国产在线成人| 亚洲国产日本| 亚洲图片欧美一区| 欧美一区二区三区精品| 欧美激情在线观看| 亚洲最新色图| 小辣椒精品导航| 美女精品网站| 欧美日韩一区自拍| 影音先锋中文字幕一区二区| 亚洲精品国产精品国自产观看浪潮 | 性欧美video另类hd性玩具| 亚洲欧美日韩精品一区二区 | 亚洲精品乱码久久久久久蜜桃91| 亚洲毛片播放| 久久免费少妇高潮久久精品99| 欧美国产视频一区二区| 国产精品扒开腿做爽爽爽视频| 韩日午夜在线资源一区二区| 亚洲精品国精品久久99热| 亚洲一二三区精品| 久久久一二三| 亚洲乱码日产精品bd| 先锋影音一区二区三区| 欧美aaa级| 国产夜色精品一区二区av| 亚洲一区二区三区四区五区午夜|