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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

2020-11-23(Windows系统的dll注入 )

發布時間:2025/3/21 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020-11-23(Windows系统的dll注入 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是dll注入
  在Windows操作系統中,運行的每一個進程都生活在自己的程序空間中(保護模式),每一個進程都認為自己擁有整個機器的控制權,每個進程都認為自己擁有計算機的整個內存空間,這些假象都是操作系統創造的(操作系統控制CPU使得CPU啟用保護模式)。理論上而言,運行在操作系統上的每一個進程之間都是互不干擾的,即每個進程都會擁有獨立的地址空間。比如說進程B修改了地址為0x4000000的數據,那么進程C的地址為0x4000000處的數據并未隨著B的修改而發生改變,并且進程C可能并不擁有地址為0x4000000的內存(操作系統可能沒有為進程C映射這塊內存)。因此,如果某進程有一個缺陷覆蓋了隨機地址處的內存(這可能導致程序運行出現問題),那么這個缺陷并不會影響到其他進程所使用的內存。
  也正是由于進程的地址空間是獨立的(保護模式),因此我們很難編寫能夠與其它進程通信或控制其它進程的應用程序。
  所謂的dll注入即是讓程序A強行加載程序B給定的a.dll,并執行程序B給定的a.dll里面的代碼。注意,程序B所給定的a.dll原先并不會被程序A主動加載,但是當程序B通過某種手段讓程序A“加載”a.dll后,程序A將會執行a.dll里的代碼,此時,a.dll就進入了程序A的地址空間,而a.dll模塊的程序邏輯由程序B的開發者設計,因此程序B的開發者可以對程序A為所欲為。
  二、什么時候需要dll注入
  應用程序一般會在以下情況使用dll注入技術來完成某些功能:
    1.為目標進程添加新的“實用”功能;
    2.需要一些手段來輔助調試被注入dll的進程;
    3.為目標進程安裝鉤子程序(API Hook);
 三、dll注入的方法
  一般情況下有如下dll注入方法:    
    1.修改注冊表來注入dll;
    2.使用CreateRemoteThread函數對運行中的進程注入dll;
    3.使用SetWindowsHookEx函數對應用程序掛鉤(HOOK)迫使程序加載dll;
    4.替換應用程序一定會使用的dll;
    5.把dll作為調試器來注入;
    6.用CreateProcess對子進程注入dll
    7.修改被注入進程的exe的導入地址表。
  接下來將詳細介紹如何使用這幾種方式完成dll注入。 
 四、注入方法詳解
(一)、修改注冊表
  如果使用過Windows,那么對注冊表應該不會陌生。整個系統的配置都保存在注冊表中,我們可以通過修改其中的設置來改變系統的行為。
  首先打開注冊表并定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows項,如下圖所示,他顯示了該注冊表項中的條目。
AppInit_DLLs鍵的值可以是一個dll的文件名或一組dll的文件名(通過逗號或空格來分隔),由于空格是用來分隔文件名的,因此dll文件名不能含有空格。第一個dll的文件名可以包含路徑,但其他的dll包含的路徑將被忽略。
  LoadAppInit_DLLs鍵的值表示AppInit_DLLs鍵是否有效,為了讓AppInit_DLLs鍵的值有效,需要將LoadAppInit_DLLs的值設置為1。
  這兩個鍵值設定后,當應用程序啟動并加載User32.dll時,會獲得上述注冊表鍵的值,并調用LoadLibrary來調用這些字符串中指定的每一個dll。這時每個被載入的dll可以完成相應的初始化工作。但是需要注意的是,由于被注入的dll是在進程生命期的早期被載入的,因此這些dll在調用函數時應慎重。調用Kernel32.dll中的函數應該沒有問題,因為Kernel32.dll是在User32.dll載入前已被加載。但是調用其他的dll中的函數時應當注意,因為進程可能還未載入相應的dll,嚴重時可能會導致藍屏。
  這種方法很簡單,只需要在注冊表中修改兩個鍵的值即可,但是有如下缺點:
    1.只有調用了User32.dll的進程才會發生這種dll注入。也就是說某些CUI程序(控制臺應用程序)可能無法完成dll注入,比如將dll注入到編譯器或鏈接器中是不可行的。
    2.該方法會使得所有的調用了User32.dll的程序都被注入指定的dll,如果你僅僅想對某些程序注入dll,這樣很多進程將成為無辜的被注入著,并且其他程序你可能并不了解,盲目的注入會使得其他程序發生崩潰的可能性增大。
    3.這種注入會使得在應用程序的整個生命周期內被注入的dll都不會被卸載。注入dll的原則是值在需要的時間才注入我們的dll,并在不需要時及時卸載。
(二)、使用CreateRemoteThread函數對運行中的進程注入dll
  這種方法具有最高的靈活性,同時它要求掌握的知識也很多。從根本上說,dll注入技術要求目標進程中的一個線程調用LoadLibrary函數來載入我們想要注入的dll,由于我們不能輕易的控制別人進程中的線程,因此這種方法要求我們在目標進程中創建一個線程并在線程中執行LoadLibrary函數加載我們要注入的dll。幸運的是Windows為我們提供了CreateRemoteThread函數,它使得在另一個進程中創建一個線程變得非常容易。CreateRemoteThread函數的原型如下:

HANDLE WINAPI CreateRemoteThread(_In_ HANDLE hProcess,_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,_In_ SIZE_T dwStackSize,_In_ LPTHREAD_START_ROUTINE lpStartAddress,_In_ LPVOID lpParameter,_In_ DWORD dwCreationFlags,_Out_ LPDWORD lpThreadId );

該函數與CreateThread僅僅只多出第一個參數hProcess,hProcess表示創建的新線程屬于哪一個進程。
  參數lpStartAddress表示線程函數的起始地址,注意這個地址在目標進程的地址空間中。
  現在問題來了,我們如何調用讓創建的線程執行LoadLibrary函數來加載我們要注入的dll呢?答案很簡單:只需要創建的線程的線程函數地址是LoadLibrary函數的起始地址即可。我們都知道,每一個線程創建時應該指定一個參數只有4個字節,返回值也只是4個字節的函數即可(從匯編的角度看確實如此,只要保證調用前后棧平衡即可),而LoadLibrary函數就滿足這些條件。LoadLibrary函數的原型如下:

HMODULE WINAPI LoadLibrary(_In_ LPCTSTR lpFileName );

可以發現LoadLibrary函數完全滿足上述條件,LoadLibrary的參數是dll路徑的起始地址,這個參數也就是CreateRemoteThread函數的lpParameter參數。但是參數指向的地址應該是目標進程的地址,并且該地址處應保存被加載dll的路徑字符串。但是一開始我們并不知道目標進程是否存在這樣一個地址并且這個地址恰好保存了我們的dll的完整路徑。解決這一問題的最保險的辦法是使用VirtualAllocEx函數在目標進程中開辟一塊內存存放我們的dll的路徑。VirtualAllocEx函數的原型如下:

LPVOID WINAPI VirtualAllocEx(_In_ HANDLE hProcess,_In_opt_ LPVOID lpAddress,_In_ SIZE_T dwSize,_In_ DWORD flAllocationType,_In_ DWORD flProtect );

VirtualAllocEx函數允許我們在目標進程中開辟一塊指定大小(以字節為單位)的內存,并返回這塊內存的起始地址。之后就可以用WriteProcessMemory函數將dll文件路徑的數據復制到目標進程中。WriteProcessMemory函數的原型如下:

BOOL WINAPI WriteProcessMemory(_In_ HANDLE hProcess,_In_ LPVOID lpBaseAddress,_In_ LPCVOID lpBuffer,_In_ SIZE_T nSize,_Out_ SIZE_T *lpNumberOfBytesWritten );

在開始注入前,還需要確認一件事,就是目標進程使用的字符編碼方式。因為我們所調用的LoadLibrary函數在底層實際調用有兩種可能:
  如果目標程序使用的是ANSI編碼方式,LoadLibrary實際調用的是LoadLibraryA,其參數字符串應當是ANSI編碼;
  如果目標程序使用的是Unicode編碼方式,LoadLibrary實際調用的是LoadLibraryW,其參數字符串應當是Unicode編碼。
  這使得注入過程變得很麻煩,為了減少復雜性,不妨直接使用LoadLibraryA或LoadLibraryW而不是用LoadLibrary函數來避免這一麻煩。另外,即使使用的是LoadLibraryA,LoadLibraryA也會將傳入的ANSI編碼的字符串參數轉換成Unicode編碼后再調用LoadLibraryW。綜上,不妨一致使用LoadLibraryW函數,并且字符串用Unicode編碼即可。
  最后,我們可能會為獲得目標進程中LoadLibraryW函數的起始地址而頭疼,但其實這個問題也很簡單,因為目標進程中函數LoadLibraryW的起始地址和我們的進程中的LoadLibraryW函數的起始地址是一樣的。因此我們只需要用GetProcAddress即可獲得LoadLibraryW函數的起始地址。
  經過以上漫長的分析,我們對CreateRemoteThread注入方法的原理有了較為清晰的理解,接下來我們就需要總結一下我們必須采取的步驟:
    (1).用VirtualAllocEx函數在目標進程的地址空間中分配一塊足夠大的內存用于保存被注入的dll的路徑。
    (2).用WriteProcessMemory函數把本進程中保存dll路徑的內存中的數據拷貝到第(1)步得到的目標進程的內存中。
    (3).用GetProcAddress函數獲得LoadLibraryW函數的起始地址。LoadLibraryW函數位于Kernel32.dll中。
    (4).用CreateRemoteThread函數讓目標進程執行LoadLibraryW來加載被注入的dll。函數結束將返回載入dll后的模塊句柄。
    (5).用VirtualFreeEx釋放第(1)步開辟的內存。
  在需要卸載dll時我們可以在上述第(5)步的基礎上繼續執行以下步驟:
    (6).用GetProcAddress函數獲得FreeLibrary函數的起始地址。FreeLibrary函數位于Kernel32.dll中。
    (7).用CreateRemoteThread函數讓目標進程執行FreeLibrary來卸載被注入的dll。(其參數是第(4)步返回的模塊句柄)。
  如果不在上述步驟基礎上執行操作,卸載dll時你需要這么做:
    (1).獲得被注入的dll在目標進程的模塊句柄。
    (2).重復上述步驟的第(6)、(7)兩步。
  接下來給出編寫的參考代碼,該程序以控制臺應用程序方式運行,并在Windows 10上測試通過。

#include "windows.h" #include "stdio.h" #include "tlhelp32.h" #include "io.h" #include "tchar.h"//判斷某模塊(dll)是否在相應的進程中 //dwPID 進程的PID //szDllPath 查詢的dll的完整路徑 BOOL CheckDllInProcess(DWORD dwPID, LPCTSTR szDllPath) {BOOL bMore = FALSE;HANDLE hSnapshot = INVALID_HANDLE_VALUE;MODULEENTRY32 me = { sizeof(me), };if (INVALID_HANDLE_VALUE ==(hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID)))//獲得進程的快照{_tprintf(L"CheckDllInProcess() : CreateToolhelp32Snapshot(%d) failed!!! [%d]\n",dwPID, GetLastError());return FALSE;}bMore = Module32First(hSnapshot, &me);//遍歷進程內得的所有模塊for (; bMore; bMore = Module32Next(hSnapshot, &me)){if (!_tcsicmp(me.szModule, szDllPath) || !_tcsicmp(me.szExePath, szDllPath))//模塊名或含路徑的名相符{CloseHandle(hSnapshot);return TRUE;}}CloseHandle(hSnapshot);return FALSE; }//向指定的進程注入相應的模塊 //dwPID 目標進程的PID //szDllPath 被注入的dll的完整路徑 BOOL InjectDll(DWORD dwPID, LPCTSTR szDllPath) {HANDLE hProcess = NULL;//保存目標進程的句柄LPVOID pRemoteBuf = NULL;//目標進程開辟的內存的起始地址DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1) * sizeof(TCHAR);//開辟的內存的大小LPTHREAD_START_ROUTINE pThreadProc = NULL;//loadLibreayW函數的起始地址HMODULE hMod = NULL;//kernel32.dll模塊的句柄BOOL bRet = FALSE;if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))//打開目標進程,獲得句柄{_tprintf(L"InjectDll() : OpenProcess(%d) failed!!! [%d]\n",dwPID, GetLastError());goto INJECTDLL_EXIT;}pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize,MEM_COMMIT, PAGE_READWRITE);//在目標進程空間開辟一塊內存if (pRemoteBuf == NULL){_tprintf(L"InjectDll() : VirtualAllocEx() failed!!! [%d]\n",GetLastError());goto INJECTDLL_EXIT;}if (!WriteProcessMemory(hProcess, pRemoteBuf,(LPVOID)szDllPath, dwBufSize, NULL))//向開辟的內存復制dll的路徑{_tprintf(L"InjectDll() : WriteProcessMemory() failed!!! [%d]\n",GetLastError());goto INJECTDLL_EXIT;}hMod = GetModuleHandle(L"kernel32.dll");//獲得本進程kernel32.dll的模塊句柄if (hMod == NULL){_tprintf(L"InjectDll() : GetModuleHandle(\"kernel32.dll\") failed!!! [%d]\n",GetLastError());goto INJECTDLL_EXIT;}pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");//獲得LoadLibraryW函數的起始地址if (pThreadProc == NULL){_tprintf(L"InjectDll() : GetProcAddress(\"LoadLibraryW\") failed!!! [%d]\n",GetLastError());goto INJECTDLL_EXIT;}if (!CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL))//執行遠程線程{_tprintf(L"InjectDll() : MyCreateRemoteThread() failed!!!\n");goto INJECTDLL_EXIT;} INJECTDLL_EXIT:bRet = CheckDllInProcess(dwPID, szDllPath);//確認結果if (pRemoteBuf)VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);if (hProcess)CloseHandle(hProcess);return bRet; }//讓指定的進程卸載相應的模塊 //dwPID 目標進程的PID //szDllPath 被注入的dll的完整路徑,注意:路徑不要用“/”來代替“\\” BOOL EjectDll(DWORD dwPID, LPCTSTR szDllPath) {BOOL bMore = FALSE, bFound = FALSE, bRet = FALSE;HANDLE hSnapshot = INVALID_HANDLE_VALUE;HANDLE hProcess = NULL;MODULEENTRY32 me = { sizeof(me), };LPTHREAD_START_ROUTINE pThreadProc = NULL;HMODULE hMod = NULL;TCHAR szProcName[MAX_PATH] = { 0, };if (INVALID_HANDLE_VALUE == (hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID))){_tprintf(L"EjectDll() : CreateToolhelp32Snapshot(%d) failed!!! [%d]\n",dwPID, GetLastError());goto EJECTDLL_EXIT;}bMore = Module32First(hSnapshot, &me);for (; bMore; bMore = Module32Next(hSnapshot, &me))//查找模塊句柄{if (!_tcsicmp(me.szModule, szDllPath) ||!_tcsicmp(me.szExePath, szDllPath)){bFound = TRUE;break;}}if (!bFound){_tprintf(L"EjectDll() : There is not %s module in process(%d) memory!!!\n",szDllPath, dwPID);goto EJECTDLL_EXIT;}if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))){_tprintf(L"EjectDll() : OpenProcess(%d) failed!!! [%d]\n",dwPID, GetLastError());goto EJECTDLL_EXIT;}hMod = GetModuleHandle(L"kernel32.dll");if (hMod == NULL){_tprintf(L"EjectDll() : GetModuleHandle(\"kernel32.dll\") failed!!! [%d]\n",GetLastError());goto EJECTDLL_EXIT;}pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "FreeLibrary");if (pThreadProc == NULL){_tprintf(L"EjectDll() : GetProcAddress(\"FreeLibrary\") failed!!! [%d]\n",GetLastError());goto EJECTDLL_EXIT;}if (!CreateRemoteThread(hProcess, NULL, 0, pThreadProc, me.modBaseAddr, 0, NULL)){_tprintf(L"EjectDll() : MyCreateRemoteThread() failed!!!\n");goto EJECTDLL_EXIT;}bRet = TRUE; EJECTDLL_EXIT:if (hProcess)CloseHandle(hProcess);if (hSnapshot != INVALID_HANDLE_VALUE)CloseHandle(hSnapshot);return bRet; }int main() {//InjectDll(6836, L"C:\\a.dll");EjectDll(6836, L"C:\\a.dll");return 0; }

(三)、使用SetWindowsHookEx函數對應用程序掛鉤(HOOK)迫使程序加載dll
  消息鉤子:Windows操作系統為用戶提供了GUI(Graphic User Interface,圖形用戶界面),它以事件驅動方式工作。在操作系統中借助鍵盤、鼠標、選擇菜單、按鈕、移動鼠標、改變窗口大小與位置等都是事件。發生這樣的事件時,操作系統會把事先定義好的消息發送給相應的應用程序,應用程序分析收到的信息后會執行相應的動作。也就是說,在敲擊鍵盤時,消息會從操作系統移動到應用程序。所謂的消息鉤子就是在此期間偷看這些信息。以鍵盤輸入事件為例,消息的流向如下:
  1.發生鍵盤輸入時,WM_KEYDOWN消息被添加到操作系統的消息隊列中;
  2.操作系統判斷這個消息產生于哪個應用程序,并將這個消息從消息隊列中取出,添加到相應的應用程序的消息隊列中;
  3.應用程序從自己的消息隊列中取出WM_KEYDOWN消息并調用相應的處理程序。
  當我們的鉤子程序啟用后,操作系統在將消息發送給用用程序前會先發送給每一個注冊了相應鉤子類型的鉤子函數。鉤子函數可以對這一消息做出想要的處理(修改、攔截等等)。多個消息鉤子將按照安裝鉤子的先后順序被調用,這些消息鉤子在一起組成了"鉤鏈"。消息在鉤鏈之間傳遞時任一鉤子函數攔截了消息,接下來的鉤子函數(包括應用程序)將都不再收到該消息。
  像這樣的消息鉤子功能是Windows提供的最基本的功能,MS Visual Studio中提供的SPY++就是利用了這一功能來實現的,SPY++是一個十分強大的消息鉤取程序,它能夠查看操作系統中來往的所有消息。
  消息鉤子是使用SetWindowsHookEx來實現的。函數的原型如下:

  HHOOK WINAPI SetWindowsHookEx(_In_ int idHook,_In_ HOOKPROC lpfn,_In_ HINSTANCE hMod,_In_ DWORD dwThreadId );

idHook參數是消息鉤子的類型,可以選擇的類型在MSDN中可以查看到相應的宏定義。比如我們想對所有的鍵盤消息做掛鉤,其取值將是WH_KEYBOARD,WH_KEYBOARD這個宏的值是2。
  lpfn參數是鉤子函數的起始地址,注意:不同的消息鉤子類型的鉤子函數原型是不一樣的,因為不同類型的消息需要的參數是不同的,具體的鉤子函數原型需要查看MSDN來獲得。注意:鉤子函數可以在結束前任意位置調用CallNextHookEx函數來執行鉤鏈的其他鉤子函數。當然,如果不調用這個函數,鉤鏈上的后續鉤子函數將不會被執行。
  hMod參數是鉤子函數所在的模塊的模塊句柄。
  dwThreadId參數用來指示要對哪一個進程/線程安裝消息鉤子。如果這個參數為0,安裝的消息鉤子稱為“全局鉤子”,此時將對所有的進程(當前的進程以及以后要運行的所有進程)下這個消息鉤子。注意:有的類型的鉤子只能是全局鉤子。
  注意:鉤子函數應當放在一個dll中,并且在你的進程中LoadLibrary這個dll。然后再調用SetWindowsHookEx函數對相應類型的消息安裝鉤子。
  當SetWindowsHookEx函數調用成功后,當某個進程生成這一類型的消息時,操作系統會判斷這個進程是否被安裝了鉤子,如果安裝了鉤子,操作系統會將相關的dll文件強行注入到這個進程中并將該dll的鎖計數器遞增1。然后再調用安裝的鉤子函數。整個注入過程非常方便,用戶幾乎不需要做什么。
  當用戶不需要再進行消息鉤取時只需調用UnhookWindowsHookEx即可解除安裝的消息鉤子,函數的原型如下:

BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK hhk );

