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

屏幕取詞的實現方法(Windows 9x)

開發 后端
屏幕取詞現在已經是廣泛應用的一個功能,但其實這個功能在Windows中的實現還是非常復雜的。本文介紹屏幕取詞的實現方法。

有關屏幕取詞

"鼠標屏幕取詞"技術是在電子字典中得到廣泛地應用的,如四通利方和金山詞霸等軟件,這個技術看似簡單,其實在windows系統中實現卻是非常復雜的,總的來說有兩種實現方式:

***種:采用截獲對部分gdi的api調用來實現,如textout,textouta等。

第二種:對每個設備上下文(dc)做一分copy,并跟蹤所有修改上下文(dc)的操作。

第二種方法更強大,但兼容性不好,而***種方法使用的截獲windowsapi的調用,這項技術的強大可能遠遠超出了您的想象,毫不夸張的說,利用 windowsapi攔截技術,你可以改造整個操作系統,事實上很多外掛式windows中文平臺就是這么實現的!而這項技術也正是這篇文章的主題。

截windowsapi的調用,具體的說來也可以分為兩種方法:

***種方法通過直接改寫winapi 在內存中的映像,嵌入匯編代碼,使之被調用時跳轉到指定的地址運行來截獲;第二種方法則改寫iat(import address table輸入地址表),重定向winapi函數的調用來實現對winapi的截獲。

***種方法的實現較為繁瑣,而且在win95、98下面更有難度,這是因為雖然微軟說win16的api只是為了兼容性才保留下來,程序員應該盡可能地調用 32位的api,實際上根本就不是這樣!win 9x內部的大部分32位api經過變換調用了同名的16位api,也就是說我們需要在攔截的函數中嵌入16位匯編代碼!

我們將要介紹的是第二種攔截方法,這種方法在win95、98和nt下面運行都比較穩定,兼容性較好。由于需要用到關于windows虛擬內存的管理、打破進程邊界墻、向應用程序的進程空間中注入代碼、pe(portable executable)文件格式和iat(輸入地址表)等較底層的知識,所以我們先對涉及到的這些知識大概地做一個介紹,***會給出攔截部分的關鍵代碼。

先說windows虛擬內存的管理。windows9x給每一個進程分配了4gb的地址空間,對于nt來說,這個數字是2gb,系統保留了2gb 到 4gb之間的地址空間禁止進程訪問,而在win9x中,2gb到4gb這部分虛擬地址空間實際上是由所有的win32進程所共享的,這部分地址空間加載了共享win32 dll、內存映射文件和vxd、內存管理器和文件系統碼,win9x中這部分對于每一個進程都是可見的,這也是win9x操作系統不夠健壯的原因。 win9x中為16位操作系統保留了0到4mb的地址空間,而在4mb到2gb之間也就是win32進程私有的地址空間,由于每個進程的地址空間都是相對獨立的,也就是說,如果程序想截獲其它進程中的api調用,就必須打破進程邊界墻,向其它的進程中注入截獲api調用的代碼,這項工作我們交給鉤子函數(setwindowshookex)來完成,關于如何創建一個包含系統鉤子的動態鏈接庫,《電腦高手雜志》在第?期已經有過專題介紹了,這里就不贅述了。所有系統鉤子的函數必須要在動態庫里,這樣的話,當進程隱式或顯式調用一個動態庫里的函數時,系統會把這個動態庫映射到這個進程的虛擬地址空間里,這使得dll成為進程的一部分,以這個進程的身份執行,使用這個進程的堆棧,也就是說動態鏈接庫中的代碼被鉤子函數注入了其它gui 進程的地址空間(非gui進程,鉤子函數就無能為力了),當包含鉤子的dll注入其它進程后,就可以取得映射到這個進程虛擬內存里的各個模塊(exe和 dll)的基地址,如:hmodule hmodule=getmodulehandle("mypro.exe");在mfc程序中,我們可以用afxgetinstancehandle() 函數來得到模塊的基地址。exe和dll被映射到虛擬內存空間的什么地方是由它們的基地址決定的。它們的基地址是在鏈接時由鏈接器決定的。當你新建一個 win32工程時,vc++鏈接器使用缺省的基地址0x00400000。可以通過鏈接器的base選項改變模塊的基地址。exe通常被映射到虛擬內存的 0x00400000處,dll也隨之有不同的基地址,通常被映射到不同進程的相同的虛擬地址空間處。

