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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

APIHOOK實例剖析

Posted on 2010-01-31 22:20 S.l.e!ep.¢% 閱讀(510) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
APIHOOK實例剖析

?關于APIHOOK的基礎知識有很多,如dll的相關知識、Hook的相關知識、系統進程與線程之間的聯系等。具體可以看我的另兩篇文章:"?
一、APIHOOK之dll部分
?
//////////////////////////////// APIHook_Dll.cpp ////////////////////////////////////////
//???????????????????????????? rivershan寫于2002.9.23????????????????????????????????? //
/////////////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "APIHook_Dll.h"

#include <ImageHlp.h>
#include <tlhelp32.h>

#pragma comment(lib,"ImageHlp") //定義全局共享數據段

#pragma data_seg("Shared")
HMODULE hmodDll=NULL;
HHOOK hHook=NULL;

#pragma data_seg()

#pragma comment(linker,"/Section:Shared,rws") //設置全局共享數據段的屬性

///////////////////////////////////// DllMain 函數 /////////////////////////////////////////
//dll的入口點
BOOL APIENTRY DllMain( HMODULE hModule,?
?????????????????????? DWORD? ul_reason_for_call,?
?????????????????????? LPVOID lpReserved
????? )
{
?switch(ul_reason_for_call)
?{
?case DLL_PROCESS_ATTACH:
??//if(sHook)??
??
?case DLL_PROCESS_DETACH:
??UnInstallHook();
??break;
?}
?hmodDll=hModule;
??? return TRUE;
}

///////////////////////////////////// HookOneAPI 函數 /////////////////////////////////////////
//進行IAT轉換的關鍵函數,其參數含義:
//pszCalleeModuleName:需要hook的模塊名
//pfnOriginApiAddress:要替換的自己API函數的地址
//pfnDummyFuncAddress:需要hook的模塊名的地址
//hModCallerModule:我們要查找的模塊名稱,如果沒有被賦值,
//?????將會被賦值為枚舉的程序所有調用的模塊

void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,?
??????? PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
?ULONG size;

?//獲取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR數組的指針

?PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
??ImageDirectoryEntryToData(hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);

?if (pImportDesc == NULL)
??return;

?//查找記錄,看看有沒有我們想要的DLL

?for (;pImportDesc->Name;pImportDesc++)
?{
??LPSTR pszDllName = (LPSTR)((PBYTE)hModCallerModule+pImportDesc->Name);
??if (lstrcmpiA(pszDllName,pszCalleeModuleName) == 0)
???break;
?}

?if (pImportDesc->Name == NULL)
?{
??return;
?}

?//尋找我們想要的函數

?PIMAGE_THUNK_DATA pThunk =?
??(PIMAGE_THUNK_DATA)((PBYTE)hModCallerModule+pImportDesc->FirstThunk);//IAT
?for (;pThunk->u1.Function;pThunk++)
?{
??//ppfn記錄了與IAT表項相應的函數的地址

??PROC * ppfn= (PROC *)&pThunk->u1.Function;??
??if (*ppfn == pfnOriginApiAddress)?
??{
???//如果地址相同,也就是找到了我們想要的函數,進行改寫,將其指向我們所定義的函數

???WriteProcessMemory(GetCurrentProcess(),ppfn,&(pfnDummyFuncAddress),
????sizeof(pfnDummyFuncAddress),NULL);
???return;
??}
?}
}

//查找所掛鉤的進程所應用的dll模塊的

BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
??????? PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
?if (pszCalleeModuleName == NULL)
?{
??return FALSE;
?}
?if (pfnOriginApiAddress == NULL)
?{
??return FALSE;
?}
?//如果沒傳進來要掛鉤的模塊名稱,枚舉被掛鉤進程的所有引用的模塊,
?//并對這些模塊進行傳進來的相應函數名稱的查找
?
?if (hModCallerModule == NULL)
?{
??MEMORY_BASIC_INFORMATION mInfo;
??HMODULE hModHookDLL;
??HANDLE hSnapshot;
??MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
??//MODULEENTRY32:描述了一個被指定進程所應用的模塊的struct

??VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo));
??hModHookDLL=(HMODULE)mInfo.AllocationBase;
??
??hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
??BOOL bOk = Module32First(hSnapshot,&me);
??while (bOk)
??{
???if (me.hModule != hModHookDLL)
???{
????hModCallerModule = me.hModule;//賦值
????//me.hModule:指向當前被掛鉤進程的每一個模塊?
????HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
?????pfnDummyFuncAddress,hModCallerModule);
???}
???bOk = Module32Next(hSnapshot,&me);
??}
??return TRUE;??
?}
?//如果傳進來了,進行查找
?else
?{
??HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
????pfnDummyFuncAddress,hModCallerModule);
??return TRUE;
?}
?return FALSE;
}