hhk參數是之前調用SetWindowsHookEx函數返回的HHOOK變量。這個函數調用成功后會使被注入過dll的鎖計數器遞減1,當鎖計數器減到0時系統會卸載被注入的dll。

這種類型的dll注入的優點是注入簡單,缺點是只能對windows消息進行Hook并注入dll,而且注入dll可能不是立即被注入,因為這需要相應類型的事件發生。其次是它不能進行其他API的Hook,如果想對其它的函數進行Hook,你需要再在被注入的dll中添加用于API Hook的代碼。
  接下來將給出這一dll注入方案的示例程序的代碼,代碼包含兩部分,一部分是dll的源文件,另一部分是控制臺程序的源代碼。該程序的功能是屏蔽所有notepad.exe(Windows附帶的記事本程序)的按鍵消息,該程序在Windows xp下測試通過。

#include <stdio.h> #include <tchar.h> #include <windows.h> #pragma warning(disable : 4996) HHOOK ghHook = NULL; HINSTANCE ghInstance = NULL; LRESULT CALLBACK KeyboardProc(_In_ int code,_In_ WPARAM wParam,_In_ LPARAM lParam ) {TCHAR szPath[MAX_PATH] = {0,};TCHAR sProcessName[MAX_PATH] = {0,};if (code == 0 && !(lParam & 0x80000000))//如果是釋放按鍵{GetModuleFileName(NULL, szPath, MAX_PATH);_wsplitpath(szPath, NULL, NULL, sProcessName, NULL);if (0==_wcsicmp(sProcessName, L"notepad"))//如果進程名是notepad{return 1;//刪除消息,不再往下傳遞}}return CallNextHookEx(ghHook, code, wParam, lParam);//繼續傳遞消息 }BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved ) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:ghInstance = hModule;//獲得本實例的模塊句柄break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE; }extern "C" {__declspec(dllexport) void HookStart(){ghHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, ghInstance, 0);}__declspec(dllexport) void HookStop(){if (ghHook){UnhookWindowsHookEx(ghHook);ghHook = NULL;}} } #include <stdio.h> #include <conio.h> #include <tchar.h> #include <windows.h> typedef void(*PFNHOOKSTART)(); typedef void(*PFNHOOKSTOP)(); int main() {HMODULE Hmod = LoadLibraryA("hookdll.dll");PFNHOOKSTART pHookStart = (PFNHOOKSTART)GetProcAddress(Hmod, "HookStart");PFNHOOKSTOP pHookStop = (PFNHOOKSTOP)GetProcAddress(Hmod, "HookStop");pHookStart();printf("print 'q' to quite!\n");while (_getch() != 'q');pHookStop();FreeLibrary(Hmod);return 0; }

