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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
掃盲貼,HOOK SSDT 短文一篇(通過MDL修改內存保護機制)
2009-09-05 23:25

http://hi.baidu.com/csh0w/blog/item/f44412e8cbf12936b90e2d2b.html

標 題: 【原創】掃盲貼,HOOK SSDT 短文一篇。
作 者: 梧桐
時 間: 2008-12-06,23:01
鏈 接: http://bbs.pediy.com/showthread.php?t=78218

//author:梧桐
//轉載請注明出處

------------------------很不華麗的分割線------------------------------------------------------

本文章僅供那些在驅動開發門外徘徊的程序愛好者參考和學習,大牛就繞過吧,
如有錯誤的地方,還請多多指出,不勝感激。

------------------------很不華麗的分割線------------------------------------------------------

?????? 對于Driver 一詞兒,我想大家都不陌生,它是工作在ring0下的,正是因為如此,它不不能夠快速上手的,更多的時候你要熟悉它的技術資料和接口,還要熟悉底層工作的原理,一不小心搞個BSOD,那是會非常郁悶的。

???? 好了,現在讓我們步入正題,首先確認你已經安裝好了DDK(學習驅動開發,推薦WINXP DDK 2600、 Windows XP,?? VS2003),配置好了你的開發環境(DDK Wizard),在VS20003里添加WINDDK路徑。

???? 打開VS2003,Tools選項,選取 Options(如下圖):

然后,我們找到 Projects(工程),選取VC++ Directories,添加WINDDK路徑:

配置好這些環境以后,我們開始與驅動的親密接觸吧。

???? 先來建立一個驅動的工程:

那些默認的選項,全部取消掉:

接著點 Finish ,刪除 Header Files、Resource Files,此時,DDK Wizard 已經為我們建立了一套Driver模板了,但細看,是不是感覺非常非常的亂?

???? OK,我們把它K掉,現在我們自己來打造一個簡單的入口點。

????

代碼:
#include "ntddk.h"

//Unload
VOID UnLoad(IN PDRIVER_OBJECT DriverObject)
{
???  DbgPrint("UnLoad Driver.\n");
}

//EntryPoint.
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, 
???????????  IN PUNICODE_STRING RegistryPath)
{
??  DriverObject->DriverUnload = UnLoad;
??  //TODO
??  return STATUS_SUCCESS;
}
???? 在 DriverName.WXP上點Build,看看objchk\i386目錄下產生的Sys文件,OK,Cool吧,當然,我們這個驅動連任何功能都沒有的,Cool是很Cool,就是Cool得沒內涵了,那么我們來實現點什么功能呢,好吧,讓我們來對SSDT掛鉤一下吧。

???? 要掛鉤SSDT,就必須先要由內核到處一個KeServiceDescriptorTable,那么我們還要先定義一個KeServiceDescriptorTable類型的的結構體:

代碼:
typedef struct ServiceDescriptorEntry
{
????????  unsigned int *ServiceTableBase;
????????  unsigned int *ServiceCounterTableBase; //Used only in checked build
????????  unsigned int NumberOfServices;
????????  unsigned char *ParamTableBase;
} SSDTEntry;
???? 定義了KSDT的結構,那么我們想想要HOOK那個函數呢,好吧,就以ZwTerminateProcess為例,我們開動,首先定義一個ZwTerminateProcess函數結構,函數原型:

代碼:
ZwTerminateProcess(
????????  IN HANDLE ProcessHandle OPTIONAL, 
????????  IN NTSTATUS ExitStatus
????????  );
結構定義:

代碼:
typedef NTSTATUS(*_ZwTerminateProcess)(
????????????????  IN HANDLE ProcessHandle OPTIONAL,
????????????????  IN NTSTATUS ExitStatus
????????????????  );
???? 我們要HOOK ZwTerminateProcess,那么我們是不是要先找出它在KSDT中的位置呢,沒錯,那么我們來定義一個通過SSDT服務號得到函數地址的宏以達到我們的目的:

代碼:
#define??  GetSystemFunc(FuncName) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)FuncName+1)];
???? 想要達到改寫SSDT的目的,那么首先要解決的是內存保護機制的問題,眾所周知,Windows的某些版本對內存區域啟用了寫保護的功能,在XP和2003中更為常見,SSDT是只讀的,那怎么辦呢?

