日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

向其他进程注入代码的三种方法

發(fā)布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 向其他进程注入代码的三种方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何向其他線程的地址空間中注入代碼并在這個線程的上下文中執(zhí)行之?

目錄:
●導(dǎo)言
●Windows 鉤子(Hooks)
●CreateRemoteThread 和LoadLibrary 技術(shù)
○進程間通訊
●CreateRemoteThread 和 WriteProcessmemory 技術(shù)
○如何使用該技術(shù)子類(SubClass)其他進程中的控件
○什么情況下適合使用該技術(shù)
●寫在最后的話
●附錄
●參考
●文章歷史

導(dǎo)言:
我 們在Code project(www.codeproject.com)上可以找到許多密碼間諜程序(譯者注:那些可以看到別的程序中密碼框內(nèi)容的軟件),他們都依賴 于Windows鉤子技術(shù)。要實現(xiàn)這個還有其他的方法嗎?有!但是,首先,讓我們簡單回顧一下我們要實現(xiàn)的目標(biāo),以便你能弄清楚我在說什么。
要讀 取一個控件的內(nèi)容,不管它是否屬于你自己的程序,一般來說需要發(fā)送 WM_GETTEXT 消息到那個控件。這對edit控件也有效,但是有一種情況例外。如果這個edit控件屬于其他進程并且具有 ES_PASSWORD 風(fēng)格的話,這種方法就不會成功。只有“擁有(OWNS)”這個密碼控件的進程才可以用 WM_GETTEXT 取得它的內(nèi)容。所以,我們的問題就是:如何讓下面這句代碼在其他進程的地址空間中運行起來:
::SendMessage( hPwdEdit, WM_GETTEXT, nMaxChars, psBuffer );

一般來說,這個問題有三種可能的解決方案:
1. 把你的代碼放到一個DLL中;然后用 windows 鉤子把它映射到遠程進程。
2. 把你的代碼放到一個DLL中;然后用 CreateRemoteThread 和 LoadLibrary 把它映射到遠程進程。
3. 不用DLL,直接復(fù)制你的代碼到遠程進程(使用WriteProcessMemory)并且用CreateRemoteThread執(zhí)行之。在這里有詳細的說明:

Ⅰ. Windows 鉤子

示例程序:HookSpy 和 HookInjEx

Windows鉤子的主要作用就是監(jiān)視某個線程的消息流動。一般可分為:
1. 局部鉤子,只監(jiān)視你自己進程中某個線程的消息流動。
2. 遠程鉤子,又可以分為:
a. 特定線程的,監(jiān)視別的進程中某個線程的消息;
b. 系統(tǒng)級的,監(jiān)視整個系統(tǒng)中正在運行的所有線程的消息。

如 果被掛鉤(監(jiān)視)的線程屬于別的進程(情況2a和2b),你的鉤子過程(hook procedure)必須放在一個動態(tài)連接庫(DLL)中。系統(tǒng)把這包含了鉤子過程的DLL映射到被掛鉤的線程的地址空間。Windows會映射整個 DLL而不僅僅是你的鉤子過程。這就是為什么windows鉤子可以用來向其他線程的地址空間注入代碼的原因了。

在這里我不想深入討論鉤子的問題(請看MSDN中對SetWindowsHookEx的說明),讓我再告訴你兩個文檔中找不到的訣竅,可能會有用:
1. 當(dāng)SetWindowHookEx調(diào)用成功后,系統(tǒng)會自動映射這個DLL到被掛鉤的線程,但并不是立即映射。因為所有的Windows鉤子都是基于消息的,直到一個適當(dāng)?shù)氖录l(fā)生后這個DLL才被映射。比如:
如 果你安裝了一個監(jiān)視所有未排隊的(nonqueued)的消息的鉤子(WH_CALLWNDPROC),只有一個消息發(fā)送到被掛鉤線程(的某個窗口)后這 個DLL才被映射。也就是說,如果在消息發(fā)送到被掛鉤線程之前調(diào)用了UnhookWindowsHookEx那么這個DLL就永遠不會被映射到該線程(雖 然SetWindowsHookEx調(diào)用成功了)。為了強制映射,可以在調(diào)用SetWindowsHookEx后立即發(fā)送一個適當(dāng)?shù)南⒌侥莻€線程。

同理,調(diào)用UnhookWindowsHookEx之后,只有特定的事件發(fā)生后DLL才真正地從被掛鉤線程卸載。

2. 當(dāng)你安裝了鉤子后,系統(tǒng)的性能會受到影響(特別是系統(tǒng)級的鉤子)。然而如果你只是使用的特定線程的鉤子來映射DLL而且不截獲如何消息的話,這個缺陷也可以輕易地避免。看一下下面的代碼片段:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
if( ul_reason_for_call == DLL_PROCESS_ATTACH )
{
//用 LoadLibrary增加引用次數(shù)
char lib_name[MAX_PATH];
::GetModuleFileName( hModule, lib_name, MAX_PATH );
::LoadLibrary( lib_name );

// 安全卸載鉤子
::UnhookWindowsHookEx( g_hHook );
}
return TRUE;
}

我 們來看一下。首先,我們用鉤子映射這個DLL到遠程線程,然后,在DLL被真正映射進去后,我們立即卸載掛鉤(unhook)。一般來說當(dāng)?shù)谝粋€消息到達 被掛鉤線程后,這DLL會被卸載,然而我們通過LoadLibrary來增加這個DLL的引用次數(shù),避免了DLL被卸載。

剩下的問題是:使用完畢后如何卸載這個DLL?UnhookWindowsHookEx不行了,因為我們已經(jīng)對那個線程取消掛鉤(unhook)了。你可以這么做:
○在你想要卸載這個DLL之前再安裝一個鉤子;
○發(fā)送一個“特殊”的消息到遠程線程;
○在你的新鉤子的鉤子過程(hook procedure)中截獲該消息,調(diào)用FreeLibrary 和 (譯者注:對新鉤子調(diào)用)UnhookwindowsHookEx。
現(xiàn)在,鉤子只在映射DLL到遠程進程和從遠程進程卸載DLL時使用,對被掛鉤線程的性能沒有影響。也就是說,我們找到了一種(相比第二部分討論的LoadLibrary技術(shù))WinNT和Win9x下都可以使用的,不影響目的進程性能的DLL映射機制。

但 是,我們應(yīng)該在何種情況下使用該技巧呢?通常是在DLL需要在遠程進程中駐留較長時間(比如你要子類[subclass]另一個進程中的控件)并且你不想 過于干涉目的進程時比較適合使用這種技巧。我在HookSpy中并沒有使用它,因為那個DLL只是短暫地注入一段時間――只要能取得密碼就足夠了。我在另 一個例子HookInjEx中演示了這種方法。HookInjEx把一個DLL映射進“explorer.exe”(當(dāng)然,最后又從其中卸載),子類了其 中的開始按鈕,更確切地說我是把開始按鈕的鼠標(biāo)左右鍵點擊事件顛倒了一下。

你可以在本文章的開頭部分找到HookSpy和HookInjEx及其源代碼的下載包鏈接。


Ⅱ. CreateRemoteThread 和 LoadLibrary 技術(shù)
示例程序:LibSpy
通常,任何進程都可以通過LoadLibrary動態(tài)地加載DLL,但是我們?nèi)绾螐娭埔粋€外部進程調(diào)用該函數(shù)呢?答案是CreateRemoteThread。
讓我們先來看看LoadLibrary和FreeLibrary的函數(shù)聲明:

HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of library module
);

BOOL FreeLibrary(
HMODULE hLibModule // handle to loaded library module
);

再和CreateRemoteThread的線程過程(thread procedure)ThreadProc比較一下:
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);

你會發(fā)現(xiàn)所有的函數(shù)都有同樣的調(diào)用約定(calling convention)、都接受一個32位的參數(shù)并且返回值類型的大小也一樣。也就是說,我們可以把LoadLibrary/FreeLibrary的指針作為參數(shù)傳遞給CrateRemoteThread。

然而,還有兩個問題(參考下面對CreateRemoteThread的說明)

1. 傳遞給ThreadProc的lpStartAddress 參數(shù)必須為遠程進程中的線程過程的起始地址。
2. 如果把ThreadProc的lpParameter參數(shù)當(dāng)做一個普通的32位整數(shù)(FreeLibrary把它當(dāng)做HMODULE)那么沒有如何問題, 但是如果把它當(dāng)做一個指針(LoadLibrary把它當(dāng)做一個char*),它就必須指向遠程進程中的內(nèi)存數(shù)據(jù)。

第一個問題其實已經(jīng)迎 刃而解了,因為LoadLibrary和FreeLibrary都是存在于kernel32.dll中的函數(shù),而kernel32可以保證任何“正常”進 程中都存在,且其加載地址都是一樣的。(參看附錄A)于是LoadLibrary/FreeLibrary在任何進程中的地址都是一樣的,這就保證了傳遞 給遠程進程的指針是個有效的指針。

第二個問題也很簡單:把DLL的文件名(LodLibrary的參數(shù))用WriteProcessMemory復(fù)制到遠程進程。

所以,使用CreateRemoteThread和LoadLibrary技術(shù)的步驟如下:
1. 得到遠程進程的HANDLE(使用OpenProcess)。
2. 在遠程進程中為DLL文件名分配內(nèi)存(VirtualAllocEx)。
3. 把DLL的文件名(全路徑)寫到分配的內(nèi)存中(WriteProcessMemory)
4. 使用CreateRemoteThread和LoadLibrary把你的DLL映射近遠程進程。
5. 等待遠程線程結(jié)束(WaitForSingleObject),即等待LoadLibrary返回。也就是說當(dāng)我們的DllMain(是以DLL_PROCESS_ATTACH為參數(shù)調(diào)用的)返回時遠程線程也就立即結(jié)束了。
6. 取回遠程線程的結(jié)束碼(GetExitCodeThtread),即LoadLibrary的返回值――我們DLL加載后的基地址(HMODULE)。
7. 釋放第2步分配的內(nèi)存(VirtualFreeEx)。
8. 用CreateRemoteThread和FreeLibrary把DLL從遠程進程中卸載。調(diào)用時傳遞第6步取得的HMODULE給FreeLibrary(通過CreateRemoteThread的lpParameter參數(shù))。
9. 等待線程的結(jié)束(WaitSingleObject)。