(四)、替換應用程序一定會使用的dll
  這種方法通常被編寫惡意代碼的人員用來編寫木馬,因此又被稱為使用木馬dll來注入dll。通常我們應當首先確認目標進程一定會載入的dll,然后替換掉它。舉個例子:比如我們知道目標進程一定會載入Xyz.dll,那么我們可以創建自己的dll并與它起同樣的名字。當然,我們必須將原先被替換掉的Xyz.dll改成別的名字,比如改成Xyz_1.dll。
  注意:在我們編寫的Xyz.dll(將被注入的dll)內部,我們要導出原來的Xyz.dll所導出的所有符號。這一點很容易實現,可以用dll的函數轉發器實現(轉發到Xyz_1.dll的相同函數),這樣一來我們只需要對需要HOOK(掛鉤)的函數編寫掛鉤代碼即可,這一過程我們僅僅是多了一些重復工作。看起來這個方法是完美的,并且很多木馬程序經常這么干,但是它存在一個很嚴重的問題:如果被替換的dll后來由于程序升級導致替換的dll添加了新的導出函數,而被注入的dll并未及時添加這些新增導出函數的轉發器(或者Hook程序),這將導致使用了新的導出函數的程序不能正常運行。另外,請不要隨意的替換系統的dll,因為在dll注入一般應當只注入到目標進程即可,而注入到別的進程之后將帶來很大的安全隱患。

