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

道。道。道

安全特性不等于安全的特性

   :: 首頁 :: 聯系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評論

“鼠標屏幕取詞”技術是在電子字典中得到廣泛地應用的,如四通利方和金山詞霸等軟件,這個技術看似簡單,其實在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中被引入的每個函數的信息,找到我們需要截獲的函數的跳轉地址,然后改成我們自己的函數的地址……具體的做法在后面的關鍵代碼中會有詳細的講解。
?? 講了這么多原理,現在讓我們回到“鼠標屏幕取詞”的專題上來。除了API函數的截獲,要實現“鼠標屏幕取詞”,還需要做一些其它的工作,簡單的說來,可以把一個完整的取詞過程歸納成以下幾個步驟:
1. 安裝鼠標鉤子,通過鉤子函數獲得鼠標消息。
使用到的API函數:SetWindowsHookEx
2. 得到鼠標的當前位置,向鼠標下的窗口發重畫消息,讓它調用系統函數重畫窗口。
???? 使用到的API函數:WindowFromPoint,ScreenToClient,InvalidateRect
3. 截獲對系統函數的調用,取得參數,也就是我們要取的詞。
對于大多數的Windows應用程序來說,如果要取詞,我們需要截獲的是“Gdi32.dll”中的“TextOutA”函數。
我們先仿照TextOutA函數寫一個自己的MyTextOutA函數,如:
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
?????? // 這里進行輸出lpszString的處理
?????????? // 然后調用正版的TextOutA函數
}
把這個函數放在安裝了鉤子的動態連接庫中,然后調用我們最后給出的HookImportFunction函數來截獲進程
對TextOutA函數的調用,跳轉到我們的MyTextOutA函數,完成對輸出字符串的捕捉。HookImportFunction的
用法:
?HOOKFUNCDESC hd;
?PROC???????? pOrigFuns;
?hd.szFunc="TextOutA";
?hd.pProc=(PROC)MyTextOutA;
?HookImportFunction (AfxGetInstanceHandle(),"gdi32.dll",&hd,pOrigFuns);

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

///////////////////////////////////////////// Begin ///////////////////////////////////////////////////////////////
#include <crtdbg.h>

// 這里定義了一個產生指針的宏
#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))

// 定義了HOOKFUNCDESC結構,我們用這個結構作為參數傳給HookImportFunction函數
typedef struct tag_HOOKFUNCDESC
{
? LPCSTR szFunc; // The name of the function to hook.
? PROC pProc;??? // The procedure to blast in.
} HOOKFUNCDESC , * LPHOOKFUNCDESC;

// 這個函數監測當前系統是否是WindowNT
BOOL IsNT();

// 這個函數得到hModule -- 即我們需要截獲的函數所在的DLL模塊的引入描述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule);

// 我們的主函數
BOOL HookImportFunction(HMODULE hModule, LPCSTR szImportModule,
???????????????????????? LPHOOKFUNCDESC paHookFunc, PROC* paOrigFuncs)
{
/////////////////////// 下面的代碼檢測參數的有效性 ////////////////////////////
?_ASSERT(szImportModule);
?_ASSERT(!IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC)));
#ifdef _DEBUG
?if (paOrigFuncs) _ASSERT(!IsBadWritePtr(paOrigFuncs, sizeof(PROC)));
?_ASSERT(paHookFunc.szFunc);
?_ASSERT(*paHookFunc.szFunc != '\0');
??????? _ASSERT(!IsBadCodePtr(paHookFunc.pProc));
#endif
?if ((szImportModule == NULL) || (IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC))))
?{
??_ASSERT(FALSE);
??SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
??return FALSE;
?}
//////////////////////////////////////////////////////////////////////////////

?// 監測當前模塊是否是在2GB虛擬內存空間之上
?// 這部分的地址內存是屬于Win32進程共享的
?if (!IsNT() && ((DWORD)hModule >= 0x80000000))
?{
??_ASSERT(FALSE);
??SetLastErrorEx(ERROR_INVALID_HANDLE, SLE_ERROR);
??return FALSE;
?}
??? ?// 清零
?if (paOrigFuncs) memset(paOrigFuncs, NULL, sizeof(PROC));