//////////////////////////////////// UnhookAllAPIHooks 函數 /////////////////////////////////////
//通過使pfnDummyFuncAddress與pfnOriginApiAddress相等的方法,取消對IAT的修改
BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
???????? PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
?PROC temp;
?temp = pfnOriginApiAddress;
?pfnOriginApiAddress = pfnDummyFuncAddress;
?pfnDummyFuncAddress = temp;
?return HookAllAPI(pszCalleeModuleName,pfnOriginApiAddress,
??pfnDummyFuncAddress,hModCallerModule);
}

////////////////////////////////// GetMsgProc 函數 ////////////////////////////////////////
//鉤子子程。與其它鉤子子程不大相同,沒做什么有意義的事情,繼續調用下一個鉤子子程,形成循環
LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam)
{
?return CallNextHookEx(hHook,code,wParam,lParam);
}

//////////////////////////////////// InstallHook 函數 /////////////////////////////////////
//安裝或卸載鉤子,BOOL IsHook參數是標志位
//對要鉤哪個API函數進行初始化
//我們這里裝的鉤子類型是WH_GETMESSAGE
void __declspec(dllexport) WINAPI InstallHook(BOOL IsHook,DWORD dwThreadId)
{
?if(IsHook)
?{
?hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId);
?
?//GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):取得要鉤的函數在所在dll中的地址
?
?HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
??"TextOutW"),(PROC)&H_TextOutW,NULL);
?HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
??"TextOutA"),(PROC)&H_TextOutA,NULL);
?}
?else
?{
??UnInstallHook();
??UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
???"TextOutW"),(PROC)&H_TextOutW,NULL);
??UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"),
???"TextOutA"),(PROC)&H_TextOutA,NULL);
?}
}

///////////////////////////////////// UnInstallHook 函數 ////////////////////////////////////
//卸載鉤子
BOOL WINAPI UnInstallHook()
{
?UnhookWindowsHookEx(hHook);
?return TRUE;
}

///////////////////////////////////// H_TextOutA 函數 /////////////////////////////////////////
//我們的替換函數,可以在里面實現我們所要做的功能
//這里我做的是顯示一個對話框,指明是替換了哪個函數
BOOL WINAPI H_TextOutA(HDC hdc,int nXStart,int nYStart,LPCSTR lpString,int cbString)
{
?MessageBox(NULL,"TextOutA","APIHook_Dll ---rivershan",MB_OK);
?TextOutA(hdc,nXStart,nYStart,lpString,cbString);//返回原來的函數,以顯示字符
?return TRUE;
}

///////////////////////////////////// H_TextOutW 函數 /////////////////////////////////////////
//同上
BOOL WINAPI H_TextOutW(HDC hdc,int nXStart,int nYStart,LPCWSTR lpString,int cbString)
{
?MessageBox(NULL,"TextOutW","APIHook_Dll ---rivershan",MB_OK);
?TextOutW(hdc,nXStart,nYStart,lpString,cbString);//返回原來的函數,以顯示字符
?return TRUE;
}

**********************************************************************************************
**********************************************************************************************

//////////////////////////////// APIHook_Dll.h ////////////////////////////////////////
//???????????????????????????? rivershan寫于2002.9.23????????????????????????????????? //
/////////////////////////////////////////////////////////////////////////////////////////

//dll頭文件,用于聲明函數

void __declspec(dllexport) WINAPI InstallHook(BOOL,DWORD);
BOOL WINAPI UnInstallHook();
LRESULT CALLBACK GetMsgProC(int code,WPARAM wParam,LPARAM lParam);

void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
??????? PROC pfnDummyFuncAddress,HMODULE hModCallerModule);
BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
??????? PROC pfnDummyFuncAddress,HMODULE hModCallerModule);
BOOL WINAPI UnhookAllAPIHooks(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
???????? PROC pfnDummyFuncAddress,HMODULE hModCallerModule);

BOOL WINAPI H_TextOutA(HDC, int, int, LPCSTR, int);
BOOL WINAPI H_TextOutW(HDC, int, int, LPCWSTR, int);
BOOL WINAPI H_ExtTextOutA(HDC, int, int, UINT, CONST RECT *,LPCSTR, UINT, CONST INT *);
BOOL WINAPI H_ExtTextOutW(HDC, int, int, UINT, CONST RECT *,LPCWSTR, UINT, CONST INT *);

**********************************************************************************************
**********************************************************************************************