(五)、把dll作為調試器來注入
  使用過OD(OllyDbg)的人員可能會為OD的強大功能感到驚嘆。因為OD可以調試一個程序并任意的修改被調試的程序。OD的工作原理是向目標進程使用了調試功能。調試器可以在被調試進程中執行很多特殊操作,操作系統載入一個被調試程序的時候,會在被調試的主線程尚未開始執行任何代碼前,自動通知調試器(用來調試被調試進程的進程),這時調試器可以將一些代碼注入到被調試進程的地址空間中,保存被調試進程的CONTEXT結構,修改EIP指向我們注入的代碼的起始位置執行這些代碼。最后再讓被調試的進程恢復原來的CONTEXT,繼續執行。整個過程對被調試的進程而言好像沒發生任何事情。
  這種注入方式需要對調試功能有所研究,并且能夠對進程的CONTEXT進行操作,最后還需要對不同的CPU平臺進行量身操作。此外,我們可能還需要手工編寫一些匯編指令來讓被調試的程序執行。這對編寫人員的能力要求較高。最后,這種方法在調試器終止后,Windows會自動終止被調試的程序。不過調試器可以通過調用DebugSetProcessKillOnExit函數并傳入FALSE,來改變Windows的默認行為。然后調試器就可以調用DebugActiveProcessStop函數來終止調試了。
  為什么要在主線程尚未開始執行任何代碼前執行代碼注入呢?因為這個時候注入最安全,其實你可以在任何時候對被調試的程序下斷點并進行以上注入操作,但是為了保證被調試程序的穩定運行你可能需要做更多的工作。
 (六)、用CreateProcess對子進程注入dll
  這個方法與把dll作為調試器來注入方法有許多相似之處,同樣也具有較大的難度。這里要求目標進程是注入者進程的子進程。當使用CreateProcess函數來創建一個子進程時,可以選擇創建后立即掛起該進程。這樣,創建的子進程并不會開始執行且EIP指向ntdll.dll的RtlUserThreadStart函數的開始位置(在win10上EIP=0X76F9BA60),此時的子進程處于掛起狀態。因此,我們可以有目的地修改EIP的值讓其從另一個位置繼續執行,但隨意的修改EIP的值往往使創建的子程序崩潰。為了讓創建的子進程載入dll必須調用LoadLibrary函數。在使用CreatRemoteProcess方法中也介紹了一點:必須在目標進程(這里指子進程)中寫入載入的dll的完整路徑。因此我們在修改EIP指向我們的代碼之前需要將一部分代碼注入到目標進程中。其中被注入的代碼至少應包括如下操作:將dll路徑首地址壓棧;調用LoadLibrary函數;跳轉回原先EIP位置,讓程序繼續執行,好像什么都沒發生過。
  但是,為了程序的穩定運行,這樣做還不夠。注入的代碼應該在執行后能恢復執行前的所有狀態。因此為了注入dll需要向目標進程注入較為安全的代碼應該包含如下操作:
    1.保存所有寄存器的值;
    2.將dll路徑首地址壓棧;
    3.調用LoadLibrary函數;
    4.恢復所有寄存器的值;
    5.跳轉到原先EIP位置,讓程序繼續執行,好像什么都沒發生。
  該方法有如下優點:在程序未開始執行前執行了dll注入,一般比較難以被發現。幾乎可以對所有的程序進行注入。
  該方法同樣具有缺點:首先需要嚴謹的設計注入的代碼,并根據不同的cpu平臺進行設計。其次就是目標進程要是注入著創建的子進程。
  接下來將給出一段示例代碼,該程序以控制臺方式運行。并在Windows 10和Windows xp上測試通過。(這段代碼參考自看雪論壇的IamHuskar,這里表示感謝!)

#include <windows.h> #include <stdio.h> #pragma warning(disable : 4996) //在子進程創建掛起時注入dll //hProcess 被創建時掛起的進程句柄 //hThread 進程中被掛起的線程句柄 //szDllPath 被注入的dll的完整路徑 BOOL StartHook(HANDLE hProcess, HANDLE hThread, TCHAR *szDllPath) {BYTE ShellCode[30 + MAX_PATH * sizeof(TCHAR)] ={0x60, //pushad0x9c, //pushfd0x68,0xaa,0xbb,0xcc,0xdd, //push xxxxxxxx(xxxxxxxx的偏移為3)0xff,0x15,0xdd,0xcc,0xbb,0xaa, //call [addr]([addr]的偏移為9)0x9d, //popfd0x61, //popad0xff,0x25,0xaa,0xbb,0xcc,0xdd, //jmp [eip]([eip]的偏移為17)0xaa,0xaa,0xaa,0xaa, //保存loadlibraryW函數的地址(偏移為21)0xaa,0xaa,0xaa,0xaa, //保存創建進程時被掛起的線程EIP(偏移為25)0, //保存dll路徑字符串(偏移為29)};CONTEXT ctx;ctx.ContextFlags = CONTEXT_ALL;if (!GetThreadContext(hThread, &ctx)){printf("GetThreadContext() ErrorCode:[0x%08x]\n", GetLastError());return FALSE;}//在目標進程內存空間調撥一塊可執行的內存LPVOID LpAddr = VirtualAllocEx(hProcess, NULL, 30 + MAX_PATH * sizeof(TCHAR), MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (LpAddr == NULL){printf("VirtualAllocEx() ErrorCode:[0x%08x]\n", GetLastError());return FALSE;}//獲得LoadLibraryW函數的地址DWORD LoadDllAAddr = (DWORD)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");if (LoadDllAAddr == NULL){printf("GetProcAddress() ErrorCode:[0x%08x]\n", GetLastError());return FALSE;}printf("原始EIP=0x%08x\n", ctx.Eip);//寫入dllpathmemcpy((char*)(ShellCode + 29), szDllPath, MAX_PATH);//寫入push xxxxxxxx*(DWORD*)(ShellCode + 3) = (DWORD)LpAddr + 29;//寫入loadlibraryA地址*(DWORD*)(ShellCode + 21) = LoadDllAAddr;//寫入call [addr]的[addr]*(DWORD*)(ShellCode + 9) = (DWORD)LpAddr + 21;//寫入原始eip*(DWORD*)(ShellCode + 25) = ctx.Eip;//寫入jmp [eip]的[eip]*(DWORD*)(ShellCode + 17) = (DWORD)LpAddr + 25;//把shellcode寫入目標進程if (!WriteProcessMemory(hProcess, LpAddr, ShellCode, 30 + MAX_PATH * sizeof(TCHAR), NULL)){printf("WriteProcessMemory() ErrorCode:[0x%08x]\n", GetLastError());return FALSE;}//修改目標進程的EIP,執行被注入的代碼ctx.Eip = (DWORD)LpAddr;if (!SetThreadContext(hThread, &ctx)){printf("SetThreadContext() ErrorCode:[0x%08x]\n", GetLastError());return FALSE;}printf("修改后EIP=0x%08x\n", ctx.Eip);return TRUE; };int main() {STARTUPINFO sti;PROCESS_INFORMATION proci;memset(&sti, 0, sizeof(STARTUPINFO));memset(&proci, 0, sizeof(PROCESS_INFORMATION));sti.cb = sizeof(STARTUPINFO);wchar_t ExeName[MAX_PATH] = L"C:\\aimprocess.exe";//子進程的名字及啟動參數wchar_t DllName[MAX_PATH] = L"C:\\hookdll2.dll";//被注入的dll的完整路徑if (CreateProcess(NULL, ExeName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &sti, &proci) ==NULL){printf("CreateProcess() ErrorCode:[0x%08x]\n", GetLastError());getchar();return 0;}if (!StartHook(proci.hProcess, proci.hThread, DllName)){TerminateProcess(proci.hProcess, 0);printf("Terminated Process\n");getchar();return 0;}ResumeThread(proci.hThread);CloseHandle(proci.hProcess);CloseHandle(proci.hThread);return 0; }

