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

        ?

        基于SEH的反調(diào)試技術(shù)及其應(yīng)用研究

        2025-08-26 00:00:00蔣子恒邵金俠
        電腦知識(shí)與技術(shù) 2025年20期

        摘要:軟件安全日益重要,反調(diào)試技術(shù)是保護(hù)軟件知識(shí)產(chǎn)權(quán)的關(guān)鍵手段。該文研究了基于結(jié)構(gòu)化異常處理(SEH)的反調(diào)試技術(shù),闡述了其原理、實(shí)現(xiàn)方法,并結(jié)合Windows操作系統(tǒng),分析了具體的應(yīng)用案例。研究結(jié)果表明,SEH反調(diào)試技術(shù)可以有效阻止動(dòng)態(tài)調(diào)試分析,但仍存在一定的局限性。該文旨在為軟件開(kāi)發(fā)者提供SEH反調(diào)試技術(shù)的實(shí)踐參考。

        關(guān)鍵詞:SEH;反調(diào)試;異常處理;Windows;逆向工程

        中圖分類號(hào):TP309文獻(xiàn)標(biāo)識(shí)碼:A

        文章編號(hào):1009-3044(2025)20-0041-04

        0引言

        隨著軟件逆向工程技術(shù)的進(jìn)步,軟件安全面臨嚴(yán)峻挑戰(zhàn)。惡意攻擊者可以利用調(diào)試工具分析程序,竊取敏感信息或繞過(guò)安全機(jī)制。因此,反調(diào)試技術(shù)作為保護(hù)軟件知識(shí)產(chǎn)權(quán)的重要手段,得到了廣泛關(guān)注。結(jié)構(gòu)化異常處理(StructuredExceptionHandling,SEH)是Windows操作系統(tǒng)提供的異常處理機(jī)制,可用于檢測(cè)和阻止調(diào)試器的存在。本文將深入探討基于SEH的反調(diào)試技術(shù)原理、實(shí)現(xiàn)方法及其在Windows環(huán)境下的應(yīng)用,為軟件開(kāi)發(fā)者提供技術(shù)參考。

        1SEH基本概念

        1.1SEH簡(jiǎn)介

        結(jié)構(gòu)化異常處理(SEH)是Windows操作系統(tǒng)提供的異常處理機(jī)制[1],允許程序在發(fā)生異常時(shí)執(zhí)行特定的處理代碼,避免程序崩潰。它類似于C++中的try-catch塊,當(dāng)線程發(fā)生錯(cuò)誤時(shí),操作系統(tǒng)會(huì)調(diào)用用戶定義的回調(diào)函數(shù)[2]進(jìn)行處理。該回調(diào)函數(shù)可以執(zhí)行各種操作,例如修正錯(cuò)誤,并返回一個(gè)值告知系統(tǒng)后續(xù)操作。

        1.2SEH鏈

        SEH鏈由_EXCEPTION_REGISTRATION_RECORD結(jié)構(gòu)體組成的鏈表表示,每個(gè)結(jié)構(gòu)體包含指向下一個(gè)結(jié)構(gòu)體的指針和異常處理函數(shù)的地址[3]。當(dāng)程序遇到異常時(shí),會(huì)依次調(diào)用鏈上的異常處理器,直到異常得到處理或到達(dá)鏈表尾部,即next值為0xFFFFFFFF。

        1.3異常處理函數(shù)

        異常處理函數(shù)是SEH鏈中每個(gè)節(jié)點(diǎn)的核心,負(fù)責(zé)處理異常[4]。其函數(shù)原型為返回值枚舉型函數(shù)名(PEXCEPTION_RECORDExceptionRecord,PEXCEPTION_REGISTRATION_RECORDEstablisherFrame,PCONTEXTpcontext,PVOIDDispatcherContext)。返回值枚舉型包含ExceptionContinueExecution、ExceptionContinue?Search、ExceptionNestedException和ExceptionCollid?edUnwind4個(gè)可選值,分別表示異常已被處理、異常未被當(dāng)前程序處理、發(fā)生了嵌套異常和異常處理過(guò)程中出現(xiàn)沖突;EXCEPTION_RECORD結(jié)構(gòu)體包含異常信息;EXCEPTION_REGISTRATION_RECORD結(jié)構(gòu)體是SEH鏈中的節(jié)點(diǎn);CONTEXT結(jié)構(gòu)體包含異常發(fā)生時(shí)的CPU上下文;DispatcherContext是自定義參數(shù)。

        2SEH反調(diào)試原理

        2.1SEH反調(diào)試技術(shù)概述

        反調(diào)試技術(shù)可以隱藏和保護(hù)程序代碼與數(shù)據(jù),使其無(wú)法被逆向分析。常見(jiàn)的反調(diào)試方法包括檢查調(diào)試標(biāo)志、檢測(cè)調(diào)試窗口名稱、檢測(cè)調(diào)試窗口的進(jìn)程名和分析調(diào)試行為等。微軟創(chuàng)建了SEH機(jī)制,并將其搭載到VC++中,其實(shí)是一種從屬于VC++開(kāi)發(fā)工具和Windows操作系統(tǒng)的異常處理機(jī)制。通過(guò)SEH反調(diào)試技術(shù),在程序的異常處理部分嵌入一些反調(diào)試的邏輯,可以檢測(cè)調(diào)試器的存在,并采取一些措施阻止進(jìn)一步的分析。

        2.2SEH反調(diào)試的基本原理

        異常(Exception)常常用于反調(diào)試技術(shù)。正常運(yùn)行的進(jìn)程發(fā)生異常時(shí),在SEH機(jī)制的作用下,操作系統(tǒng)會(huì)接收到該異常,然后調(diào)用進(jìn)程中注冊(cè)的SEH處理。

        但如果進(jìn)程在調(diào)試運(yùn)行中發(fā)生異常,調(diào)試器就會(huì)接收處理。所以利用該特征可以判斷進(jìn)程是正常運(yùn)行還是處于被調(diào)試的狀態(tài),然后根據(jù)結(jié)果執(zhí)行對(duì)應(yīng)操作,這就是SEH反調(diào)試的原理。

        SEH反調(diào)試的實(shí)現(xiàn)包括如下步驟。

        1)設(shè)置異常處理鏈:為了在發(fā)生異常時(shí)能夠捕獲并處理,在程序的入口或關(guān)鍵位置,設(shè)置好SEH異常處理鏈。

        2)嵌入反調(diào)試邏輯:在異常處理函數(shù)中嵌入編寫(xiě)的反調(diào)試邏輯,通過(guò)檢查調(diào)試標(biāo)志、調(diào)用特定API等方法來(lái)檢測(cè)調(diào)試器的存在。

        3)觸發(fā)異常:故意觸發(fā)異常的位置并不固定,通常取決于程序編寫(xiě)者的需求,可通過(guò)故意觸發(fā)的異常,進(jìn)入異常函數(shù)處理。

        4)采取措施:當(dāng)反調(diào)試邏輯檢測(cè)到調(diào)試器存在時(shí),采取終止運(yùn)行、改變執(zhí)行流程等措施,阻止調(diào)試器進(jìn)一步分析。

        3異常處理函數(shù)內(nèi)反調(diào)試方法

        3.1檢查調(diào)試標(biāo)志

        檢查調(diào)試標(biāo)志:NtGlobalFlag是Windows內(nèi)核的全局標(biāo)記,它定義了系統(tǒng)調(diào)試參數(shù),通過(guò)檢查NtGlo?balFlag的值,調(diào)試狀態(tài)下通常為0x70,可以判斷程序是否被調(diào)試。獲取NtGlobalFlag的方法:首先通過(guò)TEB定位PEB,然后通過(guò)PEB+0x68找到NtGlobal?Flag。需要注意的是,修改NtGlobalFlag會(huì)影響整個(gè)系統(tǒng),應(yīng)謹(jǐn)慎使用。

        3.2檢測(cè)調(diào)試器窗口

        Windows操作系統(tǒng)提供了IsDebuggerPresentAPI函數(shù),用來(lái)檢測(cè)調(diào)試器窗口??梢酝ㄟ^(guò)IsDebugger?PresentAPI的返回值,判斷當(dāng)前進(jìn)程是否被調(diào)試。這種方法雖然方便,但容易被調(diào)試器繞過(guò),所以通常需要結(jié)合其他方法使用。

        3.3線程檢查

        調(diào)試器會(huì)創(chuàng)建或修改線程上下文,因此可以通過(guò)檢查線程的掛起狀態(tài)、優(yōu)先級(jí)、監(jiān)測(cè)線程的創(chuàng)建和銷毀事件等方法來(lái)檢測(cè)調(diào)試器的存在。

        3.4硬件斷點(diǎn)

        使用調(diào)試器調(diào)試游戲并修改游戲的內(nèi)存數(shù)據(jù)時(shí),硬件斷點(diǎn)反調(diào)試可以檢測(cè)并阻止這種調(diào)試行為,以防止調(diào)試器分析關(guān)鍵數(shù)據(jù)。硬件斷點(diǎn)利用調(diào)試寄存器(DR0~DR7)設(shè)置斷點(diǎn),反調(diào)試程序可以通過(guò)檢查這些寄存器的值來(lái)檢測(cè)硬件斷點(diǎn)的存在。然而,硬件斷點(diǎn)數(shù)量有限,且可能被高級(jí)調(diào)試器繞過(guò),同時(shí)也會(huì)影響游戲性能。硬件斷點(diǎn)原理圖如圖1所示。

        具體說(shuō)明如下:

        DR6:用于在調(diào)試異常產(chǎn)生后顯示一些信息。

        DR7:L0/G0-L3/G3:控制DR0—DR3是否有效,以及是局部還是全局的。每次異常后,Lx都被清零,Gx不清零。LENx(斷點(diǎn)長(zhǎng)度):00(1字節(jié)),01(2字節(jié)),11(4字節(jié))。R/Wx(斷點(diǎn)類型):00(執(zhí)行斷點(diǎn)),01(寫(xiě)入斷點(diǎn)),11(訪問(wèn)斷點(diǎn))。LEN0—LEN3對(duì)應(yīng)DR0—DR3斷點(diǎn)長(zhǎng)度。00表示1個(gè)字節(jié),01表示2個(gè)字節(jié),11表示4個(gè)字節(jié)。RW0—RW3對(duì)應(yīng)DR0—DR3斷點(diǎn)的類型,00表示執(zhí)行斷點(diǎn),1表示寫(xiě)入斷點(diǎn),11表示讀寫(xiě)斷點(diǎn)。

        DR0—DR3:用于設(shè)置硬件斷點(diǎn)位置,存儲(chǔ)線性地址。

        盡管硬件斷點(diǎn)反調(diào)試技術(shù)在游戲安全防護(hù)方面具有一定優(yōu)勢(shì),但其實(shí)也存在一定的局限性:1)調(diào)試寄存器數(shù)量有限:從圖1可以發(fā)現(xiàn),調(diào)試寄存器(如DR0—DR3)的數(shù)量有限,因此游戲只能同時(shí)設(shè)置有限數(shù)量的硬件斷點(diǎn)。同時(shí),在各類調(diào)試器當(dāng)中,也只能給程序設(shè)置4個(gè)硬件斷點(diǎn),這可能會(huì)限制硬件斷點(diǎn)反調(diào)試技術(shù)的效果。2)可能被繞過(guò):一些高級(jí)調(diào)試器可能會(huì)采用特定的技術(shù)手段來(lái)繞過(guò)硬件斷點(diǎn)反調(diào)試機(jī)制。3)影響游戲性能:硬件斷點(diǎn)反調(diào)試技術(shù)可能會(huì)增加游戲的運(yùn)行負(fù)荷,從而影響游戲性能。

        4SEH反調(diào)試案例分析

        通過(guò)對(duì)SEH的介紹可知,各類觸發(fā)的異常,比如對(duì)0地址寫(xiě)數(shù)據(jù)、除數(shù)為0等,都會(huì)導(dǎo)致編譯器報(bào)警。下面是案例測(cè)試效果。

        4.1異常過(guò)濾器

        在C++中實(shí)現(xiàn)一個(gè)異常處理的函數(shù),偽代碼描述如下:

        1)MyExceptionFilter(ExceptionInfo),輸入Excep?tionInfo(指向異常信息的指針),輸出LONG,表示異常處理的結(jié)果。操作步驟:①調(diào)用MessageBox顯示一個(gè)消息框,參數(shù)均為0,表示默認(rèn)設(shè)置。②返回EXCEPTION_CONTINUE_EXECUTION(表示繼續(xù)執(zhí)行觸發(fā)異常的位置)。

        2)主函數(shù)main()的操作步驟:

        ①設(shè)置未處理異常過(guò)濾器為MyExceptionFilter。②執(zhí)行內(nèi)聯(lián)匯編代碼。首先將0移動(dòng)到EAX寄存器,然后嘗試將1存儲(chǔ)到EAX指向的內(nèi)存地址,這將導(dǎo)致訪問(wèn)異常。接著調(diào)用system(\"pause\")暫停程序,等待用戶輸入,最后返回0,表示程序正常結(jié)束。函數(shù)My?ExceptionFilter(ExceptionInfo)主要步驟:①?gòu)棾鰧?duì)話框。②返回EXCEPTION_CONTINUE_EXECUTION值。此處需要先設(shè)置異常過(guò)濾器,然后將1存儲(chǔ)到地址0中。但實(shí)際上,地址0在大多數(shù)操作系統(tǒng)和硬件平臺(tái)上是不被允許訪問(wèn)的,所以會(huì)觸發(fā)異常,即段錯(cuò)誤。程序運(yùn)行的效果如圖2所示。

        通過(guò)給地址0賦值觸發(fā)異常的方法,程序可將異常交給設(shè)置好的異常過(guò)濾器去處理。在異常過(guò)濾器函數(shù)MyExceptionFilter中,返回值設(shè)置的是EXCEPTION_CONTINUE_EXECUTION,這個(gè)返回參數(shù)代表處理完異常后,返回到異常觸發(fā)的位置繼續(xù)執(zhí)行。此處無(wú)論點(diǎn)擊取消還是確定,都會(huì)反復(fù)彈出提示對(duì)話框。異常處理時(shí)可以進(jìn)行彈框操作,還能完成其他操作。

        4.2自定義異常處理器并添加檢測(cè)

        在C++中實(shí)現(xiàn)一個(gè)異常處理的方法如下(用偽代碼描述)。

        1)函數(shù)MyExceptHandler(ExceptionRecord,Estab?lisherFrame,pcontext,DispatcherContext)操作步驟:①顯示消息框“(異常處理代碼執(zhí)行了“”提示”,MB_OK)。②定義局部變量isDebuger=0。③執(zhí)行匯編代碼。首先獲取TEB地址,通過(guò)該TEB+0x30獲取PEB地址,再通過(guò)PEB+2獲取一個(gè)字節(jié)移入寄存器eax,最后將eax內(nèi)的值存入預(yù)定義好的變量isDebugger中。④判斷isDebuger是否不等于0,如果等于0,退出程序;否則給EIP加4個(gè)字節(jié)實(shí)現(xiàn)跳過(guò)異常代碼。

        2)主函數(shù)操作步驟:①獲取MyExceptHandler的地址賦值給局部變量exceptionFunAddr。②通過(guò)內(nèi)聯(lián)匯編代碼,將異常處理函數(shù)加入異常處理鏈。③將NULL賦值給字符指針。④通過(guò)給字符指針賦值觸發(fā)異常。

        在這里通過(guò)內(nèi)聯(lián)匯編[5]的方法,實(shí)現(xiàn)了將自定義好的異常處理函數(shù)加入SEH的異常處理鏈中。程序在執(zhí)行到給空指針賦值時(shí),會(huì)觸發(fā)異常,此時(shí)進(jìn)入異常處理鏈中。當(dāng)?shù)竭_(dá)所定義的異常處理函數(shù)時(shí),在此函數(shù)中通過(guò)fs寄存器獲取到TEB,再通過(guò)TEB+0x30去獲取PEB的位置。PEB+0x2的位置是一個(gè)標(biāo)志位,當(dāng)調(diào)試器對(duì)程序進(jìn)行調(diào)試時(shí),該標(biāo)志位不為0,會(huì)導(dǎo)致程序的退出。其函數(shù)參數(shù)pContext存放的是上下文,即寄存器的值,通過(guò)pContext去訪問(wèn)eip。由于觸發(fā)異常的代碼占4字節(jié),則如果程序處于非調(diào)試器運(yùn)行的情況下,通過(guò)對(duì)eip自加4,可以跳過(guò)異常代碼,從而使得程序正常運(yùn)行。自加的字節(jié)數(shù)并非固定,需要看其觸發(fā)異常匯編代碼的字節(jié)數(shù)。圖3和圖4分別為正常運(yùn)行和調(diào)試器執(zhí)行效果圖。

        根據(jù)觀察不同環(huán)境下程序的執(zhí)行,發(fā)現(xiàn)正常執(zhí)行時(shí)會(huì)執(zhí)行到程序末尾;如果使用VistaDbg調(diào)試程序,會(huì)被檢測(cè)到調(diào)試器,同時(shí)強(qiáng)制結(jié)束程序。

        4.3SEH和硬件斷點(diǎn)反調(diào)試

        MyExceptHandler(ExceptionRecord,EstablisherFrame,pcontext,DispatcherContext)函數(shù)步驟:1)判斷pContext中的DR0不為0,或DR1不為0,或DR2不為0,或DR3不為0。如果條件成立,打印“檢測(cè)到硬件斷點(diǎn)”,并退出進(jìn)程;否則將跳過(guò)當(dāng)前指令,假設(shè)當(dāng)前指令長(zhǎng)度為2字節(jié),并將pContext中的EIP+2,賦值給pContext中的EIP。2)最后返回ExceptionContinueExecution。

        主程序main()操作步驟:1)獲取MyExceptHandler的地址,賦值給局部變量exceptionFunAddr。2)通過(guò)內(nèi)聯(lián)匯編代碼,將異常處理函數(shù)加入異常處理鏈。3)通過(guò)給除數(shù)為零觸發(fā)異常。4)打印程序正常結(jié)束。首先將異常處理函數(shù)的地址通過(guò)內(nèi)聯(lián)匯編加入SEH鏈中,同時(shí)采用除0異常的方式,進(jìn)入異常處理函數(shù)。異常處理函數(shù)發(fā)現(xiàn)使用了參數(shù)pContext時(shí),由于pContext保存上下文,那么其中就包含著4個(gè)硬件斷點(diǎn),即DR0~DR3。通過(guò)判斷這4個(gè)值,可以檢查調(diào)試器是否對(duì)程序下了硬件斷點(diǎn)。同時(shí)通過(guò)eip+異常代碼字節(jié)數(shù),跳過(guò)異常代碼。圖5和圖6分別是正常結(jié)束和對(duì)調(diào)試器下硬件斷點(diǎn)的實(shí)際執(zhí)行效果。

        通過(guò)圖6,可以看到,在調(diào)試器下硬件斷點(diǎn)后,程序是能夠檢測(cè)到的,當(dāng)然這也不是絕對(duì)的。硬件斷點(diǎn)反調(diào)試會(huì)在游戲中應(yīng)用,在通過(guò)非正常手段修改游戲數(shù)據(jù)時(shí),通常會(huì)通過(guò)硬件斷點(diǎn)對(duì)搜索到的數(shù)據(jù)下斷點(diǎn),從而找到實(shí)現(xiàn)功能的函數(shù)和關(guān)鍵語(yǔ)句。聯(lián)網(wǎng)游戲一般通過(guò)send函數(shù)發(fā)包,在send函數(shù)發(fā)包前,通過(guò)自我觸發(fā)異常從而進(jìn)入異常處理函數(shù),在函數(shù)內(nèi)部添加檢測(cè)代碼。正常運(yùn)行程序時(shí)不會(huì)有任何問(wèn)題,一旦對(duì)程序下硬件斷點(diǎn),程序本身就可能會(huì)結(jié)束運(yùn)行此類操作。

        5實(shí)驗(yàn)結(jié)果與分析

        5.1繞過(guò)檢查調(diào)試標(biāo)志

        通過(guò)調(diào)試器修改NtGlobalFlag值是一個(gè)技術(shù)性的操作,通常用于反調(diào)試或調(diào)試特定的應(yīng)用程序。下面是通過(guò)調(diào)試器修改NtGlobalFlag值的步驟:

        第一步:訪問(wèn)NtGlobalFlag。使用調(diào)試器提供的內(nèi)存訪問(wèn)功能,根據(jù)之前找到的PEB地址和NtGlobal?Flag的偏移量來(lái)訪問(wèn)NtGlobalFlag的值。

        第二步:修改值。將NtGlobalFlag的值修改為需要的值,通常將其設(shè)置為0可以繞過(guò)一些反調(diào)試技術(shù)。

        第三步:驗(yàn)證修改。修改后確保檢查NtGlobal?Flag的值是否已成功更改。

        其在x32dbg調(diào)試器中的效果如圖7所示。

        5.2繞過(guò)檢測(cè)調(diào)試器窗口

        在使用調(diào)試器調(diào)試程序時(shí),通過(guò)對(duì)IsDebugger?Present下API斷點(diǎn)定位到函數(shù)位置,此時(shí)通過(guò)修改返回值即可實(shí)現(xiàn)繞過(guò)。

        5.3繞過(guò)SEH反調(diào)試

        SEH反調(diào)試是通過(guò)故意觸發(fā)異常方式實(shí)現(xiàn)。當(dāng)觸發(fā)異常時(shí),會(huì)在異常處理鏈中加入異常處理函數(shù)。其具體解決辦法如下:

        第一步:先讓程序運(yùn)行起來(lái),觀察調(diào)試器觸發(fā)異常的提示。

        第二步:根據(jù)SEH新添加的異常處理例程(如圖8所示,其中010FFBA4為新添加的異常處理例程),通過(guò)其所對(duì)應(yīng)的地址定位棧類數(shù)據(jù)。x32dbg棧內(nèi)數(shù)據(jù)如圖9所示,VistaDBG與x32dbg類似。

        第三步:根據(jù)棧類地址,直接定位帶有反調(diào)試的異常處理函數(shù)內(nèi)部,或者在之前右鍵選擇轉(zhuǎn)到異常處理程序同樣也能實(shí)現(xiàn)。

        第四步:對(duì)帶有反調(diào)試的異常處理函數(shù)進(jìn)行正確的分析與修改,即可繞過(guò)SEH反調(diào)試。

        6結(jié)束語(yǔ)

        本文研究了基于SEH的反調(diào)試技術(shù),通過(guò)案例分析探討了其在Windows環(huán)境下的應(yīng)用。結(jié)果表明,SEH反調(diào)試技術(shù)可以有效阻止一些簡(jiǎn)單的動(dòng)態(tài)調(diào)試分析,但其自身存在局限性,容易被高級(jí)調(diào)試器繞過(guò)。未來(lái)研究方向包括結(jié)合多種反調(diào)試技術(shù),提高程序的抗逆向分析能力以及研究更難以被繞過(guò)的反調(diào)試方法。在實(shí)際開(kāi)發(fā)中,需要根據(jù)具體的應(yīng)用場(chǎng)景和安全需求來(lái)選擇合適的反調(diào)試技術(shù)和策略。此外,反調(diào)試技術(shù)并非萬(wàn)能,應(yīng)與其他安全措施(如代碼混淆、加密等)結(jié)合使用,構(gòu)建更全面的軟件保護(hù)體系。反調(diào)試技術(shù)雖然可以提高程序的抗逆向工程能力,但并不能完全防止惡意用戶或攻擊者對(duì)程序進(jìn)行分析和攻擊。

        參考文獻(xiàn):

        [1]黃釗,黃曙光,鄧兆琨,等.基于SEH的漏洞自動(dòng)檢測(cè)與測(cè)試用例生成[J].計(jì)算機(jī)科學(xué),2019,46(7):133-138.

        [2]沙子涵,舒輝,武成崗,等.基于回調(diào)函數(shù)的控制流深度模糊模型[J].軟件學(xué)報(bào),2022,33(5):1833-1848.

        [3]葛麗麗,帥東昕,謝金言,等.面向軟件供應(yīng)鏈的異常分析方法綜述[J].軟件學(xué)報(bào),2023,34(6):2606-2627.

        [4]江建慧,吳捷程,孫亞.一種基于異??刂屏鞯腻e(cuò)誤程序行為分析方法[J].同濟(jì)大學(xué)學(xué)報(bào)(自然科學(xué)版),2018,46(7):972-981.

        [5]廖舟.區(qū)塊鏈性能測(cè)試及智能合約內(nèi)聯(lián)匯編研究[D].成都:電子科技大學(xué),2022.

        【通聯(lián)編輯:代影】

        国产欧美日韩精品专区| 日韩激情av不卡在线| 人妻精品人妻一区二区三区四区| 成人试看120秒体验区| 欧美激情a∨在线视频播放| 国产在线视欧美亚综合| 亚洲福利网站在线一区不卡| 麻豆亚洲一区| 又粗又硬又黄又爽的免费视频| 国产精品高清视亚洲乱码有限公司| 美女偷拍一区二区三区| 日本a级片免费网站观看| 亚洲av无码av制服另类专区| 国内精品人妻无码久久久影院94| 亚洲中文字幕在线精品2021| 又硬又粗进去好爽免费| 明星性猛交ⅹxxx乱大交| 日韩人妻无码精品久久伊人| 亚洲av一二三四五区在线| 韩国三级在线观看久| 嫩草影院未满十八岁禁止入内| 国产一区二区三区免费精品| 99热这里只有精品国产66| 少妇呻吟一区二区三区| 国产精品久久国产精麻豆99网站| 亚洲欧洲日本综合aⅴ在线| 日本高清色惰www在线视频| 蜜臀av一区二区三区| 国产午夜福利精品一区二区三区| 无码av免费一区二区三区| 亚洲色图综合免费视频| 侵犯了美丽丰满人妻中文字幕| 免费观看18禁无遮挡真人网站| 国产成人国产在线观看入口| 国产av区亚洲av毛片| 亚洲女人的天堂网av| 无码中文字幕免费一区二区三区| 欧美成人中文字幕| 日韩精品视频中文字幕播放| 在线观看的网站| 国产一品道av在线一二三区|