?// 調用GetNamedImportDescriptor()函數,來得到hModule -- 即我們需要
?// 截獲的函數所在的DLL模塊的引入描述符(import descriptor)
?PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hModule, szImportModule);
?if (pImportDesc == NULL)
?return FALSE; // 若為空,則模塊未被當前進程所引入

?//? 從DLL模塊中得到原始的THUNK信息,因為pImportDesc->FirstThunk數組中的原始信息已經
?//? 在應用程序引入該DLL時覆蓋上了所有的引入信息,所以我們需要通過取得pImportDesc->OriginalFirstThunk
?//? 指針來訪問引入函數名等信息
?PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hModule,
?????????????????????????????????????????????? pImportDesc->OriginalFirstThunk);

?

?//? 從pImportDesc->FirstThunk得到IMAGE_THUNK_DATA數組的指針,由于這里在DLL被引入時已經填充了
?//? 所有的引入信息,所以真正的截獲實際上正是在這里進行的
?PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, pImportDesc->FirstThunk);

?//? 窮舉IMAGE_THUNK_DATA數組,尋找我們需要截獲的函數,這是最關鍵的部分!
?while (pOrigThunk->u1.Function)
?{
??// 只尋找那些按函數名而不是序號引入的函數
??if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG))
??{
???// 得到引入函數的函數名
???PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hModule,
?????????????? pOrigThunk->u1.AddressOfData);

???// 如果函數名以NULL開始,跳過,繼續下一個函數??
???if ('\0' == pByName->Name[0])
????continue;

???// bDoHook用來檢查是否截獲成功
???BOOL bDoHook = FALSE;

???// 檢查是否當前函數是我們需要截獲的函數
???if ((paHookFunc.szFunc[0] == pByName->Name[0]) &&
????(strcmpi(paHookFunc.szFunc, (char*)pByName->Name) == 0))
???{
????// 找到了!
????if (paHookFunc.pProc)
????bDoHook = TRUE;
???}
???if (bDoHook)
???{
????// 我們已經找到了所要截獲的函數,那么就開始動手吧
????// 首先要做的是改變這一塊虛擬內存的內存保護狀態,讓我們可以自由存取
????MEMORY_BASIC_INFORMATION mbi_thunk;
????VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
????_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
??????????????????????? PAGE_READWRITE, &mbi_thunk.Protect));

????// 保存我們所要截獲的函數的正確跳轉地址
????if (paOrigFuncs)
????? paOrigFuncs = (PROC)pRealThunk->u1.Function;

????// 將IMAGE_THUNK_DATA數組中的函數跳轉地址改寫為我們自己的函數地址!
????// 以后所有進程對這個系統函數的所有調用都將成為對我們自己編寫的函數的調用
????pRealThunk->u1.Function = (PDWORD)paHookFunc.pProc;

????// 操作完畢!將這一塊虛擬內存改回原來的保護狀態
????DWORD dwOldProtect;
????_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
??????????????????????? mbi_thunk.Protect, &dwOldProtect));
????SetLastError(ERROR_SUCCESS);
????return TRUE;
???}

??}
??// 訪問IMAGE_THUNK_DATA數組中的下一個元素
??pOrigThunk++;
??pRealThunk++;
?}
?return TRUE;
}

// GetNamedImportDescriptor函數的實現
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule)
{
?// 檢測參數
?_ASSERT(szImportModule);
?_ASSERT(hModule);
?if ((szImportModule == NULL) || (hModule == NULL))
?{
??_ASSERT(FALSE);
??SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
??return NULL;
?}

?// 得到Dos文件頭
?PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule;

?// 檢測是否MZ文件頭
?if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) ||
??(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE))
?{
??_ASSERT(FALSE);
??SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
??return NULL;
?}

?// 取得PE文件頭
?PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);

?// 檢測是否PE映像文件
?if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
?? (pNTHeader->Signature != IMAGE_NT_SIGNATURE))
?{
??_ASSERT(FALSE);
??SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
??return NULL;
?}

?// 檢查PE文件的引入段(即 .idata section)
?if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
??return NULL;

?// 得到引入段(即 .idata section)的指針
?PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader,
??pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