???? 有的網友此刻估計已經明白了。

???? 沒錯,就是 Memory Descriptor List,簡稱 MDL。有的同學可能會問了,MDL究竟是個什么東西呢?從字面意思看,不難理解,內存描述符列表。MDL包含了內存區域的起始、擁有者proc、字節數、標記等。OK,我們需要先定義一個MDL的指針。

代碼:
PMDL MDLSystemCall;

???? 定義了MDL的指針以后,我們要通過MAPPED系列的參數來使內存擁有可寫性,然后鎖定內存中的MDL,那么我們就要定義一個PVOID的指針,來供MmMap操作。

????
代碼:
PVOID *MappedSCT;
???? 代碼片段:
代碼:
MDLSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
if(!MDLSystemCall)
??  return STATUS_UNSUCCESSFUL;
???? 那么,建立了MDL,是不是該填充一下頁數組啊?

???? 對的,沒錯。

????
代碼:
MmBuildMdlForNonPagedPool(MDLSystemCall);
MDLSystemCall->MdlFlags = MDLSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; //可寫
MappedSCT = MmMapLockedPages(MDLSystemCall, KernelMode);
???? 我們轉入HOOK話題,繼續。

???? 剛才我們已經定義了 ZwTerminateProcess 的結構。

????
代碼:
Old_ZwTerminateProcess = (_ZwTerminateProcess)(GetSystemFunc(ZwTerminateProcess));
???? 獲取沒被HOOK之前的ZwTerminateProcess在KSDT中的索引,保存。

???? 那么下一步呢,就是干掉他了,替換為我們的函數,那么我們是不是要構造一個自己的函數過程呢,恩,沒錯。

????
代碼:
NTSTATUS NewZwTerminateProcess(
????????????????  IN HANDLE ProcessHandle OPTIONAL, 
????????????????  IN NTSTATUS ExitStatus
????????????????  )
{
??  //TODO
??  return STATUS_SUCCESS;
}
???? 在過程里要怎么玩,全看你自己了。

???? 下面就是替換函數了,修改SSDT中函數地址指向的位置,下面是宏定義:

代碼:
#define GetIndex(_foo) *(PULONG)((PUCHAR)_foo+1)
#define HookOn(_Old,_New) InterlockedExchange((PLONG)&MappedSCT[GetIndex(_Old)] ,(LONG)_New)
????
代碼:
MDLSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
if(!MDLSystemCall)
??  return STATUS_UNSUCCESSFUL;
MmBuildMdlForNonPagedPool(MDLSystemCall);
MDLSystemCall->MdlFlags = MDLSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; //可寫
MappedSCT = MmMapLockedPages(MDLSystemCall, KernelMode);
HookOn(ZwTerminateProcess, NewZwTerminateProcess);
return STATUS_SUCCESS;
完整代碼:

代碼:
///////////////////////////////////////////////////////////////////////////////
///
/// Copyright (c) 2008 - <company name here>
///
/// Original filename: NtHook.c
/// Project??????????  : NtHook
/// Date of creation : 2008-11-20
/// Author(s)????????  : 梧桐
///
/// Purpose??????????  : <description>
///
/// Revisions:
///??  0000 [2008-11-20] Initial revision.
///
///////////////////////////////////////////////////////////////////////////////
#include "ntddk.h"

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
????????  unsigned int *ServiceTableBase;
????????  unsigned int *ServiceCounterTableBase; //Used only in checked build
????????  unsigned int NumberOfServices;
????????  unsigned char *ParamTableBase;
} SSDTEntry;
__declspec(dllimport)??  SSDTEntry KeServiceDescriptorTable;

#pragma pack()

NTKERNELAPI NTSTATUS ZwTerminateProcess(
????????????????  IN HANDLE ProcessHandle OPTIONAL, 
????????????????  IN NTSTATUS ExitStatus
????????????????  ); 

typedef NTSTATUS(*_ZwTerminateProcess)(
????????????????  IN HANDLE ProcessHandle OPTIONAL,
????????????????  IN NTSTATUS ExitStatus
????????????????  );
_ZwTerminateProcess Old_ZwTerminateProcess;