現在對以上代碼做分析,程序首先調用CreateProcess函數來創建一個掛起的進程。創建成功后,prosic結構體保存了子進程的進程句柄和主線程的線程句柄。接下來調用StartHook函數進行代碼注入。
  現在我們來詳細地分析StartHook函數,首先它創建了一段ShellCode,ShellCode的內容將被會復制到目標進程的空間中。但是當前的ShellCode還不能正常工作。因為它的很多數據要依靠放入目標進程的地址來決定。ShellCode實際上是一段匯編代碼后面附帶了執行這段代碼所需的變量或數據。所有的匯編代碼已在注釋當中進行標注。ShellCode數組的長度由匯編代碼長度和變量的長度的總和。
  接下來的工作是修復ShellCode中部分匯編指令引用的地址,這些地址要以目標進程寫入的地址作為基礎偏移量。那么我們首先應該用VirtualAllocEx在目標進程的空間中調撥一塊可執行的物理內存用來保存ShellCode代碼。當然,LoadLibraryW函數的地址還是要從本進程中獲得。當對ShellCode數據修改完畢后,就可以將ShellCode通過WriteProcessMemory函數將ShellCode復制到目標進程中。接下來需要修改目標進程的EIP指針來使主線程從ShellCode的開始處。最后,恢復目標進程,讓其繼續運行即可。
  通過以上分析,對上述代碼的執行步驟做如下總結:
    1.創建一個掛起的子進程作為目標進程;
    2.準備一份預先設計好的ShellCode(應具有上面所述的基本功能);
    3.用VirtualAllocEx在目標進程中調撥一塊可執行的內存;
    4.以分配的內存為基準修復ShellCode的匯編代碼引用的地址和數據;
    5.用WriteProcessMemory函數將修復完畢的ShellCode復制目標進程在第3步分配的內存中;
    6.修改目標進程的主線程的EIP指向第3步分配的內存的首地址;
    7.恢復目標進程的主線程。
  此方法的難點是設計好ShellCode代碼,這需要編寫者具有較高的匯編和分析設計能力。

總結