系統將exe和dll原封不動映射到虛擬內存空間中,它們在內存中的結構與磁盤上的靜態文件結構是一樣的。即pe (portable executable) 文件格式。我們得到了進程模塊的基地址以后,就可以根據pe文件的格式窮舉這個模塊的image_import_descriptor數組,看看進程空間中是否引入了我們需要截獲的函數所在的動態鏈接庫,比如需要截獲"textouta",就必須檢查"gdi32.dll"是否被引入了。說到這里,我們有必要介紹一下pe文件的格式,如右圖,這是pe文件格式的大致框圖,最前面是文件頭,我們不必理會,從pe file optional header后面開始,就是文件中各個段的說明,說明后面才是真正的段數據,而實際上我們關心的只有一個段,那就是".idata"段,這個段中包含了所有的引入函數信息,還有iat(import address table)的rva(relative virtual address)地址。

說到這里,截獲windowsapi的整個原理就要真相大白了。實際上所有進程對給定的api函數的調用總是通過pe文件的一個地方來轉移的,這就是一個該模塊(可以是exe或dll)的".idata"段中的iat輸入地址表(import address table)。在那里有所有本模塊調用的其它dll的函數名及地址。對其它dll的函數調用實際上只是跳轉到輸入地址表,由輸入地址表再跳轉到dll真正的函數入口。

具體來說,我們將通過image_import_descriptor數組來訪問".idata"段中引入的dll的信息,然后通過image_thunk_data數組來針對一個被引入的dll訪問該dll中被引入的每個函數的信息,找到我們需要截獲的函數的跳轉地址,然后改成我們自己的函數的地址……

廢話不說了,下面提供一個屏幕取詞具體的實現方法。

1. 安裝鼠標鉤子,通過鉤子函數獲得鼠標消息。

使用到的api函數:setwindowshookex

2. 得到鼠標的當前位置,向鼠標下的窗口發重畫消息,讓它調用系統函數重畫窗口。

使用到的api函數:windowfrompoint,screentoclient,invalidaterect

3. 截獲對系統函數的調用,取得參數,也就是我們要取的詞。

對于大多數的windows應用程序來說,如果要取詞,我們需要截獲的是"gdi32.dll"中的"textouta"函數。

我們先仿照textouta函數寫一個自己的mytextouta函數,如:

  1. bool winapi mytextouta(hdc hdc, int nxstart, int nystart, lpcstr lpszstring,int cbstring)   
  2. {   
  3. // 這里進行輸出lpszstring的處理   
  4. // 然后調用正版的textouta函數   
  5. }   

把這個函數放在安裝了鉤子的動態連接庫中,然后調用我們***給出的hookimportfunction函數來截獲進程對textouta函數的調用,跳轉到我們的mytextouta函數,完成對輸出字符串的捕捉。hookimportfunction的用法:

  1. hookfuncdesc hd;   
  2. proc porigfuns;   
  3. hd.szfunc="textouta";   
  4. hd.pproc=(proc)mytextouta;   
  5. hookimportfunction (afxgetinstancehandle(),"gdi32.dll",&hd,porigfuns);  