同時,別忘了在最后關(guān)閉所有的句柄:第4、8步得到的線程句柄,第1步得到的遠程進程句柄。

現(xiàn)在我們看看LibSpy的部分代碼,分析一下以上的步驟是任何實現(xiàn)的。為了簡單起見,沒有包含錯誤處理和支持Unicode的代碼。
HANDLE hThread;
char szLibPath[_MAX_PATH]; // "LibSpy.dll"的文件名
// (包含全路徑!);
void* pLibRemote; // szLibPath 將要復(fù)制到地址
DWORD hLibModule; //已加載的DLL的基地址(HMODULE);
HMODULE hKernel32 = ::GetModuleHandle("Kernel32");

//初始化 szLibPath
//...

// 1. 在遠程進程中為szLibPath 分配內(nèi)存
// 2. 寫szLibPath到分配的內(nèi)存
pLibRemote = ::VirtualAllocEx( hProcess, NULL, sizeof(szLibPath),
MEM_COMMIT, PAGE_READWRITE );
::WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath,
sizeof(szLibPath), NULL );


// 加載 "LibSpy.dll" 到遠程進程
// (通過 CreateRemoteThread & LoadLibrary)
hThread = ::CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress( hKernel32,
"LoadLibraryA" ),
pLibRemote, 0, NULL );
::WaitForSingleObject( hThread, INFINITE );

//取得DLL的基地址
::GetExitCodeThread( hThread, &hLibModule );

//掃尾工作
::CloseHandle( hThread );
::VirtualFreeEx( hProcess, pLibRemote, sizeof(szLibPath), MEM_RELEASE );

我們放在DllMain中的真正要注入的代碼(比如為SendMessage)現(xiàn)在已經(jīng)被執(zhí)行了(由于DLL_PROCESS_ATTACH),所以現(xiàn)在可以把DLL從目的進程中卸載了。

// 從目標(biāo)進程卸載LibSpu.dll
// (通過 CreateRemoteThread & FreeLibrary)
hThread = ::CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress( hKernel32,
"FreeLibrary" ),
(void*)hLibModule, 0, NULL );
::WaitForSingleObject( hThread, INFINITE );

// 掃尾工作
::CloseHandle( hThread );

進程間通訊
到 目前為止,我們僅僅討論了任何向遠程進程注入DLL,然而,在多數(shù)情況下被注入的DLL需要和你的程序以某種方式通訊(記住,那個DLL是被映射到遠程進 程中的,而不是在你的本地程序中!)。以密碼間諜為例:那個DLL需要知道包含了密碼的的控件的句柄。很明顯,這個句柄是不能在編譯期間硬編碼 (hardcoded)進去的。同樣,當(dāng)DLL得到密碼后,它也需要把密碼發(fā)回我們的程序。

幸運的是,這個問題有很多種解決方案:文件映 射(Mapping),WM_COPYDATA,剪貼板等。還有一種非常便利的方法#pragma data_seg。這里我不想深入討論因為它們在MSDN(看一下Interprocess Communications部分)或其他資料中都有很好的說明。我在LibSpy中使用的是#pragma data_seg。

你可以在本文章的開頭找到LibSpy及源代碼的下載鏈接。

Ⅲ.CreateRemoteThread和WriteProcessMemory技術(shù)
示例程序:WinSpy

另一種注入代碼到其他進程地址空間的方法是使用WriteProcessMemory API。這次你不用編寫一個獨立的DLL而是直接復(fù)制你的代碼到遠程進程(WriteProcessMemory)并用CreateRemoteThread執(zhí)行之。

讓我們看一下CreateRemoteThread的聲明:
HANDLE CreateRemoteThread(
HANDLE hProcess, // handle to process to create thread in
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security
// attributes
DWORD dwStackSize, // initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread
// function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to returned thread identifier
);

和CreateThread相比,有一下不同:

●增加了hProcess參數(shù)。這是要在其中創(chuàng)建線程的進程的句柄。
●CreateRemoteThread的lpStartAddress參數(shù)必須指向遠程進程的地址空間中的函數(shù)。這個函數(shù)必須存在于遠程進程中,所以我們不能簡單地傳遞一個本地ThreadFucn的地址,我們必須把代碼復(fù)制到遠程進程。
●同樣,lpParameter參數(shù)指向的數(shù)據(jù)也必須存在于遠程進程中,我們也必須復(fù)制它。

現(xiàn)在,我們總結(jié)一下使用該技術(shù)的步驟:

1. 得到遠程進程的HANDLE(OpenProcess)。
2. 在遠程進程中為要注入的數(shù)據(jù)分配內(nèi)存(VirtualAllocEx)、
3. 把初始化后的INJDATA結(jié)構(gòu)復(fù)制到分配的內(nèi)存中(WriteProcessMemory)。
4. 在遠程進程中為要注入的數(shù)據(jù)分配內(nèi)存(VirtualAllocEx)。
5. 把ThreadFunc復(fù)制到分配的內(nèi)存中(WriteProcessMemory)。
6. 用CreateRemoteThread啟動遠程的ThreadFunc。
7. 等待遠程線程的結(jié)束(WaitForSingleObject)。
8. 從遠程進程取回指執(zhí)行結(jié)果(ReadProcessMemory 或 GetExitCodeThread)。
9. 釋放第2、4步分配的內(nèi)存(VirtualFreeEx)。
10. 關(guān)閉第6、1步打開打開的句柄。

另外,編寫ThreadFunc時必須遵守以下規(guī)則:
1. ThreadFunc不能調(diào)用除kernel32.dll和user32.dll之外動態(tài)庫中的API函數(shù)。只有kernel32.dll和 user32.dll(如果被加載)可以保證在本地和目的進程中的加載地址是一樣的。(注意:user32并不一定被所有的Win32進程加載!)參考附 錄A。如果你需要調(diào)用其他庫中的函數(shù),在注入的代碼中使用LoadLibrary和GetProcessAddress強制加載。如果由于某種原因,你需 要的動態(tài)庫已經(jīng)被映射進了目的進程,你也可以使用GetMoudleHandle代替LoadLibrary。同樣,如果你想在ThreadFunc中調(diào) 用你自己的函數(shù),那么就分別復(fù)制這些函數(shù)到遠程進程并通過INJDATA把地址提供給ThreadFunc。
2. 不要使用static字符串。把所有的字符串提供INJDATA傳遞。為什么?編譯器會把所有的靜態(tài)字符串放在可執(zhí)行文件的“.data”段,而僅僅在代 碼中保留它們的引用(即指針)。這樣,遠程進程中的ThreadFunc就會執(zhí)行不存在的內(nèi)存數(shù)據(jù)(至少沒有在它自己的內(nèi)存空間中)。
3. 去掉編譯器的/GZ編譯選項。這個選項是默認的(看附錄B)。
4. 要么把ThreadFunc和AfterThreadFunc聲明為static,要么關(guān)閉編譯器的“增量連接(incremental linking)”(看附錄C)。
5. ThreadFunc中的局部變量總大小必須小于4k字節(jié)(看附錄D)。注意,當(dāng)degug編譯時,這4k中大約有10個字節(jié)會被事先占用。
6. 如果有多于3個switch分支的case語句,必須像下面這樣分割開,或用if-else if代替:

switch( expression ) {
case constant1: statement1; goto END;
case constant2: statement2; goto END;
case constant3: statement2; goto END;
}
switch( expression ) {
case constant4: statement4; goto END;
case constant5: statement5; goto END;
case constant6: statement6; goto END;
}
END:
(參考附錄E)

如果你不按照這些游戲規(guī)則玩的話,你注定會使目的進程掛掉!記住,不要妄想遠程進程中的任何數(shù)據(jù)會和你本地進程中的數(shù)據(jù)存放在相同內(nèi)存地址!(參看附錄F)
(原 話如此:You will almost certainly crash the target process if you don't play by those rules. Just remember: Don't assume anything in the target process is at the same address as it is in your process.)


GetWindowTextRemote(A/W)

所有取得遠程edit中文本的工作都被封裝進這個函數(shù):GetWindowTextRemote(A/W):
int GetWindowTextRemoteA( HANDLE hProcess, HWND hWnd, LPSTR lpString );
int GetWindowTextRemoteW( HANDLE hProcess, HWND hWnd, LPWSTR lpString );

參數(shù):
hProcess
目的edit所在的進程句柄
hWnd
目的edit的句柄
lpString
接收字符串的緩沖

返回值:
成功復(fù)制的字符數(shù)。

讓我們看以下它的部分代碼,特別是注入的數(shù)據(jù)和代碼。為了簡單起見,沒有包含支持Unicode的代碼。

INJDATA

typedef LRESULT (WINAPI *SENDMESSAGE)(HWND,UINT,WPARAM,LPARAM);

typedef struct {
HWND hwnd; // handle to edit control
SENDMESSAGE fnSendMessage; // pointer to user32!SendMessageA

char psText[128]; // buffer that is to receive the password
} INJDATA;


INJDATA 是要注入遠程進程的數(shù)據(jù)。在把它的地址傳遞給SendMessageA之前,我們要先對它進行初始化。幸運的是unse32.dll在所有的進程中(如果 被映射)總是被映射到相同的地址,所以SendMessageA的地址也總是相同的,這也保證了傳遞給遠程進程的地址是有效的。