?// 窮舉PIMAGE_IMPORT_DESCRIPTOR數組尋找我們需要截獲的函數所在的模塊
?while (pImportDesc->Name)
?{
??PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);
??if (stricmp(szCurrMod, szImportModule) == 0)
????? break; // 找到!中斷循環
??// 下一個元素
??pImportDesc++;
?}

?// 如果沒有找到,說明我們尋找的模塊沒有被當前的進程所引入!
?if (pImportDesc->Name == NULL)
??return NULL;

?// 返回函數所找到的模塊描述符(import descriptor)
?return pImportDesc;
}

// IsNT()函數的實現
BOOL IsNT()
{
?OSVERSIONINFO stOSVI;
?memset(&stOSVI, NULL, sizeof(OSVERSIONINFO));
?stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
?BOOL bRet = GetVersionEx(&stOSVI);
?_ASSERT(TRUE == bRet);
?if (FALSE == bRet) return FALSE;
?return (VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId);
}
/////////////////////////////////////////////// End //////////////////////////////////////////////////////////////////////

?? 不知道在這篇文章問世之前,有多少朋友嘗試過去實現“鼠標屏幕取詞”這項充滿了挑戰的技術,也只有嘗試過的朋友才能體會到其間的不易,尤其在探索API函數的截獲時,手頭的幾篇資料沒有一篇是涉及到關鍵代碼的,重要的地方都是一筆代過,MSDN更是顯得蒼白而無力,也不知道除了IMAGE_IMPORT_DESCRIPTOR和IMAGE_THUNK_DATA,微軟還隱藏了多少秘密,好在硬著頭皮還是把它給攻克了,希望這篇文章對大家能有所幫助。

