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

道。道。道

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

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

常用鏈接

搜索

  •  

最新評論

在很多情況下,為了測試代碼或擴展操作系統的功能,軟件開發人員或測試人員必須截取系統函數調用。有一些軟件包能夠提供該功能,如微軟公司的 Detours* 庫,或 OK Thinking Software 的 Syringe*。但是從另一個角度而言,開發人員可能希望不需借助第三方軟件,自己就能實現該功能。

本文描述了函數截取的幾種不同方式,并詳細介紹了無需使用商業軟件包,也不需受 GNU*(通用公共許可證)許可的約束,就能夠實現該功能的一種通用方法。本文所有材料由英特爾公司開發,或根據 MSDN* 樣本代碼修改而來。

截取系統函數調用的兩項基本技術
大部分截取任意函數調用的方法都是準備一個 DLL,用來替代將被截取的目標函數,然后將 DLL 注入至目標進程;在與目標進程連接的基礎上,DLL 將自己與目標函數相連。這種技術之所以適合此任務,是因為在大多數情況下我們無法獲得目標應用程序的源代碼,而這種技術只需相對簡單地編寫一個包含代換函數的 DLL,就可將其與軟件的其它部分分離開來。

兩種截取方法已經過研究和分析。Syringe 通過修改函數輸入條目(thunking 表)運行。而Detours 庫則直接修改目標函數(在目標進程空間內),并無條件地跳轉至代換函數。此外,它還提供能夠調用原始函數的 trampoline 函數。

Detours 技術之所以采用后一種方法,是因為在許多情況下,Syringe 無法找到 thunk,并且它不能提供 trampoline功能來調用原始函數。在這兩種方法下,注入 DLL 的工作方式相同。

截取系統函數調用的全部工作流程如下所示:

DLL 注入 — 首先,主軟件打開目標進程,并使其加載包含代換函數的 DLL

目標函數修改 — 當 DLL 連接至進程時,它在目標進程空間內修改目標函數,從而直接跳轉至 DLL 中的代換函數。Trampoline 函數能夠隨意調用原始函數。

目標函數截取 — 當調用目標函數時,它直接跳轉至 DLL 中的代換函數。如果開發人員希望調用原始的功能,則他或她就可以調用 trampoline 函數。
DLL 注入
本節內容完全以 MSDN 文章“定制調試診斷工具和實用程序 — 擺脫 DLL“地獄”??(DLL Hell)*”為基礎,該文章還包括可下載的源代碼。在本文附錄中可獲得 Inject.cppInject.h 。已對它們進行了定制以便于集成——僅需將其包括在項目中然后調用 InjectLib 即可。使目標進程加載 DLL 的算法按如下步驟工作:

通過調用 OpenProcess 打開目標進程。

通過調用 VirtualAllocEx 在目標進程中分配內存。利用 WriteProcessMemory 將要被注入的 DLL 名稱寫入分配的內存。

通過調用 GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW") 來獲取 LoadLibrary 的地址;

調用 CreateRemoteThread,指定 LoadLibrary 的入口點,并將 DLL (第 2 步中) 的名稱作為其自變量。目標進程將加載 DLL

利用 VirtualFreeEx 釋放分配的內存。已不再需要該內存。


Inject.cpp 融合了包括穩固的安全特性等大量其它功能,但上述步驟已足夠闡明其核心概念。

目標函數修改
目標函數修改為自我修改代碼,盡管在將 jmp 注入進程內存的過程中存在一些缺陷,但它在?MSDN*? 上具有完善的文件證明。為避免混淆,本節列出了幾乎全部的樣本代碼。

目標函數修改的兩個主要方面為代換函數和 trampoline 函數。下面的代碼片斷為截取 GetSystemPowerStatus API 的 DLL 示例:
這段代碼為連接所做的第一件事就是調用 InterceptAPI。需要使用包含目標函數的模塊名稱、目標函數的名稱以及代換函數的地址。 GetSystemPowerStatus 位于 kernel32.dll 中。其它基本的 Win32* API,如 MessageBoxPeekMessage,都能夠在 user32.dll 中獲得。MSDN 指定每個 API 所屬的模塊;未來的增強版中,將自動為給定的 API 找到正確的模塊。