ThreadFunc

static DWORD WINAPI ThreadFunc (INJDATA *pData)
{
pData->fnSendMessage( pData->hwnd, WM_GETTEXT, // 得到密碼
sizeof(pData->psText),
(LPARAM)pData->psText );
return 0;
}

// This function marks the memory address after ThreadFunc.
// int cbCodeSize = (PBYTE) AfterThreadFunc - (PBYTE) ThreadFunc.
static void AfterThreadFunc (void)
{
}

ThreadFunc是遠程線程實際執(zhí)行的代碼。
● 注意AfterThreadFunc是如何計算ThreadFunc的代碼大小的。一般地,這不是最好的辦法,因為編譯器會改變你的函數(shù)中代碼的順序(比 如它會把ThreadFunc放在AfterThreadFunc之后)。然而,你至少可以確定在同一個工程中,比如在我們的WinSpy工程中,你函數(shù) 的順序是固定的。如果有必要,你可以使用/ORDER連接選項,或者,用反匯編工具確定ThreadFunc的大小,這個也許會更好。

如何用該技術(shù)子類(subclass)一個遠程控件
示例程序:InjectEx

讓我們來討論一個更復(fù)雜的問題:如何子類屬于其他進程的一個控件?

首先,要完成這個任務(wù),你必須復(fù)制兩個函數(shù)到遠程進程:
1. ThreadFunc,這個函數(shù)通過調(diào)用SetWindowLong API來子類遠程進程中的控件,
2. NewProc, 那個控件的新窗口過程(Window Procedure)。

然 而,最主要的問題是如何傳遞數(shù)據(jù)到遠程的NewProc。因為NewProc是一個回調(diào)(callback)函數(shù),它必須符合特定的要求(譯者注:這里指 的主要是參數(shù)個數(shù)和類型),我們不能再簡單地傳遞一個INJDATA的指針作為它的參數(shù)。幸運的我已經(jīng)找到解決這個問題的方法,而且是兩個,但是都要借助 于匯編語言。我一直都努力避免使用匯編,但是這一次,我們逃不掉了,沒有匯編不行的。

解決方案1
看下面的圖片:


不 知道你是否注意到了,INJDATA緊挨著NewProc放在NewProc的前面?這樣的話在編譯期間NewProc就可以知道INJDATA的內(nèi)存地 址。更精確地說,它知道INJDATA相對于它自身地址的相對偏移,但是這并不是我們真正想要的?,F(xiàn)在,NewProc看起來是這個樣子:
static LRESULT CALLBACK NewProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
INJDATA* pData = (INJDATA*) NewProc; // pData 指向
// NewProc;
pData--; // 現(xiàn)在pData指向INJDATA;
// 記住,INJDATA 在遠程進程中剛好位于
// NewProc的緊前面;

//-----------------------------
// 子類代碼
// ........
//-----------------------------

//調(diào)用用來的的窗口過程;
// fnOldProc (由SetWindowLong返回) 是被ThreadFunc(遠程進程中的)初始化
// 并且存儲在遠程進程中的INJDATA里的;
return pData->fnCallWindowProc( pData->fnOldProc,
hwnd,uMsg,wParam,lParam );
}

然而,還有一個問題,看第一行:
INJDATA* pData = (INJDATA*) NewProc;

pData被硬編碼為我們進程中NewProc的地址,但這是不對的。因為NewProc會被復(fù)制到遠程進程,那樣的話,這個地址就錯了。

用C/C++沒有辦法解決這個問題,可以用內(nèi)聯(lián)的匯編來解決??葱薷暮蟮腘ewProc:

static LRESULT CALLBACK NewProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
// 計算INJDATA 的地址;
// 在遠程進程中,INJDATA剛好在
//NewProc的前面;
INJDATA* pData;
_asm {
call dummy
dummy:
pop ecx // <- ECX 中存放當(dāng)前的EIP
sub ecx, 9 // <- ECX 中存放NewProc的地址
mov pData, ecx
}
pData--;

//-----------------------------
// 子類代碼
// ........
//-----------------------------

// 調(diào)用原來的窗口過程
return pData->fnCallWindowProc( pData->fnOldProc,
hwnd,uMsg,wParam,lParam );
}

這 是什么意思?每個進程都有一個特殊的寄存器,這個寄存器指向下一條要執(zhí)行的指令的內(nèi)存地址,即32位Intel和AMD處理器上所謂的EIP寄存器。因為 EIP是個特殊的寄存器,所以你不能像訪問通用寄存器(EAX,EBX等)那樣來訪問它。換句話說,你找不到一個可以用來尋址EIP并且對它進行讀寫的操 作碼(OpCode)。然而,EIP同樣可以被JMP,CALL,RET等指令隱含地改變(事實上它一直都在改變)。讓我們舉例說明32位的Intel和 AMD處理器上CALL/RET是如何工作的吧:

當(dāng)我們用CALL調(diào)用一個子程序時,這個子程序的地址被加載進EIP。同時,在EIP被改變之前,它以前的值會被自動壓棧(在后來被用作返回指令指針[return instruction-pointer])。在子程序的最后RET指令自動把這個值從棧中彈出到EIP。

現(xiàn)在我們知道了如何通過CALL和RET來修改EIP的值了,但是如何得到他的當(dāng)前值?
還記得CALL把EIP的值壓棧了嗎?所以為了得到EIP的值我們調(diào)用了一個“假(dummy)函數(shù)”然后彈出棧頂值。看一下編譯過的NewProc:

Address OpCode/Params Decoded instruction
--------------------------------------------------
:00401000 55 push ebp ; entry point of
; NewProc
:00401001 8BEC mov ebp, esp
:00401003 51 push ecx
:00401004 E800000000 call 00401009 ; *a* call dummy
:00401009 59 pop ecx ; *b*
:0040100A 83E909 sub ecx, 00000009 ; *c*
:0040100D 894DFC mov [ebp-04], ecx ; mov pData, ECX
:00401010 8B45FC mov eax, [ebp-04]
:00401013 83E814 sub eax, 00000014 ; pData--;
.....
.....
:0040102D 8BE5 mov esp, ebp
:0040102F 5D pop ebp
:00401030 C21000 ret 0010

a. 一個假的函數(shù)調(diào)用;僅僅跳到下一條指令并且(譯者注:更重要的是)把EIP壓棧。
b. 彈出棧頂值到ECX。ECX就保存的EIP的值;這也就是那條“pop ECX”指令的地址。
c. 注意從NewProc的入口點到“pop ECX”指令的“距離”為9字節(jié);因此把ECX減去9就得到的NewProc的地址了。

這 樣一來,不管被復(fù)制到什么地方,NewProc總能正確計算自身的地址了!然而,要注意從NewProc的入口點到“pop ECX”的距離可能會因為你的編譯器/鏈接選項的不同而不同,而且在Release和Degub版本中也是不一樣的。但是,不管怎樣,你仍然可以在編譯期 知道這個距離的具體值。
1. 首先,編譯你的函數(shù)。
2. 在反匯編器(disassembler)中查出正確的距離值。
3. 最后,使用正確的距離值重新編譯你的程序。

這也是InjectEx中使用的解決方案。InjectEx和HookInjEx類似,交換開始按鈕上的鼠標(biāo)左右鍵點擊事件。


解決方案2

在遠程進程中把INJDATA放在NewProc的前面并不是唯一的解決方案??匆幌孪旅娴腘ewProc:
static LRESULT CALLBACK NewProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam ) // second message parameter
{
INJDATA* pData = 0xA0B0C0D0; // 一個假值

//-----------------------------
// 子類代碼
// ........
//-----------------------------

// 調(diào)用以前的窗口過程
return pData->fnCallWindowProc( pData->fnOldProc,
hwnd,uMsg,wParam,lParam );
}

這 里,0XA0B0C0D0僅僅是INJDATA在遠程進程中的地址的占位符(placeholder)。你無法在編譯期得到這個值,然而你在調(diào)用 VirtualAllocEx(為INJDATA分配內(nèi)存時)后確實知道INJDATA的地址!(譯者注:就是VirtualAllocEx的返回值)

我們的NewProc編譯后大概是這個樣子:
Address OpCode/Params Decoded instruction
--------------------------------------------------
:00401000 55 push ebp
:00401001 8BEC mov ebp, esp
:00401003 C745FCD0C0B0A0 mov [ebp-04], A0B0C0D0
:0040100A ...
....
....
:0040102D 8BE5 mov esp, ebp
:0040102F 5D pop ebp
:00401030 C21000 ret 0010

編譯后的機器碼應(yīng)該為:558BECC745FCD0C0B0A0......8BE55DC21000。

現(xiàn)在,你這么做:
1. 把INJDATA,ThreadFunc和NewFunc復(fù)制到目的進程。
2. 改變NewPoc的機器碼,讓pData指向INJDATA的真實地址。
比如,假設(shè)INJDATA的的真實地址(VirtualAllocEx的返回值)為0x008a0000,你把NewProc的機器碼改為:

558BECC745FCD0C0B0A0......8BE55DC21000 <- 修改前的 NewProc 1
558BECC745FC00008A00......8BE55DC21000 <- 修改后的 NewProc

也就是說,你把假值 A0B0C0D0改為INJDATA的真實地址2
3. 開始指向遠程的ThreadFunc,它子類了遠程進程中的控件。