;APIHook_Dll之def文件
LIBRARY APIHook_Dll.dll
EXPORT
?InstallHook
?
二、APIHOOK之exe部分

//////////////////////////// APIHook_EXEDlg.cpp /////////////////////////////////////////
//???????????????????????????? rivershan寫于2002.9.23????????????????????????????????? //
/////////////////////////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "APIHook_EXE.h"
#include "APIHook_EXEDlg.h"
#include "APIHook_Dll.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAPIHook_EXEDlg dialog

CAPIHook_EXEDlg::CAPIHook_EXEDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAPIHook_EXEDlg::IDD, pParent)
{
?//{{AFX_DATA_INIT(CAPIHook_EXEDlg)
?// NOTE: the ClassWizard will add member initialization here
?//}}AFX_DATA_INIT
?// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
?m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CAPIHook_EXEDlg::DoDataExchange(CDataExchange* pDX)
{
?CDialog::DoDataExchange(pDX);
?//{{AFX_DATA_MAP(CAPIHook_EXEDlg)
?//?DDX_Control(pDX, IDC_EDIT1, m_Edit);
?//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAPIHook_EXEDlg, CDialog)
//{{AFX_MSG_MAP(CAPIHook_EXEDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
?ON_BN_CLICKED(IDC_BUTTON_OUT, OnButtonOut)
?ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnButtonBegin)
?ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
?//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAPIHook_EXEDlg message handlers

BOOL CAPIHook_EXEDlg::OnInitDialog()
{
?CDialog::OnInitDialog();
?
?// Set the icon for this dialog.? The framework does this automatically
?// when the application's main window is not a dialog
?SetIcon(m_hIcon, TRUE);???// Set big icon
?SetIcon(m_hIcon, FALSE);??// Set small icon
?
?// TODO: Add extra initialization here
?
?return TRUE;? // return TRUE? unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//? to draw the icon.? For MFC applications using the document/view model,
//? this is automatically done for you by the framework.

void CAPIHook_EXEDlg::OnPaint()?
{
?if (IsIconic())
?{
??CPaintDC dc(this); // device context for painting
??
??SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
??
??// Center icon in client rectangle
??int cxIcon = GetSystemMetrics(SM_CXICON);
??int cyIcon = GetSystemMetrics(SM_CYICON);
??CRect rect;
??GetClientRect(&rect);
??int x = (rect.Width() - cxIcon + 1) / 2;
??int y = (rect.Height() - cyIcon + 1) / 2;
??
??// Draw the icon
??dc.DrawIcon(x, y, m_hIcon);
?}
?else
?{
??CDialog::OnPaint();
?}
}

// The system calls this to obtain the cursor to display while the user drags
//? the minimized window.
HCURSOR CAPIHook_EXEDlg::OnQueryDragIcon()
{
?return (HCURSOR) m_hIcon;
}
///////////////////////////////////// OnButtonOut 函數 //////////////////////////////////////
//使用TextOut函數
void CAPIHook_EXEDlg::OnButtonOut()?
{
?// TODO: Add your control notification handler code here
?HDC hdc = ::GetDC(GetSafeHwnd());
?::TextOutA(hdc,0,0,"APIHOOK_EXE ---rivershan",30);
?UpdateWindow();
}

///////////////////////////////////// OnButtonBegin 函數 ////////////////////////////////////
//開始掛鉤,這里我們掛的是自身這個APIHook_EXE這個程序
void CAPIHook_EXEDlg::OnButtonBegin()
{
?DWORD dwThreadId = GetWindowThreadProcessId(m_hWnd,NULL);//獲得自身進程ID
?InstallHook(TRUE,dwThreadId);
}

///////////////////////////////////// OnButtonStop 函數 ////////////////////////////////////
//取消掛鉤
void CAPIHook_EXEDlg::OnButtonStop()
{
?InstallHook(FALSE,0);
}

三、APIHOOK之集成

1. 用 VC++新建一個 Win32 Dynamic-Link Library 程序,命名為 APIHook_Dll。接下來選擇第二項 A Simple DLL Project;
2. 新建一頭文件,命名為 APIHook_Dll.h。刪除工程中 APIHook_Dll.cpp文件中原來的內容,然后把上面的 APIHook_Dll.cpp 和 APIHook_Dll.h文件的內容全部復制到新建的這個工程的 .cpp及 .h文件中來;
3. 新建一 Text文件,命名為 APIHook_Dll.def。復制上面的def文件內容。
4. 編譯;
5. 新建一 MFC APPWizard(exe)程序,命名為 APIHook_EXE。接著選擇第三項,基于對話框的程序,其它默認;
6. 刪除原來對話框上的控件,然后新建三個按鈕ID分別為:IDC_BUTTON_BEGIN、IDC_BUTTON_STOP、IDC_BUTTON_OUT,Caption分別為:Bigin Hook、Stop Hook、Text Out。不要讓這三個按鈕出于對話框客戶區的最上面就行;
7. 拷貝 APIHook_Dll.h文件到 APIHook_EXE程序目錄下,然后加到 APIHook_EXE的頭文件夾中。
8. 刪除工程中 APIHook_EXEDlg.cpp文件中原來的內容,然后把上面的 APIHook_EXEDlg.cpp文件的內容全部復制到新建的這個工程的 .cpp文件中來;
9. 打開 Project->Setting菜單,選擇第四項link,在 Object/library moduls里添加我們的dll的lib文件的路徑:..\APIHook_Dll\Debug\APIHook_Dll.lib;
10. 編譯;
11. 把 APIHook_Dll.dll文件放在 APIHook_Dll.exe程序的同一個文件夾內;
12. 運行程序,點擊 Bigin Hook按鈕,開始掛鉤。再點擊 Text Out按鈕會跳出對話框并且會在程序中顯示所要顯示的字。點擊 Stop Hook然后在點擊 Text Out按鈕就沒有對話框出現了。

四、一些說明

1、我這個 HookAPI是使用了 Jeffrey Richter的改寫程序的 IAT來實現的,也可以用跳轉函數入口點的方法來實現,這個我沒做研究。:)

2、我的一些心得:

?所謂 HookAPI,就是改寫程序的 IAT,再調用我自己寫的用于替換原API函數的函數。在我們自己寫的API函數中,我們可以進行我們想要的工作。之后呢,可以把原來的函數傳回去,也可以不傳回去,只要你設計好了就行。

?而所謂調用自己的函數,就是把原函數參數都傳給我的替換函數。我們就可以利用這些參數去干我們想做的事。而系統呢,我想由于微軟設置的這個鉤子的目的(我這么認為的),所以不會去檢查替換函數是否就是原函數,只要參數、返回值符合條件就行,要不會出錯。替換函數的返回值最好是原函數,否則有可能會出錯

?HookAPI時,exe程序起到的作用就是進行Hook,把dll注入到要Hook的程序,并且傳回要掛接的進程的ID或者全局鉤子,以便查詢所要掛接的模塊的IAT。如果不注入進去,系統不會讓你去查詢IAT的。DLL做的事情是確定要掛接哪個函數和這個函數在哪個DLL中等。

?????????????????????????????????????????????????????????????????????????????? ?rivershan 原創于 2002-9-23

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩在线播放| 国产欧美日韩视频| 久久精品国产亚洲一区二区三区| 久久先锋影音av| 亚洲一区二区在线免费观看视频 | 欧美国产亚洲精品久久久8v| 久久精品中文| 国产精品久久久久久模特 | 国产精品美女| 亚洲国产一区二区三区在线播 | 欧美日韩不卡合集视频| 欧美xxx成人| 国产一区二区三区电影在线观看 | 狠狠色狠狠色综合日日小说 | 亚洲图片在区色| 一本久久综合亚洲鲁鲁| 欧美高清成人| 亚洲高清成人| 亚洲日本va午夜在线电影| 老色鬼精品视频在线观看播放| 午夜精品久久久久99热蜜桃导演| 欧美日韩国产一中文字不卡| 亚洲剧情一区二区| 99精品国产99久久久久久福利| 免费精品视频| 欧美国产日本高清在线| 亚洲风情亚aⅴ在线发布| 久久久久久久久久久成人| 久久精品夜色噜噜亚洲a∨| 国产日产精品一区二区三区四区的观看方式 | 激情伊人五月天久久综合| 欧美有码在线观看视频| 久久综合色婷婷| 激情伊人五月天久久综合| 久久久久久黄| 欧美高清视频www夜色资源网| 91久久精品国产91久久| 欧美激情四色 | 在线观看成人一级片| 久久婷婷国产麻豆91天堂| 欧美黄色影院| 野花国产精品入口| 欧美午夜宅男影院在线观看| 午夜精彩国产免费不卡不顿大片| 久久精品成人一区二区三区| 一区二区在线免费观看| 欧美xx视频| 夜夜嗨av一区二区三区中文字幕 | 91久久中文字幕| 欧美人成免费网站| 亚洲视频二区| 久久综合九色九九| 亚洲精品视频在线| 国产精品久久久久久久久婷婷| 午夜精品久久久99热福利| 麻豆成人精品| 一区二区三区成人精品| 国产美女一区| 久久综合久久久久88| 9久草视频在线视频精品| 欧美一区二区视频免费观看| 一区二区三区国产在线观看| 欧美一区二区大片| 亚洲电影视频在线| 欧美日韩综合精品| 欧美中文字幕视频在线观看| 亚洲精品久久久久久下一站| 小嫩嫩精品导航| 亚洲国产精品一区二区www在线| 欧美色精品在线视频| 久久av免费一区| 亚洲精品影院| 美女视频黄免费的久久| 欧美亚洲在线视频| 亚洲欧洲精品一区二区三区不卡| 欧美午夜www高清视频| 久热精品视频在线观看一区| 亚洲一区二区三区精品在线| 亚洲国产精品视频| 久久精品亚洲热| 99综合在线| 国产视频在线观看一区 | 国产精品久久久久9999高清| 久久午夜精品一区二区| 亚洲欧美日韩在线一区| 99视频有精品| 欧美激情成人在线| 久久视频在线看| 亚洲欧美日韩一区| 99www免费人成精品| 在线精品视频一区二区三四| 国产性猛交xxxx免费看久久| 国产精品成人久久久久| 欧美日本精品| 欧美成人影音| 六月天综合网| 久久久综合网| 久久精品国产亚洲aⅴ| 午夜免费日韩视频| 亚洲桃花岛网站| 99国产精品久久久久久久久久 | 香蕉精品999视频一区二区 | 夜夜嗨av一区二区三区四区| 亚洲国产一区二区a毛片| 欧美激情视频一区二区三区在线播放 | 老牛嫩草一区二区三区日本| 久久久久久久成人| 久久久久亚洲综合| 欧美中文在线字幕| 欧美亚洲自偷自偷| 欧美一级视频免费在线观看| 欧美一区二区三区婷婷月色| 欧美自拍丝袜亚洲| 久久激情视频久久| 久久久免费av| 欧美成人免费视频| 欧美日韩免费在线| 国产精品高清网站| 国产美女精品免费电影| 狠狠色综合色综合网络| 一色屋精品亚洲香蕉网站| 1000部精品久久久久久久久| 亚洲黄色成人久久久| 亚洲精品久久久久久久久| 亚洲精选视频在线| 亚洲小说区图片区| 欧美在线国产| 久久噜噜亚洲综合| 亚洲福利视频一区二区| 亚洲精品久久久久| 亚洲午夜高清视频| 欧美在线视频导航| 美女福利精品视频| 欧美日韩一级片在线观看| 国产精品永久在线| 在线观看三级视频欧美| 99精品久久久| 性做久久久久久久久| 老牛影视一区二区三区| 亚洲电影免费在线观看| 亚洲综合第一| 美女网站在线免费欧美精品| 欧美日韩在线三级| 国产资源精品在线观看| 一本一本久久a久久精品综合麻豆| 亚洲欧美日韩专区| 另类尿喷潮videofree| 亚洲精品三级| 久久精品二区三区| 欧美性猛交xxxx乱大交退制版| 激情91久久| 亚洲一区视频在线| 欧美波霸影院| 亚洲专区免费| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品一区二区久久久| 亚洲黑丝在线| 久久精品国产亚洲高清剧情介绍| 亚洲国产欧美日韩精品| 性欧美大战久久久久久久免费观看 | 国语自产精品视频在线看一大j8 | 欧美电影免费观看网站| 国产日韩欧美一区二区三区四区| 亚洲另类视频| 欧美88av| 久久aⅴ国产欧美74aaa| 国产精品久久久亚洲一区| 亚洲日本免费电影| 久久精品欧洲| 中文有码久久| 欧美日韩国产专区| 亚洲电影第1页| 久久久久综合网| 亚洲综合第一| 国产精品久久97| 99在线精品视频| 亚洲电影在线| 免费不卡视频| 亚洲第一精品夜夜躁人人爽| 久久激五月天综合精品| 亚洲免费视频成人| 欧美视频不卡| 一本色道久久综合亚洲精品按摩| 欧美成黄导航| 久久夜精品va视频免费观看| 韩国成人精品a∨在线观看| 久久爱91午夜羞羞| 亚洲综合色激情五月| 国产精品欧美一区喷水| 亚洲欧美日韩国产| 亚洲午夜国产一区99re久久| 国产精品久久777777毛茸茸| 亚洲欧美精品一区| 亚洲天堂偷拍| 国产精品婷婷| 久久精品免费观看| 久久久欧美精品sm网站| 亚洲电影免费观看高清完整版在线观看 | 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美在线观看视频在线|