下面給出了hookimportfunction的源代碼,相信詳盡的注釋一定不會讓您覺得理解截獲到底是怎么實現的很難,ok,let s go:

  1. ///////////////////////////////////////////// begin ///////////////////////////////////////////////////////////////   
  2. #include <crtdbg.h>   
  3. // 這里定義了一個產生指針的宏   
  4. #define makeptr(cast, ptr, addvalue) (cast)((dword)(ptr)+(dword)(addvalue))   
  5. // 定義了hookfuncdesc結構,我們用這個結構作為參數傳給hookimportfunction函數   
  6. typedef struct tag_hookfuncdesc   
  7. {   
  8. lpcstr szfunc; // the name of the function to hook.   
  9. proc pproc; // the procedure to blast in.   
  10. } hookfuncdesc , * lphookfuncdesc;   
  11. // 這個函數監測當前系統是否是windownt   
  12. bool isnt();   
  13. // 這個函數得到hmodule -- 即我們需要截獲的函數所在的dll模塊的引入描述符(import descriptor)   
  14. pimage_import_descriptor getnamedimportdescriptor(hmodule hmodule, lpcstr szimportmodule);   
  15. // 我們的主函數   
  16. bool hookimportfunction(hmodule hmodule, lpcstr szimportmodule,   
  17. lphookfuncdesc pahookfunc, proc* paorigfuncs)   
  18. {   
  19. /////////////////////// 下面的代碼檢測參數的有效性 ////////////////////////////   
  20. _assert(szimportmodule);   
  21. _assert(!isbadreadptr(pahookfunc, sizeof(hookfuncdesc)));   
  22. #ifdef _debug   
  23. if (paorigfuncs) _assert(!isbadwriteptr(paorigfuncs, sizeof(proc)));   
  24. _assert(pahookfunc.szfunc);   
  25. _assert(*pahookfunc.szfunc != \0 );   
  26. _assert(!isbadcodeptr(pahookfunc.pproc));   
  27. #endif   
  28. if ((szimportmodule == null) || (isbadreadptr(pahookfunc, sizeof(hookfuncdesc))))   
  29. {   
  30. _assert(false);   
  31. setlasterrorex(error_invalid_parameter, sle_error);   
  32. return false;   
  33. }   
  34. //////////////////////////////////////////////////////////////////////////////   
  35. // 監測當前模塊是否是在2gb虛擬內存空間之上   
  36. // 這部分的地址內存是屬于win32進程共享的   
  37. if (!isnt() && ((dword)hmodule >= 0x80000000))   
  38. {   
  39. _assert(false);   
  40. setlasterrorex(error_invalid_handle, sle_error);   
  41. return false;   
  42. }   
  43. // 清零   
  44. if (paorigfuncs) memset(paorigfuncs, nullsizeof(proc));   
  45. // 調用getnamedimportdescriptor()函數,來得到hmodule -- 即我們需要   
  46. // 截獲的函數所在的dll模塊的引入描述符(import descriptor)   
  47. pimage_import_descriptor pimportdesc = getnamedimportdescriptor(hmodule, szimportmodule);   
  48. if (pimportdesc == null)   
  49. return false// 若為空,則模塊未被當前進程所引入   
  50. // 從dll模塊中得到原始的thunk信息,因為pimportdesc->firstthunk數組中的原始信息已經   
  51. // 在應用程序引入該dll時覆蓋上了所有的引入信息,所以我們需要通過取得pimportdesc->originalfirstthunk   
  52. // 指針來訪問引入函數名等信息   
  53. pimage_thunk_data porigthunk = makeptr(pimage_thunk_data, hmodule,   
  54. pimportdesc->originalfirstthunk);   
  55. // 從pimportdesc->firstthunk得到image_thunk_data數組的指針,由于這里在dll被引入時已經填充了   
  56. // 所有的引入信息,所以真正的截獲實際上正是在這里進行的   
  57. pimage_thunk_data prealthunk = makeptr(pimage_thunk_data, hmodule, pimportdesc->firstthunk);   
  58. // 窮舉image_thunk_data數組,尋找我們需要截獲的函數,這是最關鍵的部分!   
  59. while (porigthunk->u1.function)   
  60. {   
  61. // 只尋找那些按函數名而不是序號引入的函數   
  62. if (image_ordinal_flag != (porigthunk->u1.ordinal & image_ordinal_flag))   
  63. {   
  64. // 得到引入函數的函數名   
  65. pimage_import_by_name pbyname = makeptr(pimage_import_by_name, hmodule,   
  66. porigthunk->u1.addressofdata);   
  67. // 如果函數名以null開始,跳過,繼續下一個函數   
  68. if ( \0 == pbyname->name[0])   
  69. continue;   
  70. // bdohook用來檢查是否截獲成功   
  71. bool bdohook = false;   
  72. // 檢查是否當前函數是我們需要截獲的函數   
  73. if ((pahookfunc.szfunc[0] == pbyname->name[0]) &&   
  74. (strcmpi(pahookfunc.szfunc, (char*)pbyname->name) == 0))   
  75. {   
  76. // 找到了!   
  77. if (pahookfunc.pproc)   
  78. bdohook = true;   
  79. }   
  80. if (bdohook)   
  81. {   
  82. // 我們已經找到了所要截獲的函數,那么就開始動手吧   
  83. // 首先要做的是改變這一塊虛擬內存的內存保護狀態,讓我們可以自由存取   
  84. memory_basic_information mbi_thunk;   
  85. virtualquery(prealthunk, &mbi_thunk, sizeof(memory_basic_information));   
  86. _assert(virtualprotect(mbi_thunk.baseaddress, mbi_thunk.regionsize,   
  87. page_readwrite, &mbi_thunk.protect));   
  88. // 保存我們所要截獲的函數的正確跳轉地址   
  89. if (paorigfuncs)   
  90. paorigfuncs = (proc)prealthunk->u1.function;   
  91. // 將image_thunk_data數組中的函數跳轉地址改寫為我們自己的函數地址!   
  92. // 以后所有進程對這個系統函數的所有調用都將成為對我們自己編寫的函數的調用   
  93. prealthunk->u1.function = (pdword)pahookfunc.pproc;   
  94. // 操作完畢!將這一塊虛擬內存改回原來的保護狀態   
  95. dword dwoldprotect;   
  96. _assert(virtualprotect(mbi_thunk.baseaddress, mbi_thunk.regionsize,   
  97. mbi_thunk.protect, &dwoldprotect));   
  98. setlasterror(error_success);   
  99. return true;   
  100. }   
  101. }   
  102. // 訪問image_thunk_data數組中的下一個元素   
  103. porigthunk++;   
  104. prealthunk++;   
  105. }   
  106. return true;   
  107. }   
  108. // getnamedimportdescriptor函數的實現   
  109. pimage_import_descriptor getnamedimportdescriptor(hmodule hmodule, lpcstr szimportmodule)   
  110. {   
  111. // 檢測參數   
  112. _assert(szimportmodule);   
  113. _assert(hmodule);   
  114. if ((szimportmodule == null) || (hmodule == null))   
  115. {   
  116. _assert(false);   
  117. setlasterrorex(error_invalid_parameter, sle_error);   
  118. return null;   
  119. }   
  120. // 得到dos文件頭   
  121. pimage_dos_header pdosheader = (pimage_dos_header) hmodule;   
  122. // 檢測是否mz文件頭   
  123. if (isbadreadptr(pdosheader, sizeof(image_dos_header)) ||   
  124. (pdosheader->e_magic != image_dos_signature))   
  125. {   
  126. _assert(false);   
  127. setlasterrorex(error_invalid_parameter, sle_error);   
  128. return null;   
  129. }   
  130. // 取得pe文件頭   
  131. pimage_nt_headers pntheader = makeptr(pimage_nt_headers, pdosheader, pdosheader->e_lfanew);   
  132. // 檢測是否pe映像文件   
  133. if (isbadreadptr(pntheader, sizeof(image_nt_headers)) ||   
  134. (pntheader->signature != image_nt_signature))   
  135. {   
  136. _assert(false);   
  137. setlasterrorex(error_invalid_parameter, sle_error);   
  138. return null;   
  139. }   
  140. // 檢查pe文件的引入段(即 .idata section)   
  141. if (pntheader->optionalheader.datadirectory[image_directory_entry_import].virtualaddress == 0)   
  142. return null;   
  143. // 得到引入段(即 .idata section)的指針   
  144. pimage_import_descriptor pimportdesc = makeptr(pimage_import_descriptor, pdosheader,   
  145. pntheader->optionalheader.datadirectory[image_directory_entry_import].virtualaddress);   
  146. // 窮舉pimage_import_descriptor數組尋找我們需要截獲的函數所在的模塊   
  147. while (pimportdesc->name)   
  148. {   
  149. pstr szcurrmod = makeptr(pstr, pdosheader, pimportdesc->name);   
  150. if (stricmp(szcurrmod, szimportmodule) == 0)   
  151. break// 找到!中斷循環   
  152. // 下一個元素   
  153. pimportdesc++;   
  154. }   
  155. // 如果沒有找到,說明我們尋找的模塊沒有被當前的進程所引入!   
  156. if (pimportdesc->name == null)   
  157. return null;   
  158. // 返回函數所找到的模塊描述符(import descriptor)   
  159. return pimportdesc;   
  160. }   
  161. // isnt()函數的實現   
  162. bool isnt()   
  163. {   
  164. osversioninfo stosvi;   
  165. memset(&stosvi, nullsizeof(osversioninfo));   
  166. stosvi.dwosversioninfosize = sizeof(osversioninfo);   
  167. bool bret = getversionex(&stosvi);   
  168. _assert(true == bret);   
  169. if (false == bret) return false;   
  170. return (ver_platform_win32_nt == stosvi.dwplatformid);   
  171. }   