&sup1; 你可能會問,為什么A0B0C0D0和008a0000在編譯后的機器碼中為逆序的。這時因為Intel和AMD處理器使用littl-endian標(biāo)記 法(little-endian notation)來表示它們的(多字節(jié))數(shù)據(jù)。換句話說:一個數(shù)的低字節(jié)(low-order byte)在內(nèi)存中被存放在最低位,高字節(jié)(high-order byte)存放在最高位。
想像一下,存放在四個字節(jié)中的單詞“UNIX”,在big-endia系統(tǒng)中被存儲為“UNIX”,在little-endian系統(tǒng)中被存儲為“XINU”。

&sup2; 一些蹩腳的破解者用類似的方法來修改可執(zhí)行文件的機器碼,但是一個程序一旦載入內(nèi)存,就不能再更改自身的機器碼(一個可執(zhí)行文件的.text段是寫保護 的)。我們能修改遠程進程中的NewProc是因為它所處的那塊內(nèi)存在分配時給予了PAGE_EXECUTE_READWRITE屬性。

何時使用CreateRemoteThread和WriteProcessMemory技術(shù)

通 過CreateRemoteThread和WriteProcessMemory來注入代碼的技術(shù),和其他兩種方法相比,不需要一個額外的DLL文件,因 此更靈活,但也更復(fù)雜更危險。一旦你的ThreadFunc中有錯誤,遠程線程會立即崩潰(看附錄F)。調(diào)試一個遠程的ThreadFunc也是場惡夢, 所以你應(yīng)該在僅僅注入若干條指令時才使用這個方法。要注入大量的代碼還是使用另外兩種方法吧。

再說一次,你可以在文章的開頭部分下載到WinSpy,InjectEx和它們的源代碼。


寫在最后的話

最后,我們總結(jié)一些目前還沒有提到的東西:

方法 適用的操作系統(tǒng) 可操作的進程進程
I. Windows鉤子 Win9x 和WinNT 僅限鏈接了USER32.DLL的進程1
II. CreateRemoteThread & LoadLibrary 僅WinNT2 所有進程3,包括系統(tǒng)服務(wù)4
III. CreateRemoteThread & WriteProcessMemory 近WinNT 所有進程,包括系統(tǒng)服務(wù)

1. 很明顯,你不能給一個沒有消息隊列的線程掛鉤。同樣SetWindowsHookEx也對系統(tǒng)服務(wù)不起作用(就算它們連接了USER32)。
2. 在Win9x下沒有CreateRemoteThread和VirtualAllocEx(事實上可以在9x上模擬它們,但是到目前為止還只是個神話)
3. 所有進程 = 所有的Win32進程 + csrss.exe
本 地程序(native application)比如smss.exe, os2ss.exe, autochk.exe,不使用Win32 APIs,也沒有連接到kernel32.dll。唯一的例外是csrss.exe,win32子系統(tǒng)自身。它是一個本地程序,但是它的一些庫(比如 winsrv.dll)需要Win32 DLL包括kernel32.dll.
4.如果你向注入代碼到系統(tǒng)服務(wù)或csrss.exe,在打開遠程進程的句柄(OpenProcess)之前把你的進程的優(yōu)先級調(diào)整為“SeDebugprovilege”(AdjustTokenPrivileges)。


大概就這些了吧。還有一點你需要牢記在心:你注入的代碼(特別是存在錯誤時)很容易就會把目的進程拖垮。記住:責(zé)任隨權(quán)利而來(Power comes with responsibility)!

這篇文章中的很多例子都和密碼有關(guān),看過這篇文章后你可能也會對Zhefu Zhang(譯者注:大概是一位中國人,張哲夫??)寫的Supper Password Spy++感興趣。他講解了如何從IE的密碼框中得到密碼,也說了如何保護你的密碼不被這種攻擊。

最后一點:讀者的反饋是文章作者的唯一報酬,所以如果你認為這篇文章有作用,請留下你的評論或給它投票。更重要的是,如果你發(fā)現(xiàn)有錯誤或bug;或你認為什么地方做得還不夠好,有需要改進的地方;或有不清楚的地方也都請告訴我。

感謝
首 先,我要感謝我在CodeGuru(這篇文章最早是在那兒發(fā)表的)的讀者,正是由于你們的鼓勵和支持這篇文章才得以從最初的1200單詞發(fā)展到今天這樣 6000單詞的“龐然大物”。如果說有一個人我要特別感謝的話,他就是Rado Picha。這篇文章的一部分很大程度上得益于他對我的建議和幫助。最后,但也不能算是最后,感謝Susan Moore,他幫助我跨越了那個叫做“英語”的雷區(qū),讓這篇文章更加通順達意。
――――――――――――――――――――――――――――――――――――
附錄
A) 為什么kernel32.dll和user32.dll中是被映射到相同的內(nèi)存地址?
我的假定:以為微軟的程序員認為這么做可以優(yōu)化速度。讓我們來解釋一下這是為什么。
一般來說,一個可執(zhí)行文件包含幾個段,其中一個為“.reloc”段。

當(dāng) 鏈接器生成EXE或DLL時,它假定這個文件會被加載到一個特定的地址,也就是所謂的假定/首選加載/基地址(assumed/preferred load/base address)。內(nèi)存映像(image)中的所有絕對地址都時基于該“鏈接器假定加載地址”的。如果由于某些原因,映像沒有加載到這個地址,那么PE加 載器(PE loader)就不得不修正該映像中的所有絕對地址。這就是“.reloc”段存在的原因:它包含了一個該映像中所有的“鏈接器假定地址”與真正加載到的 地址之間的差異的列表(注意:編譯器產(chǎn)生的大部分指令都使用一種相對尋址模式,所以,真正需要重定位[relocation]的地方并沒有你想像的那么 多)。如果,從另一方面說,加載器可以把映像加載到鏈接器首選地址,那么“.reloc”段就會被徹底忽略。

但是,因為每一個Win32程序都需要kernel32.dll,大部分需要user32.dll,所以如果總是把它們兩個映射到其首選地址,那么加載器就不用修正kernel32.dll和user32.dll中的任何(絕對)地址,加載時間就可以縮短。

讓我們用下面的例子來結(jié)束這個討論:
把 一個APP.exe的加載地址改為kernel32的(/base:"0x77e80000")或user32的 (/base:"0x77e10000")首選地址。如果App.exe沒有引入UESE32,就強制LoadLibrary。然后編譯App.exe, 并運行它。你會得到一個錯誤框(“非法的系統(tǒng)DLL重定位”),App.exe無法被加載。

為什么?當(dāng)一個進程被創(chuàng)建時,Win2000 和WinXP的加載器會檢查kernel32.dll和user32.dll是否被映射到它們的首選地址(它們的名稱是被硬編碼進加載器的),如果沒有, 就會報錯。在WinNT4 中ole32.dll也會被檢查。在WinNT3.51或更低版本中,則不會有任何檢查,kernel32.dll和user32.dll可以被加載到任 何地方。唯一一個總是被加載到首選地址的模塊是ntdll.dll,加載器并不檢查它,但是如果它不在它的首選地址,進程根本無法創(chuàng)建。

總結(jié)一下:在WinNT4或更高版本的操作系統(tǒng)中:
●總被加載到它們的首選地址的DLL有:kernel32.dll,user32.dll和ntdll.dll。
●Win32程序(連同csrss.exe)中一定存在的DLL:kernel32.dll和ntdll.dll。
●所有進程中都存在的dll:ntdll.dll。

B) /GZ編譯開關(guān)
在Debug時,/GZ開關(guān)默認是打開的。它可以幫你捕捉一些錯誤(詳細內(nèi)容參考文檔)。但是它對我們的可執(zhí)行文件有什么影響呢?

當(dāng) /GZ被使用時,編譯器會在每個函數(shù),包含函數(shù)調(diào)用中添加額外的代碼(添加到每個函數(shù)的最后面)來檢查ESP棧指針是否被我們的函數(shù)更改過。但是,等 等,ThreadFunc中被添加了一個函數(shù)調(diào)用?這就是通往災(zāi)難的道路。因為,被復(fù)制到遠程進程中的ThreadFunc將調(diào)用一個在遠程進程中不存在 的函數(shù)。

C) static函數(shù)和增量連接(Incremental linking)
增量連接可以縮短連接的時間,在增量編譯 時,每個函數(shù)調(diào)用都是通過一個額外的JMP指令來實現(xiàn)的(一個例外就是被聲明為static的函數(shù)!)這些JMP允許連接器移動函數(shù)在內(nèi)存中的位置而不用 更新調(diào)用該函數(shù)的CALL。但是就是這個JMP給我們帶來了麻煩:現(xiàn)在ThreadFunc和AfterThreadFunc將指向JMP指令而不是它們 的真實代碼。所以,當(dāng)計算ThreadFunc的大小時:
const int cbCodeSize = ((LPBYTE) AfterThreadFunc - (LPBYTE) ThreadFunc);
你實際得到的將是指向ThreadFunc和AfterThreadFunc的JMP指令之間的“距離”。現(xiàn)在假設(shè)我們的ThreadFunc在004014C0,和其對應(yīng)的JMP指令在00401020
:00401020 jmp 004014C0
...
:004014C0 push EBP ; ThreadFunc的真實地址
:004014C1 mov EBP, ESP
...
然后,
WriteProcessMemory( .., &ThreadFunc, cbCodeSize, ..);
將把“JMP 004014C0”和其后的cbCodeSize范圍內(nèi)的代碼而不是ThreadFunc復(fù)制到遠程進程。遠程線程首先會執(zhí)行“JMP 004010C0”,然后一直執(zhí)行到這個進程代碼的最后一條指令(譯者注:這當(dāng)然不是我們想要的結(jié)果)。

然 而,如果一個函數(shù)被聲明為static,就算使用增量連接,也不會被替換為JMP指令。這就是為什么我在規(guī)則#4中說把ThreadFunc和 AfterThreadFunc聲明為static或禁止增量連接的原因了。(關(guān)于增量連接的其他方面請參看Matt Pietrek寫的“Remove Fatty Deposits from Your Applications Using Our 32-bit Liposuction Tools”)

