亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種隱藏注入模塊的新方法*

        2015-03-19 00:35:22建,劉
        計算機工程與科學 2015年8期
        關鍵詞:內核線程進程

        吳 建,劉 新

        (湘潭大學信息工程學院“智能計算與信息處理”教育部重點實驗室,湖南 湘潭411105)

        1 引言

        在信息安全領域,對借助各類工具對惡意軟件進行動態(tài)跟蹤分析是安全專家的日常工作。但是,越來越多的惡意軟件會檢測自身進程空間中是否存在其他模塊來發(fā)現安全分析工具的存在。為對抗這種反監(jiān)控,安全分析工具需要通過Rootkits[1]和Anti Rootkits技術來隱藏注入模塊[2,3]。

        注入是指讓目標進程非自愿地加載指定的模塊,進而執(zhí)行特定的代碼。Windows操作系統(tǒng)下的注入方法非常多,我們依據目標進程是否會被動地載入模塊,將注入方式劃分為“有模塊注入”和“無模塊注入”兩類。

        “有模塊注入”的方法常用的有:消息鉤子注入、DLL劫持注入、注冊表注入、輸入法注入、內核回調注入、依賴可信進程注入等等[2,4]?!坝心K注入”的優(yōu)點是注入手段多,并且可以做到在不向目標進程空間寫入任何數據的情況下,把DLL 模塊注入進去。由于這些注入方式是利用操作系統(tǒng)提供的一些特殊接口來實現的,而正常軟件也經常利用這些注入方法來實現某些功能,所以惡意軟件很難區(qū)分出哪些注入是由安全分析工具發(fā)起的,也就無法抵抗這些注入行為。但是,這些注入方法會在目標進程里多出一個模塊,增加了暴露的可能性。

        由于注入模塊在進程的整個生命周期中都存在(在任何時候使用ARK 工具對目標進程進行人工檢測,都很容易發(fā)現這個注入模塊),因此這種注入方式盡管可能暫時騙過惡意軟件的防御,但無法逃避經驗豐富的惡意軟件編制者的檢測。惡意軟件如果想逃避監(jiān)控的話,可以通過定時掃描自身進程空間的方式來發(fā)現是否增加了監(jiān)控模塊,以便采取反監(jiān)控措施。

        為了讓注入模塊更加隱蔽,安全技術人員提出了一種被稱為“無模塊注入”的技術,該技術的基本思想是去掉DLL模塊這個代碼的載體,直接把代碼寫入到目標進程。目前常用的“無模塊注入”方法有SHELLCODE[5]注入、自加載DLL 等。但 是,這些注入方法實現起來比較麻煩,并且要向目標進程寫入大量的數據。對于有內存讀寫保護的進程,必須要把握住很好的時機(進程已經創(chuàng)建,但保護還沒生效的時候),這種注入手段才能奏效。由于這些“無模塊注入”的方式一定要向目標進程寫入或者映射數據,而正常軟件一般是不會有這種行為的,所以注入行為本身很容易被檢測到并且被阻止運行。

        “無模塊注入”雖然在注入完成后可以很好地隱藏注入到目標進程的代碼,但它一定會有跨進程操作內存的行為,而且這種行為是很危險的,所以安全軟件通常采用的注入方法依然是“有模塊注入”。為了更好地隱藏自己,在注入完成之后有必要把這個多出的DLL模塊給隱藏起來。

        比較常見的隱藏模塊的方法有斷開鏈表的節(jié)點、Hook 枚 舉 模 塊 的API 函 數、抹 去PE 頭等[4,6],但這些隱藏方法都有各種各樣的缺點。

        Hook枚舉模塊的函數,修改函數返回值是一種比較“古老”的技術,目前已經有了通用的方法來對抗這種隱藏,該方法被稱為“模塊重載技術”。因為無論是用戶態(tài)的DLL 模塊,還是內核態(tài)的內核模塊都是可以重載的,只需要重新加載一份DLL模塊或者內核模塊,然后調用重新加載的模塊里的函數,就可以繞過被安裝了鉤子的函數。所以,依靠Hook技術來隱藏自己是有局限性的。并且,在Windows 7 X64 操作系統(tǒng)的內核里已經有了PatchGuard[7],如果Hook內核代碼,則會導致系統(tǒng)崩潰。所以,利用常規(guī)的Hook技術來實現對模塊的隱藏,作用越來越來小,限制越來越大。

        抹去PE頭是用來對抗特征碼搜索的一種技術,這種方法通過清除模塊的結構特征來實現隱藏的效果,所以一般只能作為一種隱藏的輔助手段。

        由于上面兩種方法存在上述缺陷,要想很好地隱藏自己的模塊,有必要從操作系統(tǒng)維護模塊信息的數據結構下手來處理。在RING3層,維護模塊信息的數據主要在_PEB_LDR_DATA 里,這個結構包含三個鏈表。下面是用WINDBG 在Windows XP 和Windows 7X86 下 查 看PEB_LDR_DATA 顯示的部分結構:

        除此之外,在NTDLL 中還保存著一個叫做HashTable的鏈表,這個鏈表也保存著進程的模塊信息。所以,在RING3 層總共會有四個LDR_MODULE鏈保存著DLL模塊的信息。

        容易想到,如果把保存模塊的信息的節(jié)點從這四個鏈表中摘除,就可以在RING3層實現對相應模塊的隱藏。但是,在內核中還有一棵管理進程內存空間的平衡二叉樹(VAD 樹),在這棵平衡二叉樹中,有一類節(jié)點保存著內存映射(SECTION)的相關信息。并且在這類節(jié)點中,保存著一個與SECTION 關聯(lián) 的 文 件 對 象(FILE_OBJECT)[8]。而DLL模塊是以內存映射(SECTION)的方式被加載的,所以通過在內核態(tài)遍歷VAD 樹還是可以發(fā)現被隱藏模塊的。要想隱藏得更加徹底,還需要編寫驅動程序將VAD 樹中對應節(jié)點的文件對象中的路徑清零。由于這種隱藏模塊的方式需要編寫驅動程序,實現起來比較麻煩;并且在比較新的操作系統(tǒng)中,加載驅動程序越來越困難[9]。再加上在Windows 7X64系統(tǒng)中還有PatchGuard,修改這棵VAD 樹會導致系統(tǒng)崩潰。因此,通過斷開操作系統(tǒng)中用來維護模塊信息的鏈表來隱藏模塊,也越來越不適應新環(huán)境。

        2 隱藏注入模塊的新方法

        為了達到隱藏模塊的目的,需要尋找一個比較通用的、不在上述四條鏈表和VAD 樹中留下痕跡的加載模塊的方法。

        一種思路是不調用操作系統(tǒng)的加載模塊的API函數,直接把DLL 模塊中的代碼和數據寫入到目標進程,然后再自己處理導入表和重定位表。實驗表明,在惡意軟件沒有采取防御的情形下,這種方式是有效的。但是,因為這種方式有跨進程向內存空間寫入數據的行為,所以很容易被惡意軟件防范。

        還有一種思路是先讓DLL 模塊正常加載,然后復制一份完整的DLL 模塊的內存映象,把原先的DLL模塊釋放掉,再以DLL模塊正常加載的基址為地址申請與原DLL模塊內存映象相同大小的內存,然后再把備份的映象復制回去。這樣該DLL模塊就在操作系統(tǒng)中消失了,并且免去了修復導入表和重定位的麻煩。但是,這種方式同樣需要操作目標進程的內存,所以也會被惡意軟件防范。

        上面的兩種注入方法可以歸類為“無模塊注入”,可以比較好地隱藏被注入的代碼。但是,它有個致命的危險行為:操作不屬于自己的內存空間,進而被惡意軟件防范。

        既然“無模塊注入”的致命缺點是有跨進程操作內存空間的行為,如果能夠在目標進程內部進行代碼的去模塊化操作,由于惡意軟件無法察覺這種進程內部操作內存的行為,那么這種去模塊化的方法從理論上來看應該能夠繞過惡意軟件的防御。

        系統(tǒng)中任何一個軟件為了能在系統(tǒng)中生存和正常運行下去,總會允許一些“有模塊注入”行為注入到自身(比如輸入法的調用,就是一種“有模塊注入”)。對于“有模塊注入”,惡意軟件很難鑒別出哪些注入是系統(tǒng)必須的,哪些注入是由安全軟件發(fā)起的,所以不可能阻止所有的注入行為。亦即任何軟件都無法有效地防御所有的“有模塊注入”,因此可以把“有模塊注入”和代碼的去模塊化操作結合起來。并且通過在無模塊化的代碼中釋放被注入的模塊,可以解決“有模塊注入”在目標進程中會多出一個模塊的缺點,從而達到很好的隱藏效果。

        根據以上分析,形成了以下思路:先通過“有模塊注入”的方式在目標進程中注入一個類似“加載器”的模塊,然后在“加載器”中實現無模塊化加載主功能模塊,最后把“加載器”模塊釋放掉,實現去模塊化操作。

        2.1 隱藏模塊的實現步驟

        本方法需要用到兩個DLL,第一個DLL 是包含監(jiān)控功能的DLL,為了描述方便,將其命名為main.dll;第二個DLL 用來加載主main.dll,并實現對main.dll的隱藏,這個DLL 命名為load.dll。以下是實現步驟:

        步驟1采取一種惡意軟件無法進行有效防御的“有模塊注入”方法(比如輸入法注入)注入load.dll到目標進程。

        步驟2在load.dll中加載main.dll,此時main.dll會完成對全局變量以及堆的初始化。

        步驟3復制一份main.dll到其他區(qū)域作為備份。

        步驟4直接修改main.dll的入口函數為返回,再釋放main.dll。此時在目標進程內已經不存在main.dll,也就檢測不到main.dll了。

        步驟5在main.dll原基址申請同樣大小的地址空間,把備份數據復制到原地址空間。

        步驟6執(zhí)行main.dll的一個導出函數,在這個函數內釋放load.dll,并執(zhí)行一些初始化操作。至此,load.dll和main.dll都已從目標進程內釋放,但main.dll內的代碼還可以正常執(zhí)行。

        步驟7為了達到更加隱蔽的效果,還需要把main.dll的整個PE頭部清零。

        2.2 抹掉PE頭,對抗暴力枚舉

        注入到目標進程的DLL 模塊,會有比較明顯的結構特征。惡意軟件通過遍歷整個內存空間,然后搜索特征碼的方式,可以發(fā)現被隱藏的模塊。這種檢測方式可以稱之為“暴力枚舉”。為了對抗這種暴力枚舉,需要將模塊的結構特征清除掉。

        PE 文件是Windows操作系統(tǒng)上的程序文件(Portable Executable)的 統(tǒng) 稱,DLL 模 塊 就 是 按PE文件格式[10]組織的,常見的EXE、DLL、OCX、SYS、COM 都是PE文件。圖1描述了PE 文件的基本結構。

        Figure 1 Structure of PE file圖1 PE文件結構

        經 過 實 驗,把“DOS HEADER”和“PE HEADER”清零后,DLL 模塊中的代碼是可以正常工作的。下面是清零的關鍵代碼。

        2.3 釋放DLL同時保留DLL的資源

        通過調用釋放模塊的API函數,可以把DLL模塊的信息從目標進程和系統(tǒng)的相關數據結構內刪除。這個時候,無論是在用戶態(tài)還是內核態(tài),都無法通過常規(guī)方法發(fā)現被隱藏的模塊。但同時,模塊占用的內存區(qū)域和一些資源也會被釋放掉,這樣會導致程序不能正常執(zhí)行。

        為解決內存被釋放的問題,可以備份整個模塊的數據和重新分配內存?,F在就只剩下一個關鍵問題:在調用釋放模塊函數的時候,如何阻止操作系統(tǒng)釋放DLL模塊的資源。

        操作系統(tǒng)提供的釋放資源的API函數freelibrary(),會執(zhí)行下面兩個操作:

        (1)把DLL模塊所占用的由系統(tǒng)分配的資源釋放掉(比如堆heap)。為了阻止這種資源釋放,可以在調用釋放模塊的API函數之前,把DLL 模塊的入口點的指令修改為RET 指令。代碼如下:

        (2)減少依賴的其他DLL模塊的計數,進而可能會導致這些DLL模塊被釋放。為了使注入的模塊更加隱蔽,應該在這個DLL 模塊中盡可能少依賴其它DLL。在用VS 編譯DLL 時,選擇“多線程/MT”選項,可以做到編譯出來的DLL 模塊只有KERNEL32.DLL 和USER32.DLL 兩個依賴項。而在被注入的進程里,一般也會有這兩個DLL,從而可以解決依賴的DLL 模塊被釋放的問題。

        2.4 保持模塊“活性”

        把DLL模塊注入到目標進程后,如果得不到運行機會,這塊代碼就是“死的”,是一種無效注入。必須要讓DLL 模塊里的代碼不斷地得到進入CPU 的機會去執(zhí)行一些操作,這種注入才是有效的。我們把這種爭取CPU 控制權的行為稱為“保持活性”。

        要保持模塊的活性,一種思路是Hook被注入進程經常會調用的一些函數(比如消息響應函數WINPROC),這樣可以讓注入的代碼經常有機會得到執(zhí)行。但是,這種方法不能準確地確定注入的代碼被執(zhí)行的時機,并且有時還會觸發(fā)被注入進程的一些保護機制。

        還有一種方法就是在DLL 模塊被初始化時,創(chuàng)建一個線程。在這個線程里,定時地執(zhí)行注入的代碼;并且還可以使用同步對象(EVENT、MUTEX 等)和內存映射等機制與外部進程進行實時的通信和交互,就相當于在目標進程中插入了一個間諜。采用這種方式注入代碼的執(zhí)行時間可控,而且可以主動運行,比第一種方法更好。但是,這種方法也有個比較明顯的缺點:在目標進程中會多出一個線程,并且這個線程是無模塊的,惡意軟件作者可以發(fā)現這個線程。因此,還需要進一步地改進,使得該注入線程看上去更像一個普通線程。

        2.5 線程偽裝

        線程是調度的基本單位,要完全隱藏線程,基本上不可能真正實現。不過,目前絕大多數程序都是多線程的,在目標進程多出一個線程即便經驗豐富的專業(yè)技術人員也很難辨別其是否為注入,因此沒有必要把線程給徹底隱藏。只需要把“線程沒有對應的模塊”這個問題給解決了,就能達到很好的隱蔽效果。

        把線程從一個模塊轉移到另一個模塊的方法被稱為線程偽裝,用這種方法可以很好地解決無主線程的問題。系統(tǒng)判斷線程所在的模塊,是通過先取得線程的開始地址,然后再用這個開始地址去定位相應的模塊。因此,只要偽造一個假的線程開始地址,就可以讓這個線程“屬于相應的模塊”。具體方法如下:在目標進程已經存在的模塊中尋找一個地址(比如模塊入口函數),在這個地址處構造一個跳轉指令,直接跳到線程函數的起始地址。然后,在創(chuàng)建線程的時候,用找到的這個“跳板地址”作為創(chuàng)建線程的參數。等這個線程運行起來以后,再恢復被修改的指令。這樣,被隱藏的模塊的線程就不再是“無主線程”。

        通過這種方法,可以很好地解決駐留線程被檢測的問題。下面這份代碼讓“無主線程”thread-Start成功轉嫁到了kernel32.DLL上。

        2.6 兩個特殊問題的解決

        把注入的DLL模塊給隱藏后,系統(tǒng)的API函數GetmoduleHandle、GetModuleFileName 等 需要枚舉模塊的函數均無法定位到這個模塊,可能會導致注入的代碼出現一些異常。下面是在實驗過程中遇到過的兩種問題:

        (1)如果DLL模塊中是有資源的,系統(tǒng)在加載資源前會要求先定位到這個DLL 模塊,然后才會加載資源。但是,這個DLL模塊已經被隱藏,會導致程序出錯。

        (2)操作系統(tǒng)在進行異常分發(fā)時,也需要定位異常指令所在的模塊。但是,由于該模塊已被隱藏,所以異常處理代碼不能發(fā)揮作用。

        我們的解決方法是在定位模塊的函數中安裝鉤子,然后進行堆?;厮輽z測,如果發(fā)現是自己的模塊在定位自己時,就返回正確的信息。但是,這個方法需要安裝鉤子,處理不夠隱蔽。

        更隱蔽一點的方法就是在這個被隱藏的DLL模塊中既不攜帶資源,也不進行異常處理。由于注入的代碼一般不是很多,因此要做到既無資源,又無異常,還是比較容易實現的。

        3 實驗結果與分析

        XueTr是一款廣受好評的ARK 工具,它對模塊和線程有很強大的檢測能力。本實驗就用XueTr來觀察隱藏模塊的效果。

        前面已經介紹了Hook枚舉模塊的函數、斷開進程的LDR_MODULE 鏈、修改SECTION 類型的內存區(qū)域節(jié)點等實現隱藏模塊的方法。有的方法達不到隱藏效果,有的方法在低版本的Windows操作系統(tǒng)(比如Windows XP)下可以實現模塊隱藏,但在一些高版本的操作系統(tǒng)(比如Windows 7X64)中卻無法實現。本次實驗采用了“斷開進程的LDR_MODULE鏈”這種方法,與我們設計的方法進行對比。

        在不隱藏模塊的情況下,實驗結果如圖2 所示,main.dll會被檢測出(圖中的第一行)。

        采用“斷開進程的LDR_MODULE鏈”來隱藏模塊,如圖3所示。第一行是被隱藏的模塊,并且被XueTr標記為危險狀態(tài)(危險狀態(tài)顯示為紅色,但在黑白印刷中,看不出紅色,下同)。

        而用我們的方法來隱藏被注入的模塊,可以達到很好的隱藏效果。從圖4可以看出,注入的模塊已經完全被隱藏。

        Figure 2 Effect of not hiding the injected modules圖2 不隱藏模塊的效果

        Figure 3 Effect of hiding the injected modules by disconnecting chains圖3 斷鏈隱藏模塊的效果

        Figure 4 Effect of hiding the injected modules by our method圖4 我們的方法隱藏模塊的效果

        再來看線程偽裝的效果。圖5是在沒有進行線程偽裝之前,XueTr檢測到的線程信息。可以看到,第一行顯示出駐留線程是“無主線程”并且被標記為危險狀態(tài)。

        Figure 5 Effect before camouflaging thread圖5 沒有線程偽裝的效果

        線程偽裝之后的效果如圖6所示。駐留線程已經“屬于了”kernel32.DLL這個模塊。

        Figure 6 Effect after camouflaging thread圖6 線程偽裝后的效果

        從實驗結果可以看出,本文中的方法比目前的主流方法隱蔽性更好。并且這種方法在Windows XP及其以后的Windows系列平臺都適用。

        4 結束語

        本文將“有模塊注入”和“無模塊注入”結合起來,形成了一種突破性強、隱藏性好、兼容性好的隱藏注入模塊的方法,并且對這種隱藏方法進行了實驗。用這種方法實現對被注入模塊的隱藏,突破防御的能力強,能夠兼容各種版本的Windows操作系統(tǒng),并且隱蔽性比目前的通用方法都要好。

        不過,本文的方法還存在一些小的不足:用這種方法實現模塊的隱藏時,在目標進程會多出一塊內存。要處理得更加隱蔽,可以考慮把這塊內存也隱藏起來。

        另外,如果被注入進程有檢測機制,并且在常用的函數處安裝了鉤子,然后在堆棧中回溯出調用鏈,也能定位到被隱藏的模塊。但是,這種自我檢測會對程序的運行效率造成比較大的影響,所以一般很少有程序采用。同時,為了對抗這種檢測,可以考慮在調用常用的系統(tǒng)函數前構造一條假的調用鏈[4]。另外,還有可以從根本上繞過這種堆?;厮輽z測的方法:重載有所依賴的系統(tǒng)DLL 模塊。為了更加隱蔽,在重載系統(tǒng)DLL的時候,也可以把重載的系統(tǒng)DLL做無模塊化處理。

        以上這些問題,將在后續(xù)的研究中逐步解決。

        [1] Gong Guang,Li Zhou-jun,Hu Chao-jian,et al.Research on stealth technology of Windows kernel level rootkits[J].Computer Science,2010,37(4):59-62.(in Chinese)

        [2] Xu Ming,Yang Tong,Zheng Lian-qing,et al.Concealing technology of Trojan horses and prevention[J].Computer Engineering and Design,2011,32(2):489-492.(in Chinese)

        [3] He Zhi,Fan Ming-yu,Luo Bin-jie.Research on remote-thread injection based hidden process technology[J].Computer Applications,2008,28(6):92-94.(in Chinese)

        [4] Xu Sheng.Game plugin art[M].Beijing:Electronic Industry Press,2013.(in Chinese)

        [5] Wang Ying,Li Xiang-h(huán)e,Guan Long,et al.Attack and defending technology of shellcode [J].Computer Engineering,2010,36(18):163-168.(in Chinese)

        [6] Doug W.Methods for detecting kernel rootkits[D].University of Louisville,2007.

        [7] Han Zhuo,Ran Xiao-min,LüWen-gao.Kernel integrity verification of Windows 7[J].Journal of Information Engineering University,2011,12(6):764-768.(in Chinese)

        [8] Mao De-cao.Windows kernal scenario analysis—using open source code ReactOS[M].Beijing:Electronic Industry Press,2009.(in Chinese)

        [9] Zhang Zhi,Cai Wan-dong.Excution method of unsigned driver on Windows x64[J].Microelectronics &Computer,2014,31(2):101-105.(in Chinese)

        [10] Qi Li.Windwos PE authoritative guide[M].Beijing:Mechanical Industry Press,2011.(in Chinese)

        附中文參考文獻:

        [1] 龔廣,李舟軍,忽朝儉,等.Windows內核級Rootkits隱藏技術的研究[J].計算機科學,2010,37(4):59-62.

        [2] 許名,楊仝,鄭連清,等.木馬隱藏技術與防范方法[J].計算機工程與設計,2011,32(2):489-492.

        [3] 何志,范明鈺,羅彬杰.基于遠程線程注入的進程隱藏技術研究[J].計算機應用,2008,28(6):92-94.

        [4] 徐勝.游戲外掛攻防藝術[M].北京:電子工業(yè)出版社,2013.

        [5] 王穎,李祥和,關龍,等.Shellcode攻擊與防范技術[J].計算機工程,2010,36(18):163-168.

        [7] 韓卓,冉曉旻,呂文高.Windows7內核完整性驗證機制研究[J].信息工程大學學報,2011,12(6):764-768.

        [8] 毛德操.Windows內核情景分析——采用開源代碼ReactOS(上、下冊)[M].北京:電子工業(yè)出版社,2009.

        [9] 張智,蔡皖東.Windows x64無簽名驅動程序運行方法[J].微電子學與計算機,2014,31(2):101-105.

        [10] 戚利.Windows PE權威指南[M].北京:機械工業(yè)出版社,2011.

        猜你喜歡
        內核線程進程
        萬物皆可IP的時代,我們當夯實的IP內核是什么?
        現代裝飾(2022年4期)2022-08-31 01:41:24
        強化『高新』內核 打造農業(yè)『硅谷』
        債券市場對外開放的進程與展望
        中國外匯(2019年20期)2019-11-25 09:54:58
        基于嵌入式Linux內核的自恢復設計
        Linux內核mmap保護機制研究
        淺談linux多線程協(xié)作
        社會進程中的新聞學探尋
        民主與科學(2014年3期)2014-02-28 11:23:03
        我國高等教育改革進程與反思
        Linux僵死進程的產生與避免
        Linux線程實現技術研究
        国产精品99久久久久久猫咪| 色噜噜色哟哟一区二区三区| 国产黑丝美女办公室激情啪啪 | 国产成人无码区免费内射一片色欲| 99久久久久国产| 青青青伊人色综合久久| 一区二区三区四区草逼福利视频 | 色www视频永久免费| 五月天激情综合网| 亚洲人av毛片一区二区| 狼人伊人影院在线观看国产| 亚欧中文字幕久久精品无码| 人妻丰满熟妇av无码区app| 亚洲精品午夜无码电影网| 国产精品99久久久久久98AV| 综合人妻久久一区二区精品| 国产91清纯白嫩初高中在线观看| 黄网站欧美内射| 日韩秘 无码一区二区三区| 极品新娘高清在线观看| 国产精品天天看天天狠| 亚洲高潮喷水无码av电影| 亚欧乱色束缚一区二区三区| 久久精品国产亚洲av天美| 无码国内精品久久人妻| 亚洲依依成人综合在线网址| 精品中文字幕日本久久久| 一本之道久久一区二区三区| 人妻丝袜av中文系列先锋影音| 小12箩利洗澡无码视频网站| 中文字幕日韩精品亚洲精品| 国产猛男猛女超爽免费视频| 人成午夜免费大片| 国产自产拍精品视频免费看| 国产亚洲成人精品久久久| 成人性生交大片免费| AV永久天堂网| 国产精品一品二区三区| а天堂8中文最新版在线官网| 中文字幕av在线一二三区| 中文字幕人妻一区色偷久久|