【編輯推薦】

  1. Winform中C#線程控制的四種常見情況分析
  2. C#子線程的控件操作問題解析
  3. C#線程相關問題總結:基本操作及UI控件交互
  4. 學習C#多線程:lock的用法
  5. 總結C#多線程的點點滴滴
責任編輯:yangsai 來源: CSDN論壇
相關推薦

2011-08-02 10:34:25

ActiveDirec

2017-06-12 10:16:57

2022-05-03 10:32:57

微軟Windows 11

2014-01-03 17:18:45

Windows 9開始屏幕

2009-08-27 16:24:36

C#屏幕取詞

2013-12-06 16:11:49

Windows 9概念圖

2018-05-25 14:40:17

Windows 10Windows屏幕亮度

2013-11-25 14:33:17

Windows 9概念圖

2014-02-11 11:41:45

Windows 9Windows 8

2016-12-22 09:11:24

Windows 10Windows 8Windows 7

2014-01-23 14:42:34

Windows 9

2014-08-25 15:25:04

Windows 9

2014-06-12 11:20:23

Windows 9

2013-09-29 09:06:38

Windows 9WindowsWindows Pho

2011-04-06 13:28:46

Delphi

2013-03-28 14:17:50

Windows BluWindows 8

2023-10-30 08:22:58