D) 為什么ThreadFunc只能有4K的局部變量?
局部變量總是保存在棧上的。假設(shè)一個函數(shù)有256字節(jié)的局部變量,當(dāng)進入該函數(shù)時(更確切地說是在functions prologue中),棧指針會被減去256。像下面的函數(shù):
void Dummy(void) {
BYTE var[256];
var[0] = 0;
var[1] = 1;
var[255] = 255;
}
會被編譯為類似下面的指令:
:00401000 push ebp
:00401001 mov ebp, esp
:00401003 sub esp, 00000100 ; change ESP as storage for
; local variables is needed
:00401006 mov byte ptr [esp], 00 ; var[0] = 0;
:0040100A mov byte ptr [esp+01], 01 ; var[1] = 1;
:0040100F mov byte ptr [esp+FF], FF ; var[255] = 255;
:00401017 mov esp, ebp ; restore stack pointer
:00401019 pop ebp
:0040101A ret

請 注意在上面的例子中ESP(棧指針)是如何被改變的。但是如果一個函數(shù)有多于4K的局部變量該怎么辦?這種情況下,棧指針不會被直接改變,而是通過一個函 數(shù)調(diào)用來正確實現(xiàn)ESP的改變。但是就是這個“函數(shù)調(diào)用”導(dǎo)致了ThreadFunc的崩潰,因為它在遠程進程中的拷貝將會調(diào)用一個不存在的函數(shù)。

讓我們來看看文檔關(guān)于棧探針(stack probes)和/Gs編譯選項的說明:
“/Gssize選項是一個允許你控制棧探針的高級特性。棧探針是編譯器插入到每個函數(shù)調(diào)用中的一系列代碼。當(dāng)被激活時,棧探針將溫和地按照存儲函數(shù)局部變量所需要的空間大小來移動

如果一個函數(shù)需要大于size指定的局部變量空間,它的棧探針將被激活。默認的size為一個頁的大小(在80x86上為4k)。這個值可以使一個Win32程序和Windows NT的虛擬內(nèi)存管理程序和諧地交互,在運行期間向程序棧增加已提交的內(nèi)存總數(shù)。

我 能確定你們對上面的敘述(“棧探針將溫和地按照存儲函數(shù)局部變量所需要的空間大小來移動”)感到奇怪。這些編譯選項(他們的描述!)有時候真的讓人很惱 火,特別是當(dāng)你想真的了解它們是怎么工作的時候。打個比方,如果一個函數(shù)需要12kb的空間來存放局部變量,棧上的內(nèi)存是這樣“分配”的
sub esp, 0x1000 ; 先“分配”4 Kb
test [esp], eax ; touches memory in order to commit a
; new page (if not already committed)
sub esp, 0x1000 ; “分配”第二個 4 Kb
test [esp], eax ; ...
sub esp, 0x1000
test [esp], eax

注 意棧指針是如何以4Kb為單位移動的,更重要的是每移動一步后使用test對棧底的處理(more importantly, how the bottom of the stack is "touched" after each step)。這可以確保了在“分配”下一個頁之前,包含棧底的頁已經(jīng)被提交。

繼續(xù)閱讀文檔的說明:
“每一個新的線程會擁有 (receives)自己的??臻g,這包括已經(jīng)提交的內(nèi)存和保留的內(nèi)存。默認情況下每個線程使用1MB的保留內(nèi)存和一個頁大小的以提交內(nèi)存。如果有必要, 系統(tǒng)將從保留內(nèi)存中提交一個頁?!?#xff08;看MSDN中GreateThread > dwStackSize > “Thread Stack Size”)

..現(xiàn)在為什么文檔中說“這個值可以使一個Win32程序和Windows NT的虛擬內(nèi)存管理程序和諧地交互”也很清楚了。

E) 為什么我要把多于3個case分支的swith分割開來呢?
同樣,用例子來說明會簡單些:
int Dummy( int arg1 )
{
int ret =0;

switch( arg1 ) {
case 1: ret = 1; break;
case 2: ret = 2; break;
case 3: ret = 3; break;
case 4: ret = 0xA0B0; break;
}
return ret;
}
將會被編譯為類似下面的代碼:
Address OpCode/Params Decoded instruction
--------------------------------------------------
; arg1 -> ECX
:00401000 8B4C2404 mov ecx, dword ptr [esp+04]
:00401004 33C0 xor eax, eax ; EAX = 0
:00401006 49 dec ecx ; ECX --
:00401007 83F903 cmp ecx, 00000003
:0040100A 771E ja 0040102A

; JMP to one of the addresses in table ***
; note that ECX contains the offset
:0040100C FF248D2C104000 jmp dword ptr [4*ecx+0040102C]

:00401013 B801000000 mov eax, 00000001 ; case 1: eax = 1;
:00401018 C3 ret
:00401019 B802000000 mov eax, 00000002 ; case 2: eax = 2;
:0040101E C3 ret
:0040101F B803000000 mov eax, 00000003 ; case 3: eax = 3;
:00401024 C3 ret
:00401025 B8B0A00000 mov eax, 0000A0B0 ; case 4: eax = 0xA0B0;
:0040102A C3 ret
:0040102B 90 nop

; 地址表 ***
:0040102C 13104000 DWORD 00401013 ; jump to case 1
:00401030 19104000 DWORD 00401019 ; jump to case 2
:00401034 1F104000 DWORD 0040101F ; jump to case 3
:00401038 25104000 DWORD 00401025 ; jump to case 4

看到switch-case是如何實現(xiàn)的了嗎?
它 沒有去測試每個case分支,而是創(chuàng)建了一個地址表(address table)。我們簡單地計算出在地址表中偏移就可以跳到正確的case分支。想想吧,這真是一個進步,假設(shè)你有一個50個分支的switch語句,假如 沒有這個技巧,你不的不執(zhí)行50次CMP和JMP才能到達最后一個case,而使用地址表,你可以通過一次查表即跳到正確的case。使用算法的時間復(fù)雜 度來衡量:我們把O(2n)的算法替換成了O(5)的算法,其中:
1. O代表最壞情況下的時間復(fù)雜度。
2. 我們假設(shè)計算偏移(即查表)并跳到正確的地址需要5個指令。

現(xiàn)在,你可能認為上面的情況僅僅是因為case常量選擇得比較好,(1,2,3,4,5)。幸運的是,現(xiàn)實生活中的大多數(shù)例子都可以應(yīng)用這個方案,只是偏移的計算復(fù)雜了一點而已。但是,有兩個例外:
●如果少于3個case分支,或
●如果case常量是完全相互無關(guān)的。(比如 1, 13, 50, 1000)。
最終的結(jié)果和你使用普通的if-else if是一樣的。

有趣的地方:如果你曾經(jīng)為case后面只能跟常量而迷惑的話,現(xiàn)在你應(yīng)該知道為什么了吧。這個值必須在編譯期間就確定下來,這樣才能創(chuàng)建地址表。

回到我們的問題!
注意到0040100C處的JMP指令了嗎?我們來看看Intel的文檔對十六進制操作碼FF的說明:
Opcode Instruction Description
FF /4 JMP r/m32 Jump near, absolute indirect, address given in r/m32

JMP使用了絕對地址!也就是說,它的其中一個操作數(shù)(在這里是0040102C)代表一個絕對地址。還用多說嗎?現(xiàn)在遠程的ThreadFunc會盲目第在地址表中004101C然后跳到這個錯誤的地方,馬上使遠程進程掛掉了。

F) 到底是什么原因使遠程進程崩潰了?
如果你的遠程進程崩潰了,原因可能為下列之一:
1. 你引用了ThreadFunc中一個不存在的字符串。
2. ThreadFunc中一個或多個指令使用了絕對尋址(看附錄E中的例子)
3. ThreadFunc調(diào)用了一個不存在的函數(shù)(這個函數(shù)調(diào)用可能是編譯器或連接器添加的)。這時候你需要在反匯編器中尋找類似下面的代碼:
:004014C0 push EBP ; entry point of ThreadFunc
:004014C1 mov EBP, ESP
...
:004014C5 call 0041550 ; 在這里崩潰了
; remote process
...
:00401502 ret
如果這個有爭議的CALL是編譯器添加的(因為一些不該打開的編譯開關(guān)比如/GZ打開了),它要么在ThreadFunc的開頭要么在ThreadFunc接近結(jié)尾的地方

不管在什么情況下,你使用CreateRemoteThread & WriteProcessMemory技術(shù)時必須萬分的小心,特別是編譯器/連接器的設(shè)置,它們很可能會給你的ThreadFunc添加一些帶來麻煩的東西。

轉(zhuǎn)載于:https://www.cnblogs.com/milantgh/p/3880695.html

總結(jié)

以上是生活随笔為你收集整理的向其他进程注入代码的三种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