InterceptAPI 將目標函數的前五個字節覆蓋為無條件跳轉(opcode 0xE9),后面為四個字節的帶符號整數(向代換函數的位移)。位移從下一個指令開始;因此需要使用 pbReplaced - (pbTargetCode +4)。進行該代碼操作時,需要注意以下兩點:

將區域覆蓋的保護模式改為 VirtualProtect。否則,將發生非法訪問錯誤。

必須使用 FlushInstructionCache 來支持指令已存在于高速緩存中的情況。否則,即使內存中的指令已經有所變化,舊代碼仍將在高速緩存中運行。

現在,當調用 GetSystemPowerStatus 函數時,它跳轉至代換函數,然后直接返回調用方,成功截取調用。
Trampoline 函數
在很多情況下,代換函數除使用自身代碼外,還需調用原始目標函數,這樣就能夠擴展 API 的功能,而不是替換整個 API。Trampoline 函數可以提供該功能。Trampoline 函數的原理如下所示:

編寫一個具有相同聲明的啞元函數(dummy function),將作為 trampoline 使用。確保啞元函數的長度超過 10 個字節。

在覆蓋目標函數的前五個字節之前,將它們復制到 trampoline 函數的起始處。

利用無條件跳轉,將trampoline的第六個字節覆蓋為目標函數的第六個字節。

與之前一樣覆蓋目標函數。

當從代換函數或其它地方調用 trampoline 函數時,它執行復制出的原始代碼的前五個字節,然后跳轉至實際原始代碼的第六個字節。控制返回至 trampoline 的調用方。當完成其它任務時,控制返回至 API 的控制方。

可能存在一種復雜的情況,即原始代碼的第六個字節可能是先前指令的一部分。在這種情況下,函數會覆蓋部分先前指令,然后崩潰。在 GetSystemPowerStatus 的情況中,前五個字節后的新指令開始于第七個字節。因此,對于這種工作機制,需要將六個字節復制到 trampoline,并且代碼必須相應地調整這個偏移量。

代碼需要復制的字節數取決于 API。查看原始目標代碼(利用調試器或反匯編器)并計算需要復制的字節數是非常必要的。未來的增強版將自動檢測正確的偏移量。假設我們已經知道正確的偏移量,下面的代碼則顯示出可建立 trampoline 函數的可擴展 InterceptAPI 函數:

?1?BOOL?InterceptAPI(HMODULE?hLocalModule,?const?char*?c_szDllName,?const?char*?c_szApiName,
?2?????????DWORD?dwReplaced,?DWORD?dwTrampoline,?int?offset)
?3?{
?4?????int?i;
?5?????DWORD?dwOldProtect;
?6?????????DWORD?dwAddressToIntercept?=?(DWORD)GetProcAddress(
?7?????????????GetModuleHandle((char*)c_szDllName),?(char*)c_szApiName);
?8?
?9?????BYTE?*pbTargetCode?=?(BYTE?*)?dwAddressToIntercept;
10?????BYTE?*pbReplaced?=?(BYTE?*)?dwReplaced;
11?????BYTE?*pbTrampoline?=?(BYTE?*)?dwTrampoline;
12?
13?????//?Change?the?protection?of?the?trampoline?region
14?????//?so?that?we?can?overwrite?the?first?5?+?offset?bytes.
15?????VirtualProtect((void?*)?dwTrampoline,?5+offset,?PAGE_WRITECOPY,?&dwOldProtect);
16?????for?(i=0;i<offset;i++)
17?????????*pbTrampoline++?=?*pbTargetCode++;
18?????pbTargetCode?=?(BYTE?*)?dwAddressToIntercept;
19?
20?????//?Insert?unconditional?jump?in?the?trampoline.
21?????*pbTrampoline++?=?0xE9;????????//?jump?rel32
22?????*((signed?int?*)(pbTrampoline))?=?(pbTargetCode+offset)?-?(pbTrampoline?+?4);
23?????VirtualProtect((void?*)?dwTrampoline,?5+offset,?PAGE_EXECUTE,?&dwOldProtect);
24?????
25?????//?Overwrite?the?first?5?bytes?of?the?target?function
26?????VirtualProtect((void?*)?dwAddressToIntercept,?5,?PAGE_WRITECOPY,?&dwOldProtect);
27?????*pbTargetCode++?=?0xE9;????????//?jump?rel32
28?????*((signed?int?*)(pbTargetCode))?=?pbReplaced?-?(pbTargetCode?+4);
29?????VirtualProtect((void?*)?dwAddressToIntercept,?5,?PAGE_EXECUTE,?&dwOldProtect);
30?????
31?????//?Flush?the?instruction?cache?to?make?sure?
32?????//?the?modified?code?is?executed.
33?????FlushInstructionCache(GetCurrentProcess(),?NULL,?NULL);
34?????return?TRUE;
35?}
36?