posted on 2007-02-28 20:44 獨孤九劍 閱讀(1738) 評論(0)  編輯 收藏 引用 所屬分類: Win32Visual C++ 8.0
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情一区二区三区在线视频| 久久国产视频网| 国产精品欧美日韩一区二区| 久久精品国产亚洲aⅴ| 欧美片在线观看| 欧美激情偷拍| 亚洲第一成人在线| 亚洲图片欧美日产| 午夜精品久久久久久久99水蜜桃 | 国产精品一香蕉国产线看观看| 免费成人黄色| 亚洲国产91色在线| 欧美精品1区2区3区| 一区二区三区久久久| 亚洲欧美激情四射在线日| 欧美日韩在线视频一区二区| 亚洲精品久久嫩草网站秘色 | 99热这里只有精品8| 久久国产视频网站| 一本大道久久a久久综合婷婷 | 99国产一区| 久久国产精品一区二区三区| 亚洲国产欧美国产综合一区| 国产精品人人爽人人做我的可爱| 久久精品欧美日韩| 亚洲精品在线观看免费| 噜噜噜噜噜久久久久久91| 亚洲一区二区精品| 影视先锋久久| av成人免费| 亚洲欧洲精品一区| 久久gogo国模裸体人体| 亚洲一区二区在| 一区二区三区国产精品| 日韩亚洲欧美在线观看| 亚洲国产高潮在线观看| 国内精品久久久久久久影视麻豆 | 亚洲三级影片| 亚洲国产精品第一区二区| 久久久久这里只有精品| 久久久久www| 美日韩精品免费| 欧美韩日视频| 国产精品日韩欧美一区| 国产精品一区二区三区久久久| 国产精品国产三级国产aⅴ入口| 欧美日韩精品三区| 国产精品素人视频| 国内激情久久| 99re热精品| 久久国产精品久久久久久电车| 国产精品一区二区男女羞羞无遮挡| 欧美日韩不卡| 狠狠狠色丁香婷婷综合激情| 亚洲精品1234| 午夜精品在线观看| 亚洲黄色精品| 亚洲一区三区电影在线观看| 久久久久久一区| 欧美亚洲第一页| 亚洲激情中文1区| 欧美在线观看视频| 亚洲精品小视频在线观看| 久久久久久久91| 国产精品久久久久久久久久三级| 久久久xxx| 欧美日韩午夜在线| …久久精品99久久香蕉国产 | 国产精品日日摸夜夜添夜夜av| 亚洲国产女人aaa毛片在线| 欧美一区二区三区视频在线| 亚洲日本黄色| 欧美—级a级欧美特级ar全黄| 黑人中文字幕一区二区三区| 午夜老司机精品| 亚洲欧美怡红院| 国产精品一区免费在线观看| 亚洲永久免费视频| 亚洲视频精品| 国产麻豆成人精品| 久久免费的精品国产v∧| 久久精品人人做人人爽| 精品1区2区| 亚洲国产精品第一区二区| 欧美激情一区二区久久久| 日韩午夜电影av| 日韩视频―中文字幕| 国产精品久久久久久久7电影| 亚洲欧美制服中文字幕| 午夜在线电影亚洲一区| 国产一二三精品| 亚洲国产另类久久精品| 亚洲视频 欧洲视频| 亚洲麻豆国产自偷在线| 国产精品激情偷乱一区二区∴| 欧美伊人影院| 欧美成人日韩| 欧美在线免费看| 麻豆freexxxx性91精品| 亚洲男人的天堂在线aⅴ视频| 亚洲一区视频在线观看视频| 亚洲第一精品在线| 亚洲主播在线| 99热在这里有精品免费| 亚洲欧美日韩中文在线制服| 亚洲精品国精品久久99热| 午夜精品久久久久久久99樱桃 | 亚洲人成在线观看一区二区| 国产日本欧洲亚洲| 欧美在线免费播放| 在线视频亚洲欧美| 国产亚洲欧美一区二区| 欧美成人69av| 国产精品美女久久福利网站| 欧美一区永久视频免费观看| 欧美一区亚洲| 亚洲午夜成aⅴ人片| 久久黄金**| 欧美在线视频一区二区三区| 久久久激情视频| 亚洲男女自偷自拍| 欧美极品色图| 免费人成精品欧美精品| 国产精品系列在线| 一区二区三区毛片| 亚洲欧美美女| 制服丝袜亚洲播放| 欧美电影电视剧在线观看| 久久久99国产精品免费| 国产精品日韩高清| 亚洲综合精品| 亚洲男人的天堂在线aⅴ视频| 欧美精品一区二区三区蜜桃 | 亚洲欧洲在线观看| 另类人畜视频在线| 久久精品视频在线免费观看| 久久综合国产精品| 国产精品99久久久久久白浆小说 | 亚洲视频高清| 狠狠色综合日日| 欧美三日本三级少妇三2023 | 亚洲视频在线观看视频| 亚洲精品久久久久中文字幕欢迎你| 一区二区三区视频观看| 韩国在线视频一区| 国产精品99免费看| 欧美va亚洲va日韩∨a综合色| 亚洲美女av网站| 欧美电影在线观看| 久久av最新网址| 亚洲无吗在线| 91久久精品www人人做人人爽| 欧美激情在线观看| 性久久久久久| 在线视频你懂得一区| 亚洲欧洲精品一区二区三区| 玉米视频成人免费看| 极品日韩av| 国产视频在线一区二区| 欧美亚洲第一页| 国产精品日韩欧美一区| 欧美日韩亚洲一区二区三区| 欧美成人中文字幕| 欧美精品一区二区三| 欧美亚州韩日在线看免费版国语版| 欧美经典一区二区| 欧美日韩aaaaa| 国产精品一区二区欧美| 亚洲国产精品一区制服丝袜| 亚洲一区二区精品在线| 你懂的国产精品永久在线| 91久久精品视频| 亚洲三级影院| 欧美亚洲一级| 久久久久久亚洲精品中文字幕| 久久久精彩视频| 欧美激情一区二区三区全黄| 欧美日韩国产欧| 狠狠88综合久久久久综合网| 亚洲欧洲日本mm| 亚洲性夜色噜噜噜7777| 欧美伊久线香蕉线新在线| 免费亚洲电影在线| 亚洲欧美日韩成人高清在线一区| 久久久久久午夜| 国产欧美一区二区三区在线看蜜臀| 国产综合欧美| 亚洲最新在线| 久久国产精品久久国产精品| 免费一级欧美片在线播放| 亚洲巨乳在线| 欧美一区2区三区4区公司二百 | 久久成人国产| 激情欧美一区二区| 亚洲视频专区在线| 亚洲福利电影| 亚洲福利视频一区| 免费视频最近日韩| 亚洲视频你懂的| 午夜在线一区|