粉嫩av一区二区三区入口 | 欧美性生交大片免网 | 国产一区在线视频 | 国产精品成人免费精品自在线观看 | 亚洲成人第一区 | 日韩网站在线看片你懂的 | 色中文字幕在线观看 | 又长又大又黑又粗欧美 | 免费看黄视频 | 国产黄色片免费在线观看 | 91人人视频在线观看 | 久久在草 | 久久久久成 | 精品久久亚洲 | 亚洲女在线 | 天天干天天综合 | 欧美精品乱码久久久久 | 91cn国产在线| 丁香五香天综合情 | 国产精品高清在线 | 精品久久久久国产免费第一页 | 久操视频在线播放 | 日韩欧美一区二区三区视频 | 日本久久精品 | 免费观看www视频 | 精品一二三区 | 五月精品| a黄在线观看| 久久成人18免费网站 | 在线亚洲欧美视频 | 超碰97人人射妻 | 91福利视频免费 | 99国产精品免费网站 | 青青河边草免费直播 | 91在线观看黄 | 欧美伦理一区 | 亚洲天堂精品 | 亚洲国产三级在线观看 | 国产一区二区不卡视频 | 黄色亚洲免费 | 免费黄色网止 | 99电影456麻豆 | 天天色综合久久 | 欧日韩在线视频 | 3d黄动漫免费看 | 91大神在线观看视频 | 欧美成人免费在线 | 精品成人久久 | 91成人在线免费观看 | 精品国产三级 | 国产精品原创视频 | 青青久草在线视频 | 日韩av不卡在线播放 | 欧美激情视频在线免费观看 | 日韩av手机在线观看 | 午夜91在线 | 97超碰人人澡| 国产在线精品福利 | 成人黄色电影免费观看 | 97超碰香蕉 | 特黄色大片| 久久这里只有精品1 | 中文字幕色在线视频 | 国产精品成人av在线 | 黄色电影网站在线观看 | 欧美成人xxxxx| 在线 国产 日韩 | 国产中文字幕视频在线观看 | 四虎5151久久欧美毛片 | 国产精品69久久久久 | 97视频在线观看免费 | 欧美在线观看禁18 | 欧美精品久久久久久久久免 | 综合在线亚洲 | 亚洲国产精品影院 | 亚洲欧美国内爽妇网 | 中文字幕在线免费观看视频 | 精品久久久久久国产 | 精品欧美在线视频 | 啪啪免费视频网站 | 青草视频在线免费 | 日韩理论电影网 | 日本少妇视频 | 九九精品视频在线看 | 久草在线这里只有精品 | 久久免费a| 日韩精品一区不卡 | av在线播放免费 | 色综合狠狠干 | 日韩在线电影一区 | 精品国产区 | 亚洲精品国产精品国自产观看 | 91精品国产成人 | 亚洲精品午夜国产va久久成人 | 亚洲自拍自偷 | 最近中文字幕国语免费av | 日日麻批40分钟视频免费观看 | 国产精品白丝jk白祙 | 精品在线观看一区二区 | 亚洲国产精品传媒在线观看 | 在线之家官网 | 欧美日韩中文另类 | 国产中文 | 韩国一区在线 | 久久精品99国产国产精 | 99视频在线免费观看 | 日韩久久精品一区二区 | 久草在线视频首页 | 大型av综合网站 | 成人国产精品av | 亚洲最新av| 毛片888 | 中文 一区二区 | 精品999在线观看 | 麻豆视频入口 | 91精品国产乱码久久 | 99视频在线免费观看 | 久久九九影视网 | 国产涩图 | 久久久久久中文字幕 | 婷婷丁香视频 | 国产尤物视频在线 | 亚洲精品电影在线 | 欧美日韩精品在线 | 99免费视频| 国内精品在线观看视频 | 久久av中文字幕片 | 999精品网| 国产精品 999 | a级片网站 | 欧美坐爱视频 | 激情综合网色播五月 | 免费看毛片在线 | 亚洲va欧美va | 国产精品三级视频 | 24小时日本在线www免费的 | 国产精品电影一区二区 | 国产精品毛片一区二区 | 久久国产精品久久精品 | 国产福利电影网址 | 在线观看免费版高清版 | 美女在线黄 | 色就色,综合激情 | 欧美日韩性视频在线 | 成人动漫一区二区 | 99色网站 | 免费观看第二部31集 | 999国产 | 日韩精品在线一区 | 亚州天堂| 国产精品久久久久av | 久草在线一免费新视频 | 色一色在线| 日本公妇在线观看高清 | 欧美国产在线看 | 久久伊99综合婷婷久久伊 | 伊甸园永久入口www 99热 精品在线 | 日韩理论片在线 | 日韩丝袜在线观看 | 一级黄色片在线观看 | 在线亚洲人成电影网站色www | 久久久久国产一区二区 | 狠狠干中文字幕 | 麻豆免费视频观看 | 黄色av网站在线免费观看 | 国产精品一码二码三码在线 | 久草在线资源观看 | 在线播放一区二区三区 | 91麻豆精品国产91久久久久久 | 国产精品国产自产拍高清av | 久久这里只有精品23 | 免费观看成年人视频 | 亚洲理论在线观看电影 | 欧美一级免费黄色片 | 一区二区中文字幕在线播放 | 毛片网免费| 日韩伦理片一区二区三区 | 正在播放日韩 | 91激情 | 香蕉在线观看 | 91最新在线 | 在线看不卡av | 日韩二区三区在线观看 | 91精品国自产在线偷拍蜜桃 | 99久高清在线观看视频99精品热在线观看视频 | 在线观看www91| 国产不卡免费av | 99精品乱码国产在线观看 | 亚洲午夜电影网 | 亚洲天堂视频在线 | 久久亚洲专区 | 亚洲三级在线播放 | 国产日韩av在线 | 国产日韩欧美在线播放 | 日韩国产精品一区 | 亚州国产精品 | 久久久午夜剧场 | 国产精品一区二区久久国产 | 久久成人国产 | 久久综合影音 | 亚洲精品久久久久999中文字幕 | 欧美美女激情18p | 中文字幕精品久久 | 天天操操操操操操 | 91麻豆精品国产91久久久久 | 91精品啪在线观看国产线免费 | 欧美亚洲国产日韩 | 久久精品视频在线观看 | 国产精品永久免费在线 | 亚洲黄色a| 中文字幕 二区 | 2017狠狠干 | 日韩久久久久久久久 | 国产亚洲字幕 | 日韩黄色免费看 | 天天综合网国产 | 久久91网| 久久高清 | 精品av网站 | 中文字幕亚洲情99在线 | 久久精久久精 | 欧美激情第十页 | 久久91久久久久麻豆精品 | 国产资源在线视频 | 中文字幕在线看视频 | 欧美日韩二区在线 | 亚洲精品福利视频 | 九九九免费视频 | 天天干天天干天天干天天干天天干天天干 | 国产一区二区三区在线 | 国产精品999久久久 久产久精国产品 | 97在线观看免费高清 | 草久电影 | av中文在线观看 | 欧美国产日韩一区二区 | 天天干天天操天天拍 | 国产一区二区三区免费在线 | 一区二区欧美日韩 | 99久久婷婷国产综合亚洲 | 玖玖在线资源 | 91精品久久久久久久91蜜桃 | 国产精品不卡 | 91污污视频在线观看 | 久久国际影院 | 狠狠88综合久久久久综合网 | 美女视频永久黄网站免费观看国产 | 成人黄色小说网 | 91激情视频在线 | 一区二区三区四区不卡 | 国产一区免费 | 亚洲国产人午在线一二区 | 天天干天天操人体 | 五月天电影免费在线观看一区 | 欧美国产日韩一区二区三区 | 亚洲网久久 | 美女精品 | 日韩在线观看的 | 午夜999| 最近中文字幕视频网 | 91av视频在线观看 | 黄色小说在线观看视频 | 黄色av一区 | 免费视频一区二区 | 国产色综合天天综合网 | 日韩av电影中文字幕在线观看 | 人人艹视频 | 中文字幕免费国产精品 | 欧美精品中文 | 亚洲精品美女免费 | 亚洲h在线播放在线观看h | 在线视频a| 四虎国产视频 | 97热在线观看 | 国产精品毛片一区二区三区 | av在线a | 天天综合网在线观看 | 99国产视频在线 | www.在线看片.com| 成人免费观看电影 | 天天激情综合 | 97在线观看视频 | 黄色免费大片 | 日韩黄色免费在线观看 | www.99久久.com | 粉嫩av一区二区三区入口 | 综合五月婷婷 | 91九色在线视频观看 | 亚洲伊人第一页 | 日韩一区视频在线 | 国产免费观看高清完整版 | 午夜电影中文字幕 | 国产精品久久99综合免费观看尤物 | 超碰在线资源 | 在线播放第一页 | 91手机在线看片 | 国产日韩中文字幕在线 | 99热在线观看 | 日韩激情中文字幕 | 在线观看 国产 | 国产一区91| 天天在线免费视频 | 日韩中文免费视频 | 亚洲国产欧美在线人成大黄瓜 | 成人影片免费 | av片中文字幕 | 中文字幕传媒 | 91在线免费观看国产 | 欧美精品在线观看免费 | 日本婷婷色 | 美女久久网站 | 婷婷伊人五月天 | 日韩av中文| 久草在线久草在线2 | 久久伊人免费视频 | 国产成人福利 | 成人黄色av免费在线观看 | 国产精品一区二区在线 | 免费在线观看污网站 | 91女人18片女毛片60分钟 | 国产视 | 亚洲视屏一区 | 国产精品毛片一区 | 久久精品系列 | 91免费网 | 国产视频一区二区在线播放 | 成人av在线电影 | 色综合久久久久综合 | 亚洲香蕉在线观看 | 成人亚洲免费 | 国产五月色婷婷六月丁香视频 | 色久综合 | 久草在线免费色站 | 97天堂网| 婷婷亚洲五月色综合 | 精品免费 | 国产理论片在线观看 | 久久精品久久精品久久39 | 午夜电影中文字幕 | 91九色网站 | 久久99精品国产一区二区三区 | 国产精品一区二区av | 伊人av综合 | 日日夜夜艹| 日日干av| 欧美性春潮 | 高清不卡一区二区三区 | 午夜视频在线观看一区二区三区 | 天天玩天天操天天射 | 69人人| 丁香网婷婷| 国产亚洲精品女人久久久久久 | 中文一区二区三区在线观看 | 久久国产精品99久久久久 | 狠狠干激情 | 欧美精品久久久久久久久老牛影院 | 欧美贵妇性狂欢 | 亚洲天堂精品视频在线观看 | 一区二区三区免费在线播放 | 免费观看一区二区 | 国产精品久久久久久爽爽爽 | 免费av福利| 99精品黄色 | 在线天堂v| 中文字幕一区二区在线观看 | 久久av网 | bbbbb女女女女女bbbbb国产 | 久久国产欧美日韩精品 | av免费网 | 国产超碰在线观看 | 国产一区在线精品 | 精品一二区 | 在线观看国产亚洲 | 欧美,日韩| 成人一级电影在线观看 | 天天干天天操 | 久久精品99久久久久久2456 | 黄色一区三区 | 国产自制av | 91免费在线 | 久青草视频在线观看 | 97av精品| 国产h在线播放 | 午夜精品视频一区 | 亚洲成人av一区二区 | 精品国产不卡 | 精品免费国产一区二区三区四区 | 日韩理论在线观看 | 欧美日韩视频免费看 | 国产中文字幕av | 久久尤物电影视频在线观看 | 久久国产电影院 | 久久99国产精品视频 | 久草在线 | 狠狠色丁香婷综合久久 | 在线 欧美 日韩 | 久久精品一级片 | 亚洲高清视频在线 | 久久免费99精品久久久久久 | 精品久久久久一区二区国产 | 一区二区三区免费网站 | 国产伦精品一区二区三区无广告 | 97色涩| 91人人视频在线观看 | 青青视频一区 | 伊人网av | 欧美一二区在线 | 色婷婷免费视频 | 国产黄在线观看 | 午夜av在线免费 | 麻豆影视在线观看 | 国产国语在线 | 久草资源在线 | 国产成人在线免费观看 | 亚洲欧美综合精品久久成人 | 国产亚洲精品v | 免费在线a | 国产一二三区在线观看 | 国产高清在线免费 | 超碰97在线人人 | 成人性生活大片 | 中文字幕在线观看网站 | 91成年人在线观看 | 亚洲一区欧美精品 | 99爱精品视频 | 久久精品国产成人精品 | 国产精品美女久久久久久久久久久 | 亚洲成人在线免费 | 天天精品视频 | 国产做aⅴ在线视频播放 | 亚洲综合在线五月天 | 中文字幕第一页在线视频 | 六月丁香综合 | 婷婷色网视频在线播放 | 免费a视频| 国产成人一二三 | 久久成人一区 | 亚洲伊人av | 在线观看中文字幕av | 99热在| 久久视频精品在线 | 国产精品久久久久久久久费观看 | 又色又爽又黄 | 久久一区二区三区超碰国产精品 | 麻豆视频一区二区 | 欧美在线aaa | 成人av在线网 | 午夜男人影院 | 日韩免费在线一区 | 欧美日韩精品国产 | 人人澡超碰碰97碰碰碰软件 | 国产精品一区二区av影院萌芽 | 丁香在线观看完整电影视频 | 丁香高清视频在线看看 | 在线小视频国产 | 999热线在线观看 | 韩国av免费看 | 日本精品一区二区三区在线观看 | 久久99久国产精品黄毛片入口 | 国内精品久久久精品电影院 | 亚洲极色 | 一区三区视频在线观看 | 亚洲午夜精品久久久久久久久久久久 | 久久伊人爱 | 探花视频在线观看+在线播放 | 国产精品久久久久久超碰 | 91桃色国产在线播放 | 亚洲国产欧美在线人成大黄瓜 | 国产精品第一页在线观看 | 亚州人成在线播放 | 久久手机在线视频 | 毛片网免费 | 在线观看国产成人av片 | 五月天激情视频 | 最近中文字幕免费观看 | 91综合色 | 国产在线国偷精品产拍免费yy | 五月婷婷在线观看 | 国产剧在线观看片 | 国产亚洲精品bv在线观看 | av久久在线 | 国产精品理论视频 | 在线观看视频一区二区 | 久久精品影视 | 午夜12点| 91在线视频精品 | 五月天综合婷婷 | 天天操天天爱天天干 | 色吊丝在线永久观看最新版本 | 91色蜜桃 | 在线不卡a| 91超级碰 | 91丨九色丨国产女 | 成人黄色大片在线免费观看 | 色综合欧洲 | 天天摸天天干天天操天天射 | 亚洲成a人片77777kkkk1在线观看 | 欧美高清视频不卡网 | 国产精品永久免费视频 | 黄色a在线观看 | 超碰在线中文字幕 | 国产亚洲成av人片在线观看桃 | 亚洲欧美国内爽妇网 | 国产偷国产偷亚洲清高 | 狠狠狠综合 | 欧美精品在线观看免费 | 人人干狠狠操 | 日日干视频 | 91网在线 | 99久久精品国产一区 | 亚洲视频久久久 | 91资源在线免费观看 | 日韩在线高清免费视频 | 婷婷丁香在线视频 | 波多野结衣在线播放一区 | 久久久国产视频 | 成年人av在线播放 | 成人a免费 | 日韩免费av片 | 99久久国产免费,99久久国产免费大片 | 成人在线观看网址 | 国产亚洲精品女人久久久久久 | www日韩视频| 成人在线视频你懂的 | 96av麻豆蜜桃一区二区 | 中文字幕资源网 国产 | 日韩网站在线看片你懂的 | 永久免费毛片在线观看 | 人人舔人人爽 | 国产探花视频在线播放 | 免费91麻豆精品国产自产在线观看 | 欧美国产视频在线 | 九九九电影免费看 | 奇米影音四色 | 天天插综合网 | 伊人电影天堂 | 一区二区三区在线免费观看 | 美女视频永久黄网站免费观看国产 | 久草视频在线免费播放 | 六月丁香社区 | 欧美肥妇free | 最新av免费在线观看 | 免费av看片 | 亚洲一区 影院 | 久久免费99精品久久久久久 | 不卡av电影在线观看 | 国产成人精品a | 美女久久久久久久久久 | 成人精品久久 | 亚州黄色一级 | 青青河边草免费视频 | 亚洲视频免费视频 | 免费日韩 精品中文字幕视频在线 | 97超碰免费 | 国产成人精品免费在线观看 | 999成人 | 亚洲精品无 | 成年人免费观看在线视频 | 亚洲作爱| 欧美一区二区视频97 | 久久精品欧美日韩精品 | 日韩在线观看第一页 | 午夜黄网 | 成人在线观看av | 一区二区高清在线 | 999成人免费视频 | 久久久精品二区 | 国产麻豆剧果冻传媒视频播放量 | 精品久久久久久久久亚洲 | 亚洲高清网站 | 国产精品久久网站 | www.久久精品视频 | 国产一区欧美一区 | 中文字幕一区二区三区在线播放 | 国产美女精品视频 | 久久久久久久久久久久久久av | 国内99视频 | 九九综合久久 | 在线日韩视频 | 成人h视频在线 | 97超级碰碰 | 手机在线免费av | 中文字幕日韩免费视频 | av网站在线免费观看 | 免费网站在线 | 一区二区三区手机在线观看 | 中文字幕在线免费看线人 | 偷拍福利视频一区二区三区 | 激情久久伊人 | 久久综合久久综合久久综合 | 国产在线观看污片 | 免费看的黄色 | 国产精品人人做人人爽人人添 | 日韩av一区二区三区四区 | 中文字幕av电影下载 | 成人影片在线播放 | 国产第页| 天天射天天操天天色 | 国产一区免费在线观看 | 久久精品美女视频网站 | 2023亚洲精品国偷拍自产在线 | 玖玖爱国产在线 | 97超碰人人澡人人爱 | 成人免费网视频 | 韩国精品在线观看 | 国产999精品 | 欧美色综合天天久久综合精品 | 17婷婷久久www | 一级欧美一级日韩 | av.com在线| 久久精品高清 | 久久久久一区二区三区 | 成人91在线观看 | 国产成人在线观看免费 | 日本动漫做毛片一区二区 | 三级av在线 | 久久精品亚洲精品国产欧美 | 日韩 国产 | 又黄又爽又刺激视频 | 久久精品久久久久久久 | 一级免费黄视频 | 亚洲热久久| 99久久久国产免费 | 经典三级一区 | 韩国av不卡 | 久久香蕉影视 | 在线观看视频在线 | 欧美狠狠色| 91日韩精品视频 | av东方在线 | 中文久久精品 | 三级av在线| 日韩高清dvd | 深爱激情开心 | 欧美日本国产在线观看 | 在线观看视频中文字幕 | 久久这里有精品 | 免费观看91 | 欧洲精品二区 | 深爱开心激情 | 免费看的黄色网 | 一级一级一片免费 | 在线免费视频a | 五月开心综合 | av片在线看 | 亚洲激精日韩激精欧美精品 | 日韩动漫免费观看高清完整版在线观看 | 天堂在线一区二区三区 | 一区二区三区不卡在线 | 久久久久国产一区二区三区四区 | 久久综合天天 | 久久999久久 | 国产精品毛片网 | 亚洲精品乱码久久久久久久久久 | 人人超碰免费 | 亚洲成人免费在线 | 91在线看黄 | 成人黄色电影视频 | 国产高清第一页 | 久久婷婷五月综合色丁香 | 超碰97久久 | 中文字幕网站 | 亚洲精品国偷自产在线99热 | 国产福利在线免费观看 | 国产精品久久久久9999吃药 | 有码中文字幕 | 天天操夜夜操夜夜操 | 成人黄色在线观看视频 | 国产高清视频免费在线观看 | 国产综合在线观看视频 | 国产精品密入口果冻 | 欧美日韩一区二区在线 | 国产精品av免费观看 | 久久五月精品 | 国产69精品久久99的直播节目 | 在线91av | 97精品国产91久久久久久久 | 久久久久久久久网站 | 国产美女精品视频 | 国产精品一区专区欧美日韩 | 精品视频一区在线观看 | 国产精品美女久久久久久久久 | 久久免费国产视频 | 亚洲精品视频一 | 久久久久一区二区三区 | 亚洲黄网站 | 天天摸天天干天天操天天射 | 精品毛片一区二区免费看 | 久久不卡国产精品一区二区 | 一区三区视频在线观看 | 九九九热精品免费视频观看 | 国产免费大片 | 国产成人一区二区三区 | www.色爱 | 日韩av手机在线观看 | 涩涩成人在线 | 日韩免费在线一区 | 18性欧美xxxⅹ性满足 | 国产麻豆视频免费观看 | 九九在线精品视频 | 国产黄色成人av | 日日夜夜网站 | av中文天堂在线 | 91精品小视频 | 91av电影网 | 国产在线精品一区二区 | 在线精品观看 | 国产精品成人av电影 | 日韩国产精品毛片 | 日韩欧美高清在线 | 久久视讯| 99r在线视频 | 六月激情久久 | 三三级黄色片之日韩 | 99热国产精品| 草莓视频在线观看免费观看 | 婷婷视频 | 国产精品刺激对白麻豆99 | 97超碰成人| 婷婷丁香导航 | 色天天综合久久久久综合片 | 久久久久高清 | 日本久久久亚洲精品 | 91污污视频在线观看 | 成人黄色大片在线观看 | 国产高清视频在线播放 | 在线免费观看成人 | 国产青青青| 成人动漫一区二区 | 狠狠色丁香久久婷婷综合五月 | 精品一区av| 国产精品视频专区 | 久久精品视频中文字幕 | 日韩欧美国产激情在线播放 | 中文字幕乱偷在线 | 国产成人av片 | 国产精品久久久久aaaa九色 | 国产精品影音先锋 | 久久99在线视频 | 久久精品亚洲 | 色噜噜日韩精品欧美一区二区 | 国产精品入口传媒 | 成人午夜剧场在线观看 | 亚洲成人家庭影院 | 青青河边草观看完整版高清 | 探花视频在线观看免费 | 天天操夜夜叫 | 久久精品中文字幕一区二区三区 | 中文字幕一区在线 | 久久国产精品小视频 | 日本黄色免费观看 | 婷婷四房综合激情五月 | avwww在线 | 中文区中文字幕免费看 | 亚洲激情中文 | 日本护士撒尿xxxx18 | 天天操综| 米奇影视7777 | 六月丁香伊人 | 曰本免费av| 欧美色道 | 欧美片网站yy | 在线观看你懂的网站 | 国产精品11 | 精品在线视频一区二区三区 | 麻豆视频91 | 色a在线观看 | 91久久国产自产拍夜夜嗨 | 毛片精品免费在线观看 | 亚洲天堂网在线播放 | 成人黄色电影在线观看 | 91精品成人 | 嫩草91影院 | 免费看黄在线看 | 97视频免费观看 | 992tv在线成人免费观看 | 久草手机视频 | 日韩高清片 | 国产成人精品一区二区 | 91爱在线 | 日韩在线免费小视频 | 国产精品夜夜夜一区二区三区尤 | av字幕在线| 最近中文字幕mv免费高清在线 | 欧美福利片在线观看 | 2024av| av短片在线观看 | 91一区二区三区久久久久国产乱 | 99久久精品免费看国产四区 | 91在线九色| 99r精品视频在线观看 | 亚洲va欧洲va国产va不卡 | 24小时日本在线www免费的 | 日日夜夜精品免费视频 | 又爽又黄在线观看 | 成人免费观看av | 国产成人一区二区三区免费看 | 一区二区伦理电影 | 国产精品 9999| 99视频免费播放 | 久久一视频 | 中中文字幕av | 亚洲专区在线 | 免费色黄 | 另类老妇性bbwbbw高清 | 久久久久久久久精 | 狠狠色丁香婷综合久久 | 日韩精品亚洲专区在线观看 | 免费久久片 | 91在线看视频免费 | 日韩久久精品一区二区三区下载 | 久久久久久久久久久久久久av | 久久久久免费精品国产 | av视屏在线播放 | 国产精品21区 | 色在线免费 | 91最新地址永久入口 | 中文字幕日韩高清 | 国产91国语对白在线 | 久久久久女人精品毛片 | 久久久国产精品人人片99精片欧美一 | 婷婷av电影 | 91精品区 | 国产黄色片免费看 | 波多野结衣视频一区二区 | 韩国一区二区av | 99在线免费视频观看 | 97精品电影院| 黄色视屏免费在线观看 | 麻豆国产露脸在线观看 | ww视频在线观看 | 欧美成人精品欧美一级乱 | 国产亚洲日本 | av资源在线看 | 亚洲丁香日韩 | 国产视频在线观看一区 | 国产精品久久久久一区 | 9999免费视频 | av青草| 欧美成人久久 | 中文在线字幕免费观 | 亚洲六月丁香色婷婷综合久久 | 中文字幕婷婷 | 91成人天堂久久成人 | 国产精品久久久久久久久大全 | 99久久久久 | 91av社区| 麻豆一区在线观看 | 最新在线你懂的 | 久久99亚洲精品久久久久 | 伊人成人久久 | 在线电影 一区 | 91在线精品秘密一区二区 | 国产精品成人av在线 | av一区在线 | 国产精品美女久久久久久久 | 久久99精品久久只有精品 | 欧美成人一区二区 | 伊人天堂网 | 91成人短视频在线观看 | 天天干天天操天天入 | 亚洲精品在线二区 | 日日操天天爽 | 午夜精品久久久久久久99热影院 | 免费特级黄色片 | 91香蕉久久 | 亚洲精品免费在线 | 狠狠狠色丁香婷婷综合激情 | 日韩在线视频一区 | 国产成人精品日本亚洲999 | 欧美99热| 国产一卡久久电影永久 | 久久精品影片 | 在线91色 | 成人精品视频 | 欧美日韩国产二区三区 | 97视频在线观看成人 | 国产综合香蕉五月婷在线 | 国产精品精 | 2019国产精品 | 日韩在线视频观看 | 日韩精品一区二区三区高清免费 | 2017狠狠干| 黄色av免费看 | 久久久毛片| 色婷婷 亚洲 | 久久99精品波多结衣一区 | 国产精品中文字幕在线播放 | 国产高清在线永久 | 在线岛国av | 视频成人永久免费视频 | 免费福利视频导航 | 激情丁香5月 | 在线国产视频一区 | 91视频网址入口 | 97香蕉超级碰碰久久免费软件 | 国产成人福利在线观看 | 国产中文字幕在线免费观看 | 激情偷乱人伦小说视频在线观看 | 婷婷av网| 在线看一区 | 久久国产午夜精品理论片最新版本 | 久久免费视频网 | 日色在线视频 | 久久久性 | 91精品久久久久久久99蜜桃 | 国语对白少妇爽91 | avwww在线观看 | 91九色网址 | 日韩三级不卡 | 亚洲午夜大片 | 日韩毛片久久久 | 欧美人牲| 国产免费观看久久黄 | 欧美色噜噜 | 亚州av免费 | 成人手机在线视频 | 99草在线视频 | 在线综合 亚洲 欧美在线视频 | 日韩免费视频观看 | 欧美成人性网 | 亚洲国产伊人 | 免费高清在线视频一区· | 91精品视频网站 | 黄在线免费观看 | 国产精品伦一区二区三区视频 | 日韩中文字幕亚洲一区二区va在线 | 一区二区三区免费在线播放 | 日日夜夜婷婷 | 免费观看mv大片高清 | 日韩欧美精品一区 | av千婊在线免费观看 | 国产精品中文字幕在线 | 日韩在线视频免费观看 | 国产黄色片网站 | 中文字幕av在线不卡 | 国产精品美女毛片真酒店 | 中文字幕a在线 | 亚洲精品视频在线免费播放 | 日日爽天天| 一区 在线 影院 | 日韩精品专区在线影院重磅 | 日韩中文字幕亚洲一区二区va在线 | 韩国中文三级 | 亚洲精品在线一区二区三区 | 国产九九在线 | 国产精品久久久久久五月尺 | 亚洲免费不卡 | 一级c片 | 伊人一级| 香蕉视频免费在线播放 | 国内精品视频在线播放 | avav99| 久久公开免费视频 | 久久国产免费 | 亚洲天堂网站视频 | 2021av在线 | 最近日本韩国中文字幕 | 国产手机在线观看视频 | 在线观看国产成人av片 | 开心婷婷色 | 亚洲精品国偷自产在线91正片 | 最近字幕在线观看第一季 | 国产 在线观看 | 激情丁香| 国产手机精品视频 | 午夜影院一级片 | 国产va精品免费观看 | 在线a人片免费观看视频 | 久久久国产一区二区三区四区小说 | 99久久久久久| 欧美日韩久久久 | 蜜臀91丨九色丨蝌蚪老版 | 天天色天天上天天操 | 日韩天天操 | 国产中文在线字幕 | 亚洲精品ww | 在线播放第一页 | 国产二区电影 | 久久国产影视 | 国产精品11 | 一区二区三区在线免费播放 | 久久久久婷 | 一区二区三区在线视频111 | 五月婷婷综合在线观看 | 免费看av在线 | 国产福利精品一区二区 | 国产午夜精品久久久久久久久久 | 国产又粗又猛又色又黄网站 | 国产精品地址 | 亚洲免费a | 伊人电影在线观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 四虎在线观看网址 | 精品一区二区在线免费观看 | 91麻豆精品国产 | 麻豆视频国产精品 | 久久久精品久久日韩一区综合 | 精品毛片一区二区免费看 |