以上是生活随笔為你收集整理的2020-11-23(Windows系统的dll注入 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

天堂在线一区 | 久久av网 | 黄色免费网站下载 | 久久夜色精品国产欧美一区麻豆 | 在线有码中文字幕 | 国产三级在线播放 | 亚洲欧美色婷婷 | 国产手机精品视频 | 69国产成人综合久久精品欧美 | 午夜av日韩 | 国产精品国产三级国产不产一地 | 96av视频| 亚洲伊人网在线观看 | 婷色在线 | 日本深夜福利视频 | 日韩乱色精品一区二区 | 亚洲精品久久久久www | 久久久久久麻豆 | 欧美一级性生活片 | 国产精品自在线拍国产 | 中文字幕免费高清av | 亚洲成a人片在线观看网站口工 | 久久久96 | 亚洲免费av片 | 精品1区2区 | 中文字幕中文字幕在线中文字幕三区 | 精品视频在线观看 | av不卡中文 | 精精国产xxxx视频在线播放 | 超碰人人干人人 | 三上悠亚一区二区在线观看 | 狠狠操狠狠干天天操 | 亚洲人成人在线 | 国产一级做a爱片久久毛片a | 亚洲最新精品 | 在线a人v观看视频 | www.久久com| 国产a级精品 | 亚洲国产精品电影在线观看 | 成人在线你懂得 | 91在线看片| 日本二区三区在线 | 在线观看视频在线观看 | 91视频午夜 | 国产一级在线观看视频 | 亚洲涩涩涩 | 中文字幕免费高清在线观看 | 精品国产不卡 | 午夜视频一区二区 | 91在线国产观看 | 亚洲激情视频在线观看 | 国产视频一区在线免费观看 | 免费亚洲一区二区 | 国产99久久久久久免费看 | 五月天亚洲激情 | 成人片在线播放 | 中文字幕传媒 | 五月婷在线视频 | 狠狠干我| 日韩网页 | 欧美日韩视频在线观看一区二区 | 欧美精品小视频 | 亚洲 欧美 91 | 丁香午夜| 久久99视频免费观看 | 人人看人人做人人澡 | 欧美日韩一区二区三区不卡 | 91久久久久久久一区二区 | 日韩高清在线看 | 美女视频黄免费的 | 中文字幕精品一区二区三区电影 | 欧美日韩免费观看一区=区三区 | 国产精品第二十页 | 国产999在线观看 | 国产不卡在线 | 91精品视频免费看 | 狠狠干狠狠久久 | 欧美日韩另类在线 | 五月婷婷综合在线观看 | 亚洲影音先锋 | 一区二区视频在线播放 | 国产精品va视频 | 91色欧美 | 中文字幕在线有码 | 日本在线观看一区 | 狠狠综合网 | 国产日产精品一区二区三区四区的观看方式 | 久久你懂的 | 欧美精品免费一区二区 | 日本精品久久久久久 | 91av在线视频免费观看 | 欧美性做爰猛烈叫床潮 | 日韩首页| 国产精品激情在线观看 | 国产第一福利网 | 国产成人免费在线 | 97超碰免费在线 | 狠狠狠狠狠狠干 | 九九综合九九 | 五月开心激情 | 久久天天躁狠狠躁亚洲综合公司 | 在线精品视频在线观看高清 | 欧美天堂久久 | 玖玖国产精品视频 | 天天操网 | 精品福利视频在线 | 日韩欧美久久 | 国产高清在线 | 国产中文字幕视频在线 | 成人av高清在线观看 | 免费日韩一区二区三区 | 久久国产欧美日韩精品 | 狠狠操夜夜操 | 韩国视频一区二区三区 | 最近高清中文在线字幕在线观看 | av免费在线观看1 | 五月天天在线 | 久久兔费看a级 | 久久精品站 | 999久久a精品合区久久久 | 国产视频在线观看一区二区 | 韩国av三级 | 五月婷婷在线视频 | 日本精品久久久久中文字幕5 | 992tv成人免费看片 | 国产精品久久久久久久久蜜臀 | 久久久久久毛片精品免费不卡 | 欧美一区二区三区特黄 | 日韩理论片在线 | 伊人国产在线观看 | 亚洲国产一区av | 欧美淫视频 | 在线国产视频一区 | 国产成人黄色 | 日韩伦理片一区二区三区 | 丁香免费视频 | 日韩视频免费观看高清 | 久久人人爽人人爽人人片av软件 | 午夜10000 | 午夜美女福利 | 国产精品国产三级国产不产一地 | 免费日韩一区 | 久久99久久99免费视频 | 狠狠躁18三区二区一区ai明星 | 欧美一级网站 | 亚洲国产精品视频 | 欧洲亚洲国产视频 | 丁香九月激情综合 | 在线观看国产麻豆 | 久草影视在线 | 99视频精品免费视频 | 黄色a大片| 亚洲一区二区三区在线看 | 久久久穴 | 中文字幕av日韩 | 国产精品麻豆99久久久久久 | 最近免费中文字幕 | 在线视频 区 | 国产色一区 | 欧美色图视频一区 | 人人爱夜夜操 | 国产高清av免费在线观看 | 国产精品自产拍在线观看桃花 | 欧美做受高潮电影o | 久久爽久久爽久久av东京爽 | 免费看的黄色片 | 天堂av免费看 | 国产精品久久在线 | 福利在线看片 | 久久久久网站 | 成人毛片一区二区三区 | 国内精品久久影院 | 深夜福利视频在线观看 | 久久精品看片 | 欧美aaa一级| 婷婷免费视频 | 成人av电影免费在线观看 | 九色激情网 | 在线成人国产 | 久久久久激情视频 | 国产精品午夜在线观看 | 五月天久久久久 | 88av色| 婷婷在线精品视频 | 亚洲精品动漫在线 | 麻豆视频一区 | 国产91精品久久久久久 | 四虎成人网 | 一级片免费观看视频 | 日本久久精品 | 亚洲三级在线免费观看 | 亚洲一区av | 久草在线精品观看 | 亚洲午夜精品在线观看 | 在线欧美a| 精品国产aⅴ麻豆 | 在线观看va | 亚洲成人av电影在线 | 久久国产美女 | 国产精品综合在线 | 91九色在线视频观看 | 久久99在线观看 | 国产精品99久久久久的智能播放 | 国产精品1区2区在线观看 | 97国产情侣爱久久免费观看 | 亚洲精品视 | 色婷五月 | 乱男乱女www7788 | 久久香蕉一区 | 成人一级影视 | 99在线精品视频在线观看 | 人人澡av | 日韩欧美一区视频 | 亚洲专区免费观看 | 91亚洲精品在线 | 日韩av一区二区在线 | 亚洲精选在线 | 久久中文网 | 992tv又爽又黄的免费视频 | 玖玖在线资源 | 97人人超碰在线 | 国产区 在线 | 国产一级免费av | 欧美日韩高清一区二区 | 免费看三级 | 97国产大学生情侣白嫩酒店 | 欧洲精品码一区二区三区免费看 | 国产免费久久精品 | 亚洲精品动漫久久久久 | 亚洲日本va中文字幕 | 在线观看黄网站 | 国产99久久精品一区二区永久免费 | 黄色精品一区二区 | 久久精品久久国产 | 国产亚洲精品久久19p | 91网址在线观看 | 久久成人在线 | 精品高清美女精品国产区 | 韩日三级av | 免费黄色激情视频 | 99热在线看 | 亚洲综合色激情五月 | 亚洲自拍偷拍色图 | 欧美日本不卡高清 | 久久久精品欧美一区二区免费 | 国产精品久久久一区二区三区网站 | 亚洲视频网站在线观看 | 在线视频 国产 日韩 | 色小说在线 | 久久国产精品网站 | 99精品黄色片免费大全 | 久久精品国产99国产 | 免费高清男女打扑克视频 | 亚色视频在线观看 | 91中文字幕在线视频 | 亚洲 欧洲 国产 日本 综合 | 97在线免费视频 | 日韩在线视频免费播放 | 国产在线a不卡 | 久久久久久久久久久久影院 | av成人在线观看 | 九九热免费视频在线观看 | 午夜精品影院 | 色狠狠狠 | 欧美性生活小视频 | 国产精品久久久久久久免费大片 | av电影中文字幕在线观看 | 日韩在线视频播放 | 午夜在线国产 | 久久午夜国产精品 | 成人h在线观看 | 热re99久久精品国产66热 | 欧美日韩三级在线观看 | 91福利视频一区 | 国产直播av | 成人免费电影 | 99久久精品国产一区二区三区 | 日本中文字幕高清 | 婷婷电影在线观看 | 一区在线观看 | 一级a毛片高清视频 | 黄色av在| 在线看国产视频 | 久久草草热国产精品直播 | 亚洲桃花综合 | 成人app在线免费观看 | 最新中文字幕 | 亚洲区二区 | 综合在线观看色 | 日韩中文字幕国产 | 日本精品中文字幕在线观看 | 丁香五月网久久综合 | 黄色国产在线观看 | 天天艹日日干 | 日韩欧美视频免费在线观看 | 国产视频1 | 精品国产乱子伦一区二区 | 麻豆视频国产在线观看 | 色婷婷狠| 久草精品在线 | 色综合久久五月 | 4438全国亚洲精品在线观看视频 | 麻豆av电影| 久草亚洲视频 | 色播五月婷婷 | 亚洲人成人在线 | 国产区在线视频 | 国产精品18久久久 | 91爱爱视频 | 久久综合亚洲鲁鲁五月久久 | 高清不卡一区二区三区 | 国产乱码精品一区二区三区介绍 | 91久久久久久久 | 久久欧美视频 | 99久久综合狠狠综合久久 | 丁香激情综合久久伊人久久 | av网站在线观看播放 | 免费视频一区二区 | 国产一区二区久久久 | 成年美女黄网站色大片免费看 | 欧美成人影音 | 深爱激情av| 国产玖玖在线 | 日韩欧美高清视频在线观看 | 一级欧美黄 | 国产男女免费完整视频 | 黄色在线免费观看网站 | 精品字幕在线 | 欧美色黄| 国产综合在线视频 | 中文字幕在线观看免费 | 久久精品国产亚洲 | 五月天综合激情 | japanese黑人亚洲人4k | 久久8| 国产视频在线观看一区 | 狠狠狠色丁香婷婷综合久久五月 | 99久久国产免费看 | 欧美一区二区三区免费观看 | 天天操天天操天天操天天 | 久久免费美女视频 | 成人h在线观看 | 成人 亚洲 欧美 | 91 在线视频播放 | 在线成人免费电影 | 日韩在线三级 | 99久久精品国产亚洲 | 国产乱老熟视频网88av | 91色影院 | 国产日产精品一区二区三区四区的观看方式 | 亚洲五月综合 | 97热视频| 欧美一进一出抽搐大尺度视频 | 999亚洲国产996395 | 久久国产系列 | 国产资源免费在线观看 | 超碰97在线人人 | 在线天堂中文www视软件 | 91传媒激情理伦片 | 精品视频123区在线观看 | 91成人精品观看 | 在线免费观看黄色小说 | 亚洲视频免费在线看 | 久久久久久国产精品免费 | 亚洲精品成人av在线 | 免费黄色在线网址 | 久久综合九色综合欧美就去吻 | 精品国产一区二区久久 | 日韩久久一区 | 国产精品成人自产拍在线观看 | 亚州视频在线 | 亚洲欧美日韩国产精品一区午夜 | 欧美日本不卡高清 | 国产视频日韩视频欧美视频 | 美女在线观看网站 | 成人羞羞视频在线观看免费 | 超碰97久久 | 国产网红在线 | 成人国产精品一区二区 | 五月天激情在线 | 四虎在线视频免费观看 | www.888.av| 91看国产| 国产婷婷一区二区 | 亚洲国产精品电影 | 亚洲一区二区三区毛片 | 玖玖精品在线 | 色中色亚洲 | 中文字幕在线播放一区二区 | 亚洲精品久久久久久久不卡四虎 | 高清日韩一区二区 | 不卡的一区二区三区 | 青青河边草观看完整版高清 | 91精品视频免费 | 一区二区三区在线免费观看 | 欧美 日韩 性 | 午夜电影久久 | 人人爽人人爱 | 国产中文字幕久久 | av片免费播放 | 免费看污在线观看 | 视频一区二区国产 | 久久精品亚洲精品国产欧美 | 嫩小bbbb摸bbb摸bbb | 国产一级电影网 | 99麻豆久久久国产精品免费 | 亚洲精选久久 | 久久视频6 | 久久在线观看 | 国产精品视频永久免费播放 | 全久久久久久久久久久电影 | 福利片视频区 | www国产精品com | 免费视频国产 | 一区二区三区污 | 69国产精品视频 | 欧美成人性战久久 | 在线观看色视频 | 日韩偷拍精品 | 中文字幕在线观看你懂的 | 国产性天天综合网 | 久久一区二区三区日韩 | 日韩一区二区三区免费视频 | 欧美视屏一区二区 | 天天草天天爽 | 9999在线观看 | 激情综合婷婷 | 在线欧美最极品的av | 日韩最新av在线 | 黄色三级在线观看 | 91在线影视 | 成年美女黄网站色大片免费看 | 国产精品原创av片国产免费 | 亚洲国产成人在线播放 | 国产精品一区二区免费在线观看 | 亚洲最大av| 最新色站| 国产精品一区在线观看你懂的 | 亚洲精品国偷自产在线99热 | 午夜视频在线网站 | 国产精品中文久久久久久久 | 精品视频专区 | 黄色片毛片 | 91chinesexxx| 伊人狠狠操 | 六月久久婷婷 | 97在线视频免费观看 | 日韩精品一区电影 | 91视频免费播放 | 国产原创在线视频 | av中文国产| 91精品国产91热久久久做人人 | 中文字幕国产 | 精品影院一区二区久久久 | 97超视频在线观看 | 国产精品扒开做爽爽的视频 | 人人爽人人舔 | 成人黄色大片网站 | 91aaa在线观看 | 久久理论电影 | 国产精品久久久久久久99 | 一区二区三区免费在线观看视频 | 91日韩精品一区 | 免费在线观看成人小视频 | 色婷婷免费视频 | 久久久精品 | 久久精品韩国 | 日本黄色免费在线 | 亚洲专区在线播放 | 91丨九色丨国产女 | 亚洲成a人片77777潘金莲 | 特级毛片在线免费观看 | 久久曰视频 | 国产不卡片 | 久久精品4 | 久久网页 | 欧美黑人xxxx猛性大交 | 色噜噜日韩精品一区二区三区视频 | 色综合久久88色综合天天6 | 精品久久久久久亚洲综合网站 | 最新日韩视频在线观看 | 日韩婷婷| 五月婷婷综合网 | 伊人狠狠干 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 黄色精品久久 | 精品国产精品久久一区免费式 | 日韩精品久久一区二区三区 | 日本少妇视频 | 欧美日韩免费视频 | 色com网| 黄色免费网站下载 | 精品国产视频在线观看 | 国产一区二区在线播放视频 | 91麻豆精品国产自产在线 | 国产在线高清精品 | 欧美色图一区 | 中文字幕在线看视频 | 久久免费视频4 | 毛片的网址 | 天天综合入口 | www.狠狠操.com | av一本久道久久波多野结衣 | 精品国精品自拍自在线 | 色网站国产精品 | 91在线观看黄 | 亚洲第一区在线观看 | 欧美日韩一区二区三区免费视频 | 一区二区激情视频 | aⅴ精品av导航 | 在线看国产日韩 | 91麻豆.com| 蜜桃av人人夜夜澡人人爽 | 婷婷五月情 | 中文字幕av在线播放 | 久久99视频免费观看 | 午夜视频在线观看网站 | 手机看国产毛片 | 国产 一区二区三区 在线 | 国产精品亚洲综合久久 | 日本天天操| 中文国产字幕在线观看 | 亚洲黄a| 在线免费观看黄色大片 | 五月婷久久 | 99国产精品久久久久久久久久 | 成人久久久久久久久久 | 精品一区精品二区高清 | 国产精品久久久久久久久久久免费看 | 久久久亚洲成人 | 国产亚洲精品成人 | 欧美日韩二区三区 | 欧美激情视频一区二区三区免费 | 亚洲精品国产综合久久 | 国产一级高清 | 日韩av进入 | 97视频在线观看播放 | av高清一区二区三区 | 国产精品99在线观看 | 欧美一级性 | 日韩毛片在线一区二区毛片 | 国产在线1区 | 黄色亚洲在线 | 国产色综合天天综合网 | 欧美成人h版在线观看 | 丁香婷婷综合色啪 | 黄色成人小视频 | 亚洲精品国产精品国自产观看浪潮 | 黄色中文字幕在线 | 色综合www| 国产日韩欧美综合在线 | 99久久99久久精品国产片果冰 | 欧美亚洲精品一区 | 久久久精品欧美 | 日本特黄一级 | 午夜日b视频 | 亚洲一区二区观看 | 国产五月婷 | 99久久99视频只有精品 | 日本精品中文字幕在线观看 | 在线黄色观看 | 97成人在线 | 网站免费黄色 | 婷婷丁香色 | 久草视频一区 | 免费视频xnxx com| 一性一交视频 | 久久一区二 | 亚洲国产人午在线一二区 | 免费在线观看一区二区三区 | 99免在线观看免费视频高清 | 91完整版 | 免费观看9x视频网站在线观看 | 精品一区二区三区久久久 | 麻豆91在线看 | 亚洲国产日韩欧美在线 | 亚洲国产成人在线播放 | 亚洲天天在线日亚洲洲精 | 人人爽人人爽人人爽人人爽 | 免费在线观看av不卡 | 香蕉视频网站在线观看 | 99精品区 | 青春草免费在线视频 | 一区二区三区在线影院 | 婷婷色网视频在线播放 | 精品不卡av | 婷婷九月丁香 | 综合久久五月天 | 日韩在线国产精品 | 日本黄色免费观看 | 亚洲国产免费 | 国产精品黄色影片导航在线观看 | 国产精品99久久久久久武松影视 | 网站免费黄 | 国产精品专区在线 | 国产精品去看片 | 国产精品日韩久久久久 | 国产露脸91国语对白 | 能在线观看的日韩av | 免费a级观看| 99精品国产高清在线观看 | 欧美日韩亚洲一 | 欧美日韩中文国产一区发布 | 菠萝菠萝在线精品视频 | 国产免费专区 | 婷久久| av综合 日韩 | 狠狠的干狠狠的操 | 丁香六月综合网 | 99精品久久久久 | 久久精品国产美女 | 国内成人综合 | 精品v亚洲v欧美v高清v | 免费的国产精品 | 国产福利一区二区三区视频 | 欧美午夜精品久久久久久浪潮 | 香蕉在线播放 | 91色偷偷 | 毛片视频网址 | 福利视频 | 久久理论视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 亚洲第一av在线播放 | 日韩亚洲国产中文字幕 | 国产在线欧美日韩 | 99九九99九九九视频精品 | 天天操天天射天天爽 | 中文字幕在线不卡国产视频 | 亚洲精品av中文字幕在线在线 | 国产打女人屁股调教97 | 国产在线不卡视频 | 91精品国产入口 | 五月婷婷,六月丁香 | 国产裸体bbb视频 | 精品久久一区二区三区 | 亚洲精品视频网站在线观看 | 国产中文字幕视频在线观看 | 国产九九精品视频 | 久久你懂的 | 久久人人爽人人爽人人片av免费 | 国产精品综合久久久 | www色婷婷com| 激情av五月婷婷 | 91免费高清在线观看 | 国产自在线观看 | 亚洲一级久久 | 很黄很黄的网站免费的 | 亚洲毛片一区二区三区 | 日本h在线播放 | 国产精品99在线观看 | 婷婷色狠狠 | 美女精品在线观看 | 精品一区久久 | 日韩高清精品一区二区 | 在线免费观看黄 | 国产精品国产三级国产aⅴ无密码 | 国产成人在线观看免费 | 免费看成人 | 狠狠色丁香婷婷综合橹88 | 中文字幕中文字幕在线中文字幕三区 | 黄色网在线播放 | 国产精品亚洲视频 | 国产成人久 | 久久久久久久毛片 | 欧美一区二区三区不卡 | 亚洲精品动漫久久久久 | 国产成人专区 | 91精品免费看 | 久草视频中文在线 | 日韩高清 一区 | 日韩一区二区免费视频 | 成人一区不卡 | 欧美日韩一区二区三区不卡 | 亚洲成人精品久久 | 18国产精品白浆在线观看免费 | 日韩久久精品一区二区三区下载 | 久久午夜精品 | 成人精品一区二区三区电影免费 | 一区二区电影网 | 91精品一区二区三区蜜臀 | 欧洲不卡av | 2019中文字幕网站 | 亚洲精品在线观看免费 | 国产午夜三级一区二区三 | 超碰在线99| 欧美日韩国产一区二区三区 | 欧美ⅹxxxxxx| 最新av网址在线观看 | 欧日韩在线 | 综合色综合色 | 国产无套一区二区三区久久 | 久草久热| 欧美国产91| 成人一级在线观看 | 亚洲 中文字幕av | 天干啦夜天干天干在线线 | 亚洲国产精品传媒在线观看 | 99精品视频观看 | 国内精品视频在线播放 | 五月天婷婷在线观看视频 | 亚洲不卡123 | 国产成人免费高清 | 天天色视频 | 99999精品| 天天色婷婷 | 久久国产精品一区二区三区 | 日本中文字幕在线看 | 97av超碰| 99精品视频在线观看 | 日日干干| 国产亚洲一区二区三区 | 国产精品国产亚洲精品看不卡 | 日本一区二区三区免费观看 | 久99久精品视频免费观看 | 日日夜夜草 | 一级黄色片在线免费看 | 国产精品久久久久毛片大屁完整版 | 欧美一级久久 | 黄色av一级| 91在线蜜桃臀 | 黄色一级大片在线免费看国产一 | 日韩精品在线免费播放 | 亚洲午夜激情网 | 国内精品国产三级国产aⅴ久 | 欧美国产日韩一区 | 日韩在线 一区二区 | 亚洲男人天堂2018 | 日韩视频在线不卡 | 国产精品普通话 | 国产.精品.日韩.另类.中文.在线.播放 | 久久在线电影 | 349k.cc看片app| 免费网址在线播放 | 色香蕉在线 | 欧美贵妇性狂欢 | 欧美少妇xx| 超碰在线94| 波多野结衣视频一区二区 | 27xxoo无遮挡动态视频 | 精品一二三四在线 | 欧美性大胆 | 精品国产一区二区久久 | 国产亚洲在线观看 | 99视频在线精品免费观看2 | 日韩一级成人av | 在线只有精品 | 久久久久久久久久久国产精品 | 极品久久久久久久 | 久久久18| 久久97超碰 | 国产婷婷精品av在线 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 久久久久成人免费 | 91在线精品秘密一区二区 | 精品在线免费视频 | 色播五月激情五月 | a在线播放 | 久久久国产网站 | 男女免费视频观看 | 日韩免费高清在线 | 精品一区二区三区电影 | 精品亚洲va在线va天堂资源站 | 久久久久一区二区三区 | 亚洲黄色高清 | 国产精品久久毛片 | 欧美日韩色婷婷 | 特及黄色片 | 国产精品成人免费精品自在线观看 | 24小时日本在线www免费的 | 综合色中文 | 国产精品一区二区在线观看 | 精品91在线 | 久久久国产一区二区 | 国产精品一区二区电影 | 六月丁香激情综合 | 国产精品国产三级国产aⅴ无密码 | 欧美在线视频一区二区三区 | www.五月婷 | 日韩伦理片hd | 欧美成人精品在线 | 综合国产视频 | 色婷婷久久| 亚洲亚洲精品在线观看 | 国产亚洲在线视频 | 久久久久国产精品厨房 | 性色av免费看 | 天天操福利视频 | 97精品超碰一区二区三区 | 久久久毛片 | 成人影音av | 久久一区二区三区日韩 | 国产在线视频在线观看 | 激情图片久久 | 日日干天天插 | 久久久久激情电影 | 国产精品自拍在线 | 久久99久久99久久 | 国产精品乱码一区二三区 | 综合伊人久久 | 欧美国产亚洲精品久久久8v | 在线观看国产永久免费视频 | 国产精品一区二区三区在线播放 | 夜夜爱av | 99久久精品费精品 | 亚洲日本va在线观看 | 久久久久日本精品一区二区三区 | 狠狠躁夜夜躁人人爽视频 | 亚洲最新精品 | 国产精品第二十页 | 亚洲国产免费看 | 国产视频精品网 | 欧美日韩国产在线观看 | 99热精品国产| 久久久黄视频 | 免费高清在线观看电视网站 | 超碰国产97 | 欧美一区日韩一区 | 国产精品久久久久久久av大片 | 中文字幕乱码电影 | 欧美日韩3p | 蜜桃av人人夜夜澡人人爽 | 狠狠操狠狠操 | 在线观看中文av | 久草视频免费观 | 色综合久久88色综合天天6 | 黄污视频大全 | 亚洲成人动漫在线观看 | 国产精品久久网 | 欧美 日韩 国产 中文字幕 | 少妇性色午夜淫片aaaze | 亚洲1区在线 | 久久久亚洲网站 | 91精品视频在线观看免费 | 免费福利视频网站 | 国产资源免费在线观看 | 国产18精品乱码免费看 | 亚洲精品高清在线观看 | 人人爱爱人人 | 国产剧情一区二区在线观看 | 在线免费观看视频 | 美女视频黄是免费的 | 精品福利在线视频 | 欧美精品九九99久久 | 天天操天天吃 | 久久精品高清 | 午夜av在线| 色.com| 超碰人人在线观看 | 高清免费在线视频 | 天天激情天天干 | 国产美女黄网站免费 | 亚洲精品午夜久久久久久久久久久 | 一级片视频免费观看 | 亚洲国产经典视频 | 国产中文自拍 | 成人免费观看网址 | 麻豆av一区二区三区在线观看 | 国产精选视频 | 色综合中文字幕 | 国内揄拍国产精品 | 日韩va在线观看 | 欧美日视频| 国产无限资源在线观看 | 超级碰碰免费视频 | 亚洲免费在线看 | 国产精品手机播放 | 精品国产日本 | 欧美午夜性生活 | 免费开视频 | 亚洲视频免费在线观看 | 成人免费91 | 日本3级在线观看 | 999日韩 | 久草热视频 | 99久久精品国产一区二区三区 | 久久久久久久久久久网 | 日韩一区二区免费在线观看 | 国产亚洲欧美在线视频 | 欧美精品国产综合久久 | 中文字幕刺激在线 | 五月婷婷丁香在线观看 | 久久艹欧美 | 国产亚洲永久域名 | 久久乐九色婷婷综合色狠狠182 | 51久久夜色精品国产麻豆 | 久久久久久黄色 | 久久综合影音 | 国产精品大片在线观看 | 婷婷九九 | 国产一级视屏 | 免费h漫在线观看 | 国产精品video | 在线免费观看麻豆 | 99精品国产高清在线观看 | 丝袜美腿一区 | 日韩理论在线视频 | 色五月色开心色婷婷色丁香 | 综合伊人av | 日韩欧美高清不卡 | 国产精品videossex国产高清 | 在线黄频 | 国产精品18久久久久vr手机版特色 | 亚洲精品一区中文字幕乱码 | 2023国产精品自产拍在线观看 | 久久久精品欧美一区二区免费 | 久久五月婷婷综合 | 日本女人在线观看 | 亚洲精品国产精品国自 | 久久精品专区 | 99国产一区二区三精品乱码 | 夜夜爽88888免费视频4848 | 国产99爱| 婷婷视频在线播放 | 91最新在线视频 | 免费在线一区二区 | 久久综合婷婷 | 毛片网站免费 | 国产一级一片免费播放放a 一区二区三区国产欧美 | av免费看在线 | 国产91欧美 | 久久综合久久综合这里只有精品 | 久久999久久 | 亚洲午夜精| 青青河边草观看完整版高清 | 在线网站黄 | 中文字幕乱码视频 | 探花视频在线观看+在线播放 | 欧洲一区二区三区精品 | 久久天天躁狠狠躁亚洲综合公司 | 成人免费看视频 | 久久97视频 | 亚洲少妇xxxx| 射综合网 | 久久精品视频免费 | 日本激情中文字幕 | 中文字幕丰满人伦在线 | www四虎影院 | 一区二精品 | 黄色影院在线观看 | 日韩高清精品免费观看 | 一区二区影视 | 99c视频高清免费观看 | 亚洲精品视频免费看 | 欧美成人免费在线 | 久久99爱视频 | 亚洲精品小视频 | 国产福利专区 | av福利网址导航 | 久久午夜免费观看 | 久久久国产高清 | 麻豆va一区二区三区久久浪 | 中文字幕123区 | 欧美国产日韩激情 | 在线观看中文字幕一区 | 日日干夜夜干 | 激情丁香久久 | 天天拍天天爽 | 91高清在线看| 综合色综合色 | 青青草国产在线 | 五月婷婷丁香在线观看 | 日韩视频免费在线观看 | 欧美视频网址 | 最新国产精品久久精品 | 超级碰99 | 久久成人免费电影 | 日韩精品专区在线影院重磅 | 亚洲精品乱码久久久久久蜜桃91 | 人人干人人超 | 91福利视频网站 | 天天操天天操天天操天天操天天操 | 国产精品一区二区三区四区在线观看 | 人人澡人人干 | 欧美性受极品xxxx喷水 | 色网站黄 | 天堂中文在线播放 | 婷婷色综 | 91成人看片| 免费观看十分钟 | 日韩中文字幕免费在线观看 | 日日日网| 欧美日韩激情视频8区 | 综合成人在线 | 成人三级网址 | 亚洲视频aaa| 美女在线观看av | 精品久久久久免费极品大片 | 久久久久久久影视 | 久久调教视频 | 黄色网址a | 一区二区三区在线视频111 | 97福利| 一区二区三区手机在线观看 | 国产69精品久久久久久久久久 | 激情婷婷av | 亚洲一区二区三区91 | 国产精品69av | 婷婷在线观看视频 |