#define GetSystemFunc(FuncName) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)FuncName+1)]
PMDL??  MDSystemCall;
PVOID *MappedSCT;

#define GetIndex(_Function) *(PULONG)((PUCHAR)_Function+1)

#define HookOn(_Old, _New)??  \
???????  (PVOID) InterlockedExchange( (PLONG) &MappedSCT[GetIndex(_Old)], (LONG) _New)

#define UnHook(_Old, _New)??  \
???????  InterlockedExchange( (PLONG) &MappedSCT[GetIndex(_Old)], (LONG) _New)

NTSTATUS NewZwTerminateProcess(
????????????????  IN HANDLE ProcessHandle OPTIONAL, 
????????????????  IN NTSTATUS ExitStatus
????????????????  )
{
??  return STATUS_SUCCESS;
}

//Unload
VOID UnLoad(IN PDRIVER_OBJECT DriverObject)
{
???  DbgPrint("UnLoad Driver.\n");
???  //卸載Hook
???  UnHook( ZwTerminateProcess, Old_ZwTerminateProcess);

???  //解鎖、釋放MDL
???  if(MDSystemCall)
???  {
??????  MmUnmapLockedPages(MappedSCT, MDSystemCall);
??????  IoFreeMdl(MDSystemCall);
???  }
}

//EntryPoint.
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, 
???????????  IN PUNICODE_STRING RegistryPath)
{
??  DriverObject->DriverUnload = UnLoad;
??  
??  //找出舊函數地址并保存
??  Old_ZwTerminateProcess =(_ZwTerminateProcess)(GetSystemFunc(ZwTerminateProcess));

??  MDSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
??  if(!MDSystemCall)
????  return STATUS_UNSUCCESSFUL;
??  MmBuildMdlForNonPagedPool(MDSystemCall);
??  MDSystemCall->MdlFlags = MDSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
??  MappedSCT = MmMapLockedPages(MDSystemCall, KernelMode);

??  //安裝HOOK
??  HookOn( ZwTerminateProcess, NewZwTerminateProcess);
??  return STATUS_SUCCESS;
}

工程附件:http://xlick.3video.cn/1.zip

一段類似的代碼

#include "ntddk.h"


ULONG pid=1548;

#pragma pack(1) //SSDT表的結構
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()


__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; //變量名是不能變的,因為是從外部導入

//取函數在SSDT中的位置
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
//取函數的索引
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
//修改函數的地址
#define HOOK_SYSCALL(_Function, _Hook, _Orig ) _Orig = (PVOID) InterlockedExchange( (PLONG) &m_Mapped[SYSCALL_INDEX(_Function)], (LONG) _Hook)
PMDL m_MDL;
PVOID *m_Mapped;


NTSYSAPI NTSTATUS NTAPI ZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);

typedef NTSTATUS (*ZWOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
typedef NTSTATUS (*ZWTERMINATEPROCESS)(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);

NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);

NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS *pEProcess);

ZWOPENPROCESS OldZwOpenProcess = NULL;
ZWTERMINATEPROCESS OldZwTerminateProcess = NULL;

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
//卸載時會調用
PVOID Oldfun = NULL;

HOOK_SYSCALL(ZwOpenProcess,OldZwOpenProcess,Oldfun);
HOOK_SYSCALL(ZwTerminateProcess,OldZwTerminateProcess,Oldfun);

if(m_MDL){
?? MmUnmapLockedPages(m_Mapped,m_MDL);
?? IoFreeMdl(m_MDL);
}

KdPrint(("驅動卸載完畢.\n"));
}

NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL)
{
if((long)ClientId->UniqueProcess == pid)
{
?? KdPrint(("保護進程,打開操作 PID:%ld\n",pid));
?? return STATUS_ACCESS_DENIED;
}
//剩下的交給我們的原函數
return OldZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
}

NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
{
NTSTATUS nStatus = STATUS_SUCCESS;
PEPROCESS EPROCESSPROTECT = NULL;
PEPROCESS EPROCESSKILL = NULL;

//我們要保護的進程的PID存在變量pid里,使用PsLookupProcessByProcessId可以通過PID獲得EPROCESS
PsLookupProcessByProcessId((ULONG)pid,&EPROCESSPROTECT);

//通過ProcessHandle來獲得當前要結束的進程的EPROCESS
if (ObReferenceObjectByHandle(ProcessHandle,GENERIC_READ,NULL,KernelMode,&EPROCESSKILL,0) == STATUS_SUCCESS)
{
?? //如果要結束的是我們需要保護的進程,這里分兩種情況
?? if (EPROCESSPROTECT== EPROCESSKILL)
?? {
??? if (EPROCESSPROTECT != PsGetCurrentProcess())
??? {//情況一:當前進程不是我們所保護的進程
???? //換句話說也就是其他進程試圖結束我們所保護的進程,當然不能讓他結束
???? KdPrint(("[-]進程保護,外部程序試圖關閉保護進程\n"));
???? nStatus = STATUS_ACCESS_DENIED;
??? }else{
???? //當我們程序點擊關閉也是使用的TermianteProcess,
???? //所以這種情況下當前進程是我們所保護的進程,則正常退出
???? KdPrint(("[-]進程保護,程序自身退出請求!\n"));
??? }
???
?? }
}

//剩下的交給我們的原函數
if (nStatus != STATUS_SUCCESS)
?? return nStatus;
else
?? return OldZwTerminateProcess(ProcessHandle,ExitStatus);
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
{
NTSTATUS??????? ntStatus = STATUS_SUCCESS;
PDEVICE_OBJECT deviceObject = NULL;

DriverObject->DriverUnload = OnUnload;

m_MDL = MmCreateMdl(NULL,KeServiceDescriptorTable.ServiceTableBase,KeServiceDescriptorTable.NumberOfServices*4);
if(!m_MDL)
{
?? return STATUS_UNSUCCESSFUL;
}

//非分頁內存
MmBuildMdlForNonPagedPool(m_MDL);

m_MDL->MdlFlags = m_MDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;

//鎖定
m_Mapped = MmMapLockedPages(m_MDL, KernelMode);

HOOK_SYSCALL(ZwOpenProcess,NewZwOpenProcess,OldZwOpenProcess);
HOOK_SYSCALL(ZwTerminateProcess,NewZwTerminateProcess,OldZwTerminateProcess);

return STATUS_SUCCESS;
}

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 亚洲日本在线视频观看| 亚洲欧洲在线播放| 国产精品白丝av嫩草影院| 午夜精品久久一牛影视| 欧美一区二区三区四区在线| 在线观看一区二区精品视频| 亚洲国产精品一区二区www| 国产精品va在线播放| 久久久噜久噜久久综合| 欧美国产日本高清在线| 亚洲一区高清| 久久久人成影片一区二区三区观看| 亚洲大胆人体在线| 一本色道久久综合亚洲精品高清| 国产精品一区二区在线观看不卡 | 亚洲午夜精品视频| 国产亚洲人成a一在线v站| 欧美激情免费在线| 国产精品久久久久久久久免费桃花| 久久精品视频va| 麻豆视频一区二区| 亚洲愉拍自拍另类高清精品| 久久久精品一区二区三区| av成人天堂| 久久久久**毛片大全| 亚洲一区视频在线| 免费在线日韩av| 久久久久久久一区二区| 欧美日韩在线看| 欧美激情亚洲综合一区| 国产亚洲精久久久久久| 日韩天堂av| 亚洲国产精品久久久久| 欧美一区三区三区高中清蜜桃 | 国产精品视频在线观看| 激情文学一区| 亚洲天堂av图片| 日韩视频在线观看| 久久综合网络一区二区| 欧美中文在线观看国产| 欧美色另类天堂2015| 国产精品有限公司| 尹人成人综合网| 美女露胸一区二区三区| 亚洲人成人一区二区在线观看| 日韩亚洲在线观看| 国产精品区一区二区三| 午夜欧美理论片| 亚洲高清三级视频| 亚洲女爱视频在线| 久久一区激情| 亚洲一区二区三区成人在线视频精品| 亚洲女同性videos| 91久久久久久久久| 狠狠狠色丁香婷婷综合激情| 欧美日韩在线播| 欧美高清在线观看| 久久免费视频在线| 久久在线播放| 久久理论片午夜琪琪电影网| 欧美亚洲在线| 久久一综合视频| 久久资源av| 日韩一区二区精品葵司在线| 欧美在线免费看| 性刺激综合网| 久久精品一区二区三区不卡牛牛| 亚洲小说春色综合另类电影| 亚洲图片欧美日产| 欧美一级成年大片在线观看| 欧美在线日韩在线| 久久九九精品| 亚洲啪啪91| 亚洲在线视频免费观看| 欧美中文字幕在线| 欧美精品一区二区三区一线天视频| 欧美承认网站| 国产一区二区高清视频| 91久久精品国产91性色tv| 国产精品99久久久久久白浆小说 | 美女脱光内衣内裤视频久久影院 | 欧美亚洲免费电影| 欧美jizz19性欧美| 欧美日韩天天操| 亚洲国产精品尤物yw在线观看 | 久热精品在线视频| 99精品国产福利在线观看免费| 一区二区欧美视频| 亚洲国产精品久久| 亚洲欧美视频在线观看| 亚洲国产另类久久精品| 亚洲精选视频免费看| 精品福利电影| 亚洲精品乱码久久久久久蜜桃麻豆| 99国内精品久久| 久久资源av| 日韩视频一区二区在线观看| 欧美一区二区三区免费视频 | 国产精品美女主播在线观看纯欲| 国产精品一区二区三区乱码| 日韩视频免费观看| 欧美国产一区二区在线观看| 亚洲一区二区三区乱码aⅴ| 欧美极品在线播放| 亚洲激情综合| 欧美黄色aaaa| 欧美成人自拍视频| 亚洲区中文字幕| 欧美激情视频免费观看| 久久久久亚洲综合| 91久久久久久| 亚洲日本免费| 国产精品a久久久久久| 欧美一级精品大片| 99国内精品| 国产日韩精品久久久| 老司机久久99久久精品播放免费| 欧美一区二区三区免费大片| 国产伦精品一区二区三区高清| 久久久国产亚洲精品| 欧美www视频在线观看| 亚洲嫩草精品久久| 欧美成人精品在线视频| 亚洲一区在线直播| 久久久综合网站| 一区二区高清在线观看| 久久成人免费视频| 午夜精品一区二区三区在线视| 久久精品国产综合| 亚洲美女福利视频网站| 亚洲欧美日韩国产综合在线| 亚洲福利国产| 欧美影片第一页| 亚洲欧美一区二区在线观看| 欧美激情四色| 狼人社综合社区| 国产精品社区| 在线亚洲一区观看| 亚洲欧美国产高清| 欧美成人免费全部观看天天性色| 亚洲一区二区三区777| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲欧美日韩人成在线播放| 欧美成人午夜激情| 亚洲高清视频中文字幕| 亚洲国产精品黑人久久久| 久久精品免费播放| 欧美高清在线一区| 亚洲国产精品一区二区www| 欧美在线观看你懂的| 麻豆精品在线视频| 亚洲激情视频在线| 欧美乱妇高清无乱码| 日韩视频欧美视频| 亚洲欧美一区在线| 黄色国产精品一区二区三区| 久久视频在线视频| 日韩亚洲一区二区| 亚洲欧美偷拍卡通变态| 黄色成人片子| 欧美午夜片欧美片在线观看| 亚洲欧美另类在线观看| 激情成人综合网| 欧美国产另类| 午夜精品一区二区三区四区| 免费久久99精品国产自| 欧美一区二区三区在| 午夜精品99久久免费| 另类专区欧美制服同性| 亚洲国产成人久久综合| 国产精品美女久久| 男女精品视频| 久久久精品一区| 欧美有码在线观看视频| 亚洲一二三级电影| 亚洲日本欧美天堂| 亚洲黄页视频免费观看| 久久免费一区| 久久精品在线免费观看| 亚洲一区国产| 午夜精品视频网站| 欧美一区二区三区四区在线 | 久久精品国产2020观看福利| 久久国产精品久久久久久久久久| 亚洲综合色噜噜狠狠| 中文在线一区| 亚洲一区二区三区在线看| 亚洲一区二区三区四区五区午夜 | 久久精品一本| 久久免费国产精品| 欧美日韩亚洲高清一区二区| 国产精品久久久久久久浪潮网站| 欧美视频免费看| 国产精品亚洲а∨天堂免在线|