結論
本文描述了截取系統函數調用的一種通用方法,同時還提供了 trampoline 函數,從而保留了原始功能。本文僅對方法進行簡要描述,并未對完整的軟件包作出說明,因此如下一些細節并沒有實現:

自動檢測包含目標 API 的模塊。

自動檢測 trampoline 函數的偏移量。

刪除代換函數,并注入 DLL。(到目前為止,清空代換函數的唯一方法是關閉應用程序。

然而,對于開發人員而言,無需依賴第三方軟件包,執行截取任意系統函數調用的軟件,本文中涉及的技術、說明及源代碼已經足夠。

??1?#include?"stdafx.h"
??2?#include?"Inject.h"
??3?
??4?#include?<tchar.h>
??5?#include?<malloc.h>????//?For?alloca
??6?#include?<pi.h>
??7?
??8?#ifdef?UNICODE
??9?#define?InjectLib?InjectLibW
?10?#else
?11?#define?InjectLib?InjectLibA
?12?#endif???//?!UNICODE
?13?
?14?BOOL?AdjustDacl(HANDLE?h,?DWORD?DesiredAccess)
?15?{
?16?????//?the?WORLD?Sid?is?trivial?to?form?programmatically?(S-1-1-0)
?17?????SID?world?=?{?SID_REVISION,?1,?SECURITY_WORLD_SID_AUTHORITY,?0?};
?18?????
?19?????EXPLICIT_ACCESS?ea?=
?20?????{
?21?????????DesiredAccess,
?22?????????????SET_ACCESS,
?23?????????????NO_INHERITANCE,
?24?????????{
?25?????????????0,?NO_MULTIPLE_TRUSTEE,
?26?????????????????TRUSTEE_IS_SID,
?27?????????????????TRUSTEE_IS_USER,
?28?????????????????reinterpret_cast<LPTSTR>(&world)
?29?????????}
?30?????};
?31?????ACL*?pdacl?=?0;
?32?????DWORD?err?=?SetEntriesInAcl(1,?&ea,?0,?&pdacl);
?33?????if?(err?==?ERROR_SUCCESS)
?34?????{
?35?????????err?=?SetSecurityInfo(h,?SE_KERNEL_OBJECT,?DACL_SECURITY_INFORMATION,?0,?0,?pdacl,?0);
?36?????????LocalFree(pdacl);
?37?????????return(err?==?ERROR_SUCCESS);
?38?????}
?39?????else
?40?????????return(FALSE);
?41?}
?42?
?43?//?Useful?helper?function?for?enabling?a?single?privilege
?44?BOOL?EnableTokenPrivilege(HANDLE?htok,?LPCTSTR?szPrivilege,?TOKEN_PRIVILEGES&?tpOld)
?45?{
?46?????TOKEN_PRIVILEGES?tp;
?47?????tp.PrivilegeCount?=?1;
?48?????tp.Privileges[0].Attributes?=?SE_PRIVILEGE_ENABLED;
?49?????if?(LookupPrivilegeValue(0,?szPrivilege,?&tp.Privileges[0].Luid))
?50?????{
?51?????????//?htok?must?have?been?opened?with?the?following?permissions:
?52?????????//?TOKEN_QUERY?(to?get?the?old?priv?setting)
?53?????????//?TOKEN_ADJUST_PRIVILEGES?(to?adjust?the?priv)
?54?????????DWORD?cbOld?=?sizeof?tpOld;
?55?????????if?(AdjustTokenPrivileges(htok,?FALSE,?&tp,?cbOld,?&tpOld,?&cbOld))
?56?????????????//?Note?that?AdjustTokenPrivileges?may?succeed,?and?yet
?57?????????????//?some?privileges?weren't?actually?adjusted.
?58?????????????//?You've?got?to?check?GetLastError()?to?be?sure!
?59?????????????return(ERROR_NOT_ALL_ASSIGNED?!=?GetLastError());
?60?????????else
?61?????????????return(FALSE);
?62?????}
?63?????else
?64?????????return(FALSE);
?65?}
?66?
?67?
?68?//?Corresponding?restoration?helper?function
?69?BOOL?RestoreTokenPrivilege(HANDLE?htok,?const?TOKEN_PRIVILEGES&?tpOld)
?70?{
?71?????return(AdjustTokenPrivileges(htok,?FALSE,?const_cast<TOKEN_PRIVILEGES*>(&tpOld),?0,?0,?0));
?72?}
?73?
?74?HANDLE?GetProcessHandleWithEnoughRights(DWORD?PID,?DWORD?AccessRights)
?75?{
?76?????HANDLE?hProcess?=?::OpenProcess(AccessRights,?FALSE,?PID);
?77?????if?(hProcess?==?NULL)
?78?????{
?79?????????HANDLE?hpWriteDAC?=?OpenProcess(WRITE_DAC,?FALSE,?PID);
?80?????????if?(hpWriteDAC?==?NULL)
?81?????????{
?82?????????????//?hmm,?we?don't?have?permissions?to?modify?the?DACL
?83?????????????//?time?to?take?ownership
?84?????????????HANDLE?htok;
?85?????????????if?(!OpenProcessToken(GetCurrentProcess(),?TOKEN_QUERY?|?TOKEN_ADJUST_PRIVILEGES,?&htok))
?86?????????????????return(FALSE);
?87?????????????
?88?????????????TOKEN_PRIVILEGES?tpOld;
?89?????????????if?(EnableTokenPrivilege(htok,?SE_TAKE_OWNERSHIP_NAME,?tpOld))
?90?????????????{
?91?????????????????//?SeTakeOwnershipPrivilege?allows?us?to?open?objects?with
?92?????????????????//?WRITE_OWNER,?but?that's?about?it,?so?we'll?update?the?owner,
?93?????????????????//?and?dup?the?handle?so?we?can?get?WRITE_DAC?permissions.
?94?????????????????HANDLE?hpWriteOwner?=?OpenProcess(WRITE_OWNER,?FALSE,?PID);
?95?????????????????if?(hpWriteOwner?!=?NULL)
?96?????????????????{
?97?????????????????????BYTE?buf[512];?//?this?should?always?be?big?enough
?98?????????????????????DWORD?cb?=?sizeof?buf;
?99?????????????????????if?(GetTokenInformation(htok,?TokenUser,?buf,?cb,?&cb))
100?????????????????????{
101?????????????????????????DWORD?err?=?
102?????????????????????????????SetSecurityInfo(?
103?????????????????????????????hpWriteOwner,?
104?????????????????????????????SE_KERNEL_OBJECT,
105?????????????????????????????OWNER_SECURITY_INFORMATION,
106?????????????????????????????reinterpret_cast<TOKEN_USER*>(buf)->User.Sid,
107?????????????????????????????0,?0,?0?
108?????????????????????????????);
109?????????????????????????if?(err?==?ERROR_SUCCESS)
110?????????????????????????{
111?????????????????????????????//?now?that?we're?the?owner,?we've?implicitly?got?WRITE_DAC
112?????????????????????????????//?permissions,?so?ask?the?system?to?reevaluate?our?request,
113?????????????????????????????//?giving?us?a?handle?with?WRITE_DAC?permissions
114?????????????????????????????if?(
115?????????????????????????????????!DuplicateHandle(?
116?????????????????????????????????GetCurrentProcess(),?
117?????????????????????????????????hpWriteOwner,
118?????????????????????????????????GetCurrentProcess(),?
119?????????????????????????????????&hpWriteDAC,
120?????????????????????????????????WRITE_DAC,?FALSE,?0?
121?????????????????????????????????)?
122?????????????????????????????????)
123?????????????????????????????????hpWriteDAC?=?NULL;
124?????????????????????????}
125?????????????????????}
126?????????????????????
127?????????????????????//?don't?forget?to?close?handle
128?????????????????????::CloseHandle(hpWriteOwner);
129?????????????????}
130?????????????????
131?????????????????//?not?truly?necessary?in?this?app,
132?????????????????//?but?included?for?completeness
133?????????????????RestoreTokenPrivilege(htok,?tpOld);
134?????????????}
135?????????????
136?????????????//?don't?forget?to?close?the?token?handle
137?????????????::CloseHandle(htok);
138?????????}
139?????????
140?????????if?(hpWriteDAC)
141?????????{
142?????????????//?we've?now?got?a?handle?that?allows?us?WRITE_DAC?permission
143?????????????AdjustDacl(hpWriteDAC,?AccessRights);
144?????????????
145?????????????//?now?that?we've?granted?ourselves?permission?to?access?
146?????????????//?the?process,?ask?the?system?to?reevaluate?our?request,
147?????????????//?giving?us?a?handle?with?right?permissions
148?????????????if?(
149?????????????????!DuplicateHandle(?
150?????????????????GetCurrentProcess(),?
151?????????????????hpWriteDAC,
152?????????????????GetCurrentProcess(),?
153?????????????????&hProcess,
154?????????????????AccessRights,?
155?????????????????FALSE,?
156?????????????????0?
157?????????????????)?
158?????????????????)
159?????????????????hProcess?=?NULL;
160?????????????
161?????????????CloseHandle(hpWriteDAC);
162?????????}
163?????}
164?????
165?????return(hProcess);
166?}
167?
168?BOOL?WINAPI?InjectLibW(DWORD?dwProcessId,?PCWSTR?pszLibFile)?
169?{
170?????BOOL?fOk?=?FALSE;?//?Assume?that?the?function?fails
171?????HANDLE?hProcess?=?NULL,?hThread?=?NULL;
172?????PWSTR?pszLibFileRemote?=?NULL;
173?????
174?????//?Get?a?handle?for?the?target?process.
175?????hProcess?=?
176?????????GetProcessHandleWithEnoughRights(
177?????????dwProcessId,
178?????????PROCESS_QUERY_INFORMATION?|???//?Required?by?Alpha
179?????????PROCESS_CREATE_THREAD?????|???//?For?CreateRemoteThread
180?????????PROCESS_VM_OPERATION??????|???//?For?VirtualAllocEx/VirtualFreeEx
181?????????PROCESS_VM_WRITE??????????????//?For?WriteProcessMemory
182?????????);
183?????if?(hProcess?==?NULL)
184?????????return(FALSE);
185?????
186?????//?Calculate?the?number?of?bytes?needed?for?the?DLL's?pathname
187?????int?cch?=?1?+?lstrlenW(pszLibFile);
188?????int?cb??=?cch?*?sizeof(WCHAR);
189?????
190?????//?Allocate?space?in?the?remote?process?for?the?pathname
191?????pszLibFileRemote?=?
192?????????(PWSTR)?VirtualAllocEx(hProcess,?NULL,?cb,?MEM_COMMIT,?PAGE_READWRITE);
193?????
194?????if?(pszLibFileRemote?!=?NULL)
195?????{
196?????????//?Copy?the?DLL's?pathname?to?the?remote?process's?address?space
197?????????if?(WriteProcessMemory(hProcess,?pszLibFileRemote,?
198?????????????(PVOID)?pszLibFile,?cb,?NULL))
199?????????{
200?????????????//?Get?the?real?address?of?LoadLibraryW?in?Kernel32.dll
201?????????????PTHREAD_START_ROUTINE?pfnThreadRtn?=?(PTHREAD_START_ROUTINE)
202?????????????????GetProcAddress(GetModuleHandle(TEXT("Kernel32")),?"LoadLibraryW");
203?????????????if?(pfnThreadRtn?!=?NULL)
204?????????????{
205?????????????????//?Create?a?remote?thread?that?calls?LoadLibraryW(DLLPathname)
206?????????????????hThread?=?CreateRemoteThread(hProcess,?NULL,?0,?
207?????????????????????pfnThreadRtn,?pszLibFileRemote,?0,?NULL);
208?????????????????if?(hThread?!=?NULL)
209?????????????????{
210?????????????????????//?Wait?for?the?remote?thread?to?terminate
211?????????????????????WaitForSingleObject(hThread,?INFINITE);
212?????????????????????
213?????????????????????fOk?=?TRUE;?//?Everything?executed?successfully
214?????????????????????
215?????????????????????CloseHandle(hThread);
216?????????????????}
217?????????????}
218?????????}
219?????????//?Free?the?remote?memory?that?contained?the?DLL's?pathname
220?????????VirtualFreeEx(hProcess,?pszLibFileRemote,?0,?MEM_RELEASE);
221?????}
222?????
223?????CloseHandle(hProcess);
224?????
225?????return(fOk);
226?}
227?
228?
229?BOOL?WINAPI?InjectLibA(DWORD?dwProcessId,?PCSTR?pszLibFile)?{
230?????
231?????//?Allocate?a?(stack)?buffer?for?the?Unicode?version?of?the?pathname
232?????PWSTR?pszLibFileW?=?(PWSTR)?
233?????????_alloca((lstrlenA(pszLibFile)?+?1)?*?sizeof(WCHAR));
234?????
235?????//?Convert?the?ANSI?pathname?to?its?Unicode?equivalent
236?????wsprintfW(pszLibFileW,?L"%S",?pszLibFile);
237?????
238?????//?Call?the?Unicode?version?of?the?function?to?actually?do?the?work.
239?????return(InjectLibW(dwProcessId,?pszLibFileW));
240?}
241?
posted on 2007-02-26 13:43 獨孤九劍 閱讀(1716) 評論(0)  編輯 收藏 引用 所屬分類: Win32
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久噜噜噜久噜久久| 午夜精品福利在线| 亚洲综合99| 激情另类综合| 在线播放日韩专区| 亚洲国产一成人久久精品| 一区二区在线看| 一区二区三区在线视频观看| 欧美激情视频网站| 欧美日韩爆操| 国产精品揄拍500视频| 国产精品porn| 国外成人在线视频| 亚洲精品国产视频| 亚洲自拍电影| 免费看精品久久片| 91久久久久久| 亚洲欧洲中文日韩久久av乱码| 亚洲国产婷婷香蕉久久久久久| 亚洲国产色一区| 亚洲一区二区三区四区在线观看 | 美女免费视频一区| 欧美mv日韩mv亚洲| 国产精品日韩在线| 有码中文亚洲精品| 亚洲一区二区三区中文字幕 | 亚洲精品偷拍| 亚洲一区二区三区激情| 久久精品视频99| 亚洲欧洲午夜| 久久成人人人人精品欧| 欧美a级理论片| 欧美区在线播放| 亚洲青涩在线| 欧美日韩在线精品一区二区三区| 亚洲一区3d动漫同人无遮挡| 亚洲一级特黄| 亚洲天堂av图片| 久久精品国产亚洲一区二区| 亚洲视频第一页| 久热精品在线视频| 国产精品午夜在线观看| 亚洲国内高清视频| 久久不射2019中文字幕| 亚洲国产精品久久久久久女王| 99亚洲视频| 久久蜜臀精品av| 国产精品中文在线| 亚洲一区二区毛片| 欧美不卡视频| 亚洲一二三四久久| 欧美日韩岛国| 亚洲精品四区| 欧美国产一区二区在线观看| 亚洲精品国产视频| 久久免费视频在线观看| 国产精品久久久久久福利一牛影视 | 国产一区二区三区久久悠悠色av | 在线一区免费观看| 亚洲二区在线| 久久亚洲国产精品日日av夜夜| 欧美性感一类影片在线播放| 狠狠网亚洲精品| 久久视频国产精品免费视频在线| 亚洲性图久久| 国产欧美精品一区| 欧美在线视频全部完| 亚洲一区二区三区三| 国产精品久久久久久久7电影| 国产精品第十页| 亚洲一区二区三区欧美| 亚洲精品欧美日韩| 欧美另类一区| 亚洲一区二区三区高清不卡| 欧美激情视频一区二区三区在线播放 | 99精品国产一区二区青青牛奶| 一区二区三区欧美视频| 亚洲高清av在线| 欧美插天视频在线播放| 亚洲国产毛片完整版 | 亚洲精品在线视频观看| 欧美高清成人| 欧美日韩精品免费观看视频| 亚洲韩日在线| 一本久久知道综合久久| 欧美日韩国产二区| 午夜精品999| 久久精品国产99国产精品| 国产有码在线一区二区视频| 午夜国产精品影院在线观看 | 亚洲国产精品久久精品怡红院| 欧美国产精品| 国产精品第一区| 久久久久在线观看| 欧美理论电影在线播放| 亚洲一区二区三区四区中文| 9国产精品视频| 国产一区二区精品久久| 欧美韩国在线| 国产欧美91| 亚洲大片精品永久免费| 欧美日韩美女在线| 久久久久欧美精品| 欧美日韩视频一区二区| 欧美在线观看视频在线| 久久亚洲精品网站| 亚洲一区二区三区色| 亚洲欧美成人综合| 亚洲精品一区二区三区四区高清| 在线亚洲伦理| 亚洲精品国久久99热| 亚洲欧美国产日韩中文字幕 | 99在线观看免费视频精品观看| 这里只有精品在线播放| 一区在线免费| 亚洲欧美日韩一区二区在线| 国产主播一区二区三区四区| 欧美激情1区| 精品成人一区二区| 亚洲免费影视| 亚洲在线观看| 欧美日韩亚洲高清| 亚洲黄色免费电影| 18成人免费观看视频| 亚洲综合色视频| 亚洲永久网站| 欧美色精品在线视频| 欧美激情精品久久久久| 国产精品专区第二| 亚洲一区二区三区激情| av不卡在线| 欧美国产视频在线观看| 国产日韩专区在线| 亚洲男人影院| 欧美一区二区免费| 国产精品日韩久久久久| 日韩视频免费看| 亚洲午夜精品17c| 欧美午夜电影网| 亚洲午夜一二三区视频| 亚洲一区二区三区精品在线观看| 欧美日韩123| 亚洲免费av观看| 亚洲一区视频在线| 国产欧美激情| 久久精品国产综合精品| 久久青草福利网站| 亚洲第一区在线观看| 久久噜噜亚洲综合| 亚洲国产精品视频一区| 亚洲精品你懂的| 欧美日韩亚洲一区| 午夜一区在线| 欧美国产先锋| 亚洲一区二区三区免费观看| 欧美日韩国产一级| 亚洲男人第一av网站| 欧美在线3区| 136国产福利精品导航网址应用| 久久婷婷麻豆| 日韩视频免费| 久久香蕉精品| 一区二区高清视频在线观看| 欧美激情精品久久久久久大尺度| 91久久精品美女高潮| 一区二区三区 在线观看视| 欧美日韩福利视频| 性欧美长视频| 亚洲日本va在线观看| 美女视频一区免费观看| 中日韩美女免费视频网站在线观看| 亚洲婷婷综合色高清在线| 国产精品久久久久久久一区探花| 亚洲欧美一区二区精品久久久| 久久精品国产一区二区三区| 国产日韩欧美高清免费| 久久人人97超碰人人澡爱香蕉| 91久久午夜| 香蕉免费一区二区三区在线观看| 韩日欧美一区二区| 欧美日韩中文字幕精品| 久久久久久亚洲精品不卡4k岛国| 亚洲第一在线综合网站| 午夜精品久久久久久久99樱桃 | 国产精品vvv| 久久久五月婷婷| 亚洲一区二区三区乱码aⅴ| 免费亚洲一区| 久久高清一区| 亚洲免费精品| 永久免费精品影视网站| 欧美日韩亚洲一区在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久综合电影| 久久aⅴ国产欧美74aaa| 亚洲老板91色精品久久| 狠狠色综合日日| 国产婷婷色一区二区三区在线| 一区二区三区国产精华| 久久久久久久久蜜桃|