Android常亮Activity

2013-04-17 10:12:38

ws Phone開發處理屏幕方向改變

2014-09-29 09:25:42

Windows 9
點贊
收藏

51CTO技術棧公眾號

久久久久久一区二区三区四区别墅| 成人午夜精品福利免费| 国产精品亚洲二区| 欧美三级午夜理伦三级中视频| 亚洲一二三区在线| 在线观看免费黄色小视频| 欧美不卡视频| 国产亚洲精品一区二区| av污在线观看| 1区2区3区在线| 91免费在线看| 97av影视网在线观看| 中文字幕激情小说| 亚洲成人国产| 亚洲小视频在线观看| 26uuu国产| 亚洲校园激情春色| 亚洲综合免费观看高清在线观看| 欧美日韩一区二区三| 国产欧美日韩成人| 日本伊人色综合网| 91精品国产高清自在线| 成人无码精品1区2区3区免费看 | 国产成人精品综合| 久久久精品视频在线| 成人在线电影在线观看视频| 亚洲黄页视频免费观看| 婷婷激情5月天| 色婷婷综合久久久中字幕精品久久| 亚洲黄色小视频| 亚洲欧美一区二区原创| 欧洲亚洲精品视频| 不卡的av网站| 成人免费观看网站| 国产偷拍一区二区| 久久国产三级精品| 国产精国产精品| 超碰中文字幕在线| aa级大片欧美三级| 久久久久久国产| 538任你躁在线精品视频网站| 日韩黄色大片| 亚洲视频axxx| 精品无码国产污污污免费网站| 国产ts一区| 精品国产免费视频| 亚洲区 欧美区| www.豆豆成人网.com| 欧美特级限制片免费在线观看| 国产精品秘入口18禁麻豆免会员| 日本三级在线观看网站| 自拍偷拍国产亚洲| 中文字幕av日韩精品| 成黄免费在线| 国产精品无码永久免费888| 日本一区高清在线视频| 男操女在线观看| 久久久久久久久免费| 欧美日韩在线观看一区二区三区| 欧美高清成人| 亚洲国产精品精华液2区45| 日本在线播放不卡| 在线观看黄av| 亚洲欧美色一区| 日韩精品第1页| 日本高清成人vr专区| 亚洲免费资源在线播放| 制服丝袜综合日韩欧美| 宅男网站在线免费观看| 亚洲午夜日本在线观看| 水蜜桃色314在线观看| 手机在线观看av| 色婷婷av一区二区三区软件| 国内自拍视频网| www.91精品| 精品av久久707| 人妻熟女aⅴ一区二区三区汇编| 亚洲精品蜜桃乱晃| 最新中文字幕亚洲| 麻豆亚洲av熟女国产一区二| 精品成人久久| 国产精品91在线观看| 夜夜嗨av禁果av粉嫩avhd| 国产精品系列在线观看| 精品久久久久久一区| 国产高清自拍视频在线观看| 亚洲欧洲日产国产综合网| 激情六月天婷婷| 国模套图日韩精品一区二区| 欧美日韩国产成人在线91| 中文在线字幕观看| re久久精品视频| 欧美夫妻性生活视频| 久久中文字幕免费| 精品一区二区三区免费观看 | 亚洲成在人线免费观看| 中文字幕v亚洲ⅴv天堂| 国产亚洲自拍av| 青青草97国产精品免费观看 | 欧美一区第一页| 艳妇乳肉豪妇荡乳av| gogo大胆日本视频一区| 亚洲精品在线视频观看| 都市激情久久综合| 欧美日韩国产一级| 性久久久久久久久久| 亚洲色图网站| 国产成人精品综合| 日韩中文字幕观看| 亚洲日本欧美天堂| 免费观看成人在线视频| 91国内精品| 色婷婷成人综合| 在线观看黄网站| 国产精品资源站在线| 日韩国产美国| 精品极品在线| 日韩欧美国产不卡| 刘亦菲国产毛片bd| 丝袜诱惑制服诱惑色一区在线观看| 91老司机在线| av在线电影播放| 色偷偷成人一区二区三区91| 麻豆免费在线观看视频| 精品女同一区二区三区| 欧美午夜在线播放| 亚洲午夜av电影| 日韩 欧美 综合| 国产精品一二一区| 成人手机视频在线| 主播大秀视频在线观看一区二区| 亚洲国产精品久久精品怡红院| 亚洲欧美小视频| 老司机午夜精品| 日本在线高清视频一区| 欧美最新精品| 亚洲乱亚洲乱妇无码| 你懂的国产视频| 成人亚洲一区二区一| 水蜜桃在线免费观看| 色综合视频一区二区三区日韩 | 成人有码在线播放| 午夜免费视频在线国产| 在线观看欧美精品| 国产av自拍一区| 欧美一级二区| 欧美高清性xxxxhdvideosex| 免费成人在线电影| 日韩精品在线观看一区| 五月婷婷亚洲综合| 久久美女高清视频| 熟女少妇精品一区二区| 国精一区二区| 国产日韩在线一区| 色大18成网站www在线观看| 欧美日韩一本到| 成年人免费视频播放| 久草中文综合在线| 大片在线观看网站免费收看| 日韩在线观看中文字幕| 国产精品亚洲综合色区韩国| 久久久精品999| 国产欧美一区二区三区视频在线观看| 国产精品色婷婷| 久久久福利影院| 伊人天天综合| 欧美日韩一区二区三| 韩日精品一区| 久久成人精品视频| 空姐吹箫视频大全| 色综合咪咪久久| 成人性生交大片免费看无遮挡aⅴ| 美女精品自拍一二三四| 欧美xxxx吸乳| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 在线看的黄色网址| 午夜精品一区二区三区国产 | 日韩精品永久网址| 成人久久18免费网站图片| 欧美理论片在线播放| 精品国产三级电影在线观看| 天天操夜夜操视频| 中文字幕视频一区| 午夜免费福利影院| 日韩不卡一区二区三区| 欧美 另类 交| 日韩a级大片| 国产精品视频专区| 黄色成人在线网| 一区二区成人精品| 日本波多野结衣在线| 在线精品视频小说1| 国产va在线播放| 亚洲毛片免费看| 亚洲va欧美va国产va天堂影院| 国产黑丝一区二区| 蜜乳av一区二区| 无码专区aaaaaa免费视频| 欧美日韩中字| 国产精品视频入口| 亚洲最大的免费视频网站| 97久久伊人激情网| 韩国av网站在线| 国产视频一区在线| 不卡的日韩av| 欧美日韩在线三级| 国产污污视频在线观看| 亚洲欧美一区二区久久| 欧美18—19性高清hd4k| 成人一道本在线| 国产xxxxhd| 人人精品人人爱| 亚洲午夜精品久久久久久人妖| 亚洲老妇激情| 日韩成人av网站| 卡通动漫国产精品| 97操在线视频| 日本久久一区| 国产福利视频一区二区| 草草在线视频| 欧美黑人性猛交| 成人福利网站| 中文字幕欧美日韩精品| 日本免费不卡| 亚洲国产精品热久久| 精品国产va久久久久久久| 欧美日韩精品一区二区三区| 麻豆成人免费视频| 精品久久久一区二区| 久久久久性色av无码一区二区| 中文字幕在线不卡一区| 日本少妇xxxxx| 久久久亚洲精品石原莉奈| 人妻 日韩 欧美 综合 制服| 国产·精品毛片| 人妻体体内射精一区二区| 狠狠色狠狠色综合| 久久久久久久久久一区| 麻豆精品国产91久久久久久| 黑人粗进入欧美aaaaa| 国产婷婷精品| 一本大道熟女人妻中文字幕在线| 一区二区精品| 日批视频在线免费看| 国产欧美精品| 成年人视频网站免费观看| 国产精品毛片在线看| 国模无码视频一区二区三区| 在线午夜精品| 超碰网在线观看| 日韩精品五月天| 成人性视频欧美一区二区三区| 久久久久久久欧美精品| 九色porny91| 琪琪一区二区三区| 99日在线视频| 国产福利一区二区三区在线视频| 自拍视频第一页| 成人中文字幕合集| 中文字幕在线播放视频| 久久影院午夜片一区| 91网站免费视频| 国产精品日韩成人| 加勒比婷婷色综合久久| 亚洲一区二区三区美女| 成人免费区一区二区三区| 日韩欧美亚洲范冰冰与中字| 国产精品乱码一区二区视频| 欧美三级资源在线| a级片免费观看| 亚洲第一福利网站| 黄色软件在线| 不卡av在线网站| 国产自产自拍视频在线观看| 欧美做受高潮1| 国外成人福利视频| 国产精品yjizz| 亚洲精品亚洲人成在线观看| 亚洲精品白虎| 狠狠综合久久av一区二区老牛| 黄色一级片播放| 免费的成人av| jjzz黄色片| 国产欧美精品区一区二区三区| 午夜爽爽爽男女免费观看| 性久久久久久久| 中文字幕视频一区二区| 日韩视频免费观看高清完整版在线观看 | 成人免费黄色网| 精品伊人久久久| 亚洲电影一二三区| 精品999网站| 高清av免费看| 97精品国产露脸对白| 精品一区二区在线观看视频| 亚洲成人一二三| 一级黄色片网站| 亚洲精品一区二区三区婷婷月| 尤物视频在线免费观看| 久久免费在线观看| 国产精品诱惑| 久久久婷婷一区二区三区不卡| 国产精品久久久久无码av| 91视频 -- 69xx| 国产乱子伦视频一区二区三区| 爱爱的免费视频| 一区二区三区日韩精品| 中文字幕一区二区三区人妻四季| 欧美精品一区二区不卡| 中文字幕在线播放| 38少妇精品导航| 亚洲五码在线| 人人妻人人澡人人爽精品欧美一区| 国产精品毛片| 丝袜熟女一区二区三区| 日韩美女视频19| 亚洲一区二区视频在线播放| 日韩精品有码在线观看| 日本三级在线观看网站| 91久久嫩草影院一区二区| 精品视频免费| 国产精品无码专区av在线播放 | 欧美日韩专区在线| 日本一二三区在线视频| 久久久噜噜噜久久| 深夜激情久久| 国产人妻互换一区二区| 美国三级日本三级久久99| 亚洲av无码一区二区二三区| 亚洲图片欧美色图| www国产在线| 欧美老肥婆性猛交视频| 国产999精品在线观看| 五月婷婷一区| 蜜臀av一区二区| 成熟人妻av无码专区| 色综合天天综合网天天看片| 午夜视频www| 午夜精品久久久久久久99黑人| aiss精品大尺度系列| 日韩视频 中文字幕| 国产麻豆精品在线| 欧美又粗又大又长| 日韩三级视频中文字幕| 新版中文在线官网| 国产99在线播放| 黑人一区二区| 第四色在线视频| 大荫蒂欧美视频另类xxxx| 五月婷在线视频| 91精品国产91久久| 九色精品国产蝌蚪| 少妇高清精品毛片在线视频| 欧美韩国日本不卡| 在线观看日韩一区二区| 久久精品视频在线观看| 精品午夜av| 精品国偷自产一区二区三区| zzijzzij亚洲日本少妇熟睡| 亚洲天堂日韩av| 亚洲欧洲xxxx| 日韩欧美激情| 狠狠噜天天噜日日噜| 成人av综合一区| 99久久久久久久久| 综合网中文字幕| 日韩一区网站| 凹凸国产熟女精品视频| 中文字幕欧美日本乱码一线二线| 亚洲一区二区人妻| 欧美疯狂性受xxxxx另类| 亚州综合一区| 亚洲天堂av线| 亚洲愉拍自拍另类高清精品| 午夜一区在线观看| 国产精品久久久久久av福利软件| 久久久久久久久久久久久久久久久久 | 成人h动漫精品一区二区| 欧美啪啪小视频| 日韩性xxxx爱| 国内精品麻豆美女在线播放视频 | 丝袜美腿一区| 性做爰过程免费播放| www.视频一区| 这里只有久久精品视频| 欧美大荫蒂xxx| 深爱激情久久| 少妇丰满尤物大尺度写真| 欧美性猛交xxxx乱大交极品| 精品黄色免费中文电影在线播放| 成人在线观看av| 麻豆高清免费国产一区| 国产精品99无码一区二区| 亚洲新声在线观看| 国产精品xxx在线观看| 精品日韩久久久| 五月婷婷久久丁香| 黄色网址在线免费| 欧美午夜欧美| www.欧美.com|