《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 利用動(dòng)態(tài)二進(jìn)制分析方法實(shí)現(xiàn)內(nèi)存自動(dòng)檢測
利用動(dòng)態(tài)二進(jìn)制分析方法實(shí)現(xiàn)內(nèi)存自動(dòng)檢測
2016年微型機(jī)與應(yīng)用第14期
張華強(qiáng)1,喻勝2,王繼剛1,閻波3
(1. 中興通訊成都研究所,四川 成都 610041; 2. 四川精藝防偽科技有限公司,四川 成都 610041; 3. 電子科技大學(xué) 通信與信息工程學(xué)院,四川 成都 611731)
摘要: 內(nèi)存相關(guān)程序錯(cuò)誤的自動(dòng)檢測技術(shù)能夠幫助程序員盡早發(fā)現(xiàn)程序中的內(nèi)存相關(guān)錯(cuò)誤,從而提高軟件開發(fā)效率,增強(qiáng)軟件運(yùn)行的可靠性。探討了采用前沿的動(dòng)態(tài)二進(jìn)制分析技術(shù)檢測軟件中與內(nèi)存相關(guān)錯(cuò)誤,為程序員定位錯(cuò)誤位置、查找錯(cuò)誤、消除錯(cuò)誤原因提供準(zhǔn)確的信息的方法,為致力于內(nèi)存程序錯(cuò)誤檢測技術(shù)的研究人員提供參考。在C/C++軟件中的內(nèi)存錯(cuò)誤檢測實(shí)例驗(yàn)證了本文方法的有效性。
Abstract:
Key words :

  張華強(qiáng)1,喻勝2,王繼剛1,閻波3

  (1. 中興通訊成都研究所,四川 成都 610041; 2. 四川精藝防偽科技有限公司,四川 成都 610041;3. 電子科技大學(xué) 通信與信息工程學(xué)院,四川 成都 611731)

  摘要:內(nèi)存相關(guān)程序錯(cuò)誤的自動(dòng)檢測技術(shù)能夠幫助程序員盡早發(fā)現(xiàn)程序中的內(nèi)存相關(guān)錯(cuò)誤,從而提高軟件開發(fā)效率,增強(qiáng)軟件運(yùn)行的可靠性。探討了采用前沿的動(dòng)態(tài)二進(jìn)制分析技術(shù)檢測軟件中與內(nèi)存相關(guān)錯(cuò)誤,為程序員定位錯(cuò)誤位置、查找錯(cuò)誤、消除錯(cuò)誤原因提供準(zhǔn)確的信息的方法,為致力于內(nèi)存程序錯(cuò)誤檢測技術(shù)的研究人員提供參考。在C/C++軟件中的內(nèi)存錯(cuò)誤檢測實(shí)例驗(yàn)證了本文方法的有效性。

  關(guān)鍵詞內(nèi)存自檢影子內(nèi)存靜態(tài)源碼分析;動(dòng)態(tài)二進(jìn)制分析

0引言

  軟件開發(fā)過程中,與內(nèi)存相關(guān)的程序錯(cuò)誤(BUG)造成程序不能正常工作的情況非常多。通常都采用程序員手工檢查方式消除這類錯(cuò)誤。然而,程序員手工檢查方式既低效又不完備,而且與程序員的業(yè)務(wù)能力相關(guān)。因此,與內(nèi)存相關(guān)的BUG在軟件開發(fā)過程中對項(xiàng)目開發(fā)的影響非常大。

  近年來,內(nèi)存相關(guān)BUG的自動(dòng)檢測技術(shù)有了很大的發(fā)展,可以幫助程序員盡早發(fā)現(xiàn)程序中的內(nèi)存相關(guān)BUG,從而提高軟件開發(fā)效率,增強(qiáng)軟件運(yùn)行的可靠性[12]。這類工具主要檢測軟件中與內(nèi)存相關(guān)BUG,為程序員定位BUG位置、查找BUG、消除BUG原因提供準(zhǔn)確的信息。

  當(dāng)前在內(nèi)存自動(dòng)檢測的所有方法中,根據(jù)分析的時(shí)機(jī)可以分類為靜態(tài)分析和動(dòng)態(tài)分析方法。這一分類方法的分界點(diǎn)為程序執(zhí)行,在程序執(zhí)行前分析稱為靜態(tài)分析,在程序執(zhí)行中分析為動(dòng)態(tài)分析[34]。另一方面,根據(jù)分析操作的對象又可分為源代碼分析和二進(jìn)制目標(biāo)代碼分析[5]。其中,靜態(tài)分析方法更復(fù)雜,由于要分析所有的執(zhí)行路徑而更完備。靜態(tài)分析的最大問題是誤報(bào)太多;而動(dòng)態(tài)分析方法簡單一些,通常只分析單一的執(zhí)行路徑。由于動(dòng)態(tài)分析方法在分析時(shí)各個(gè)變量采用的是程序的真實(shí)運(yùn)行值,因此,檢查精度更高一些,誤報(bào)相對少得多。同時(shí),源代碼分析與二進(jìn)制分析方法也是互補(bǔ)的,源代碼分析依賴于目標(biāo)程序的編程語言而與平臺(處理器體系結(jié)構(gòu)、操作系統(tǒng))獨(dú)立,在分析過程中可以得到程序的高級信息,例如可以定位錯(cuò)誤到具體的源代碼行。二進(jìn)制分析方法剛好相反,是依賴于目標(biāo)程序的平臺而獨(dú)立于編程語言,在分析過程中可以操縱程序的低級信息,例如控制寄存器的分配等。二進(jìn)制分析的最大好處是分析第三方庫時(shí),可以不需要第三方庫的源代碼就能分析,而源代碼分析對此就無能為力了。

  本文重點(diǎn)討論通過動(dòng)態(tài)二進(jìn)制分析技術(shù)實(shí)現(xiàn)內(nèi)存自動(dòng)檢測的相關(guān)技術(shù)和具體實(shí)現(xiàn),研究了如何利用動(dòng)態(tài)插入內(nèi)存檢測技術(shù)的二進(jìn)制級別的內(nèi)存自動(dòng)檢測方法,使程序員能夠更方便地實(shí)現(xiàn)內(nèi)存相關(guān)BUG的自動(dòng)檢測實(shí)現(xiàn)。

1主要內(nèi)存相關(guān)軟件錯(cuò)誤

  本文討論的軟件開發(fā)過程中主要的內(nèi)存相關(guān)的軟件錯(cuò)誤包括以下9種:

  (1)空指針:程序訪問變量的內(nèi)存地址為0。

  (2)內(nèi)存釋放:包括釋放已釋放存儲(Free Freed Memory, FFM)、釋放未分配存儲(Freeing unallocated memory, FUM)、釋放地址不匹配(Freeing Mismatched Memory,F(xiàn)MM)、已釋放存儲區(qū)訪問(Freed Memory Access, FMA),指程序讀、寫的存儲空間已在以前釋放了,該問題也稱為指針懸掛(dangling pointer)或者野指針。

  (3)越界訪問:如果指向某個(gè)存儲區(qū)的指針在進(jìn)行指針?biāo)阈g(shù)、類型轉(zhuǎn)換、賦值操作時(shí),該指針指向另外的存儲區(qū),造成操作的操作數(shù)發(fā)生錯(cuò)誤。

  (4)未初始化存儲:沒有進(jìn)行初始化操作,其他的內(nèi)容是隨機(jī)的。因此,讀未初始化存儲區(qū)中的數(shù)據(jù)是無意義的,常常引起程序的異常行為。

  (5)內(nèi)存泄漏:如果程序不停地向系統(tǒng)申請存儲空間,最終將耗盡進(jìn)程的虛擬地址空間,內(nèi)存泄漏通常都是分配了動(dòng)態(tài)存儲區(qū),而程序沒有釋放所致。

  (6)存儲區(qū)重疊操作:兩個(gè)不同的指針指向的內(nèi)存區(qū)出現(xiàn)了部分或者全部重疊,在多線程訪問操作時(shí)會出現(xiàn)數(shù)據(jù)不一致的錯(cuò)誤。

  (7)系統(tǒng)調(diào)用參數(shù)錯(cuò)誤:操作系統(tǒng)內(nèi)部需要做參數(shù)檢測,防止應(yīng)用程序提供錯(cuò)誤的參數(shù),從而引起系統(tǒng)的崩潰。

  (8)存儲操作匹配:在C++中,如果用malloc、calloc、realloc、valloc和memalign函數(shù)進(jìn)行動(dòng)態(tài)存儲分配,則必須用free函數(shù)釋放分配的存儲。如果存儲分配用new[],則必須用delete[]釋放,分配用函數(shù)new,釋放操作必須用delete函數(shù)。這些操作在Linux下可以混用,但是在其他一些操作系統(tǒng)下可能出現(xiàn)問題,例如Windows與Solaris。

  (9)廢代碼:完全不能執(zhí)行到代碼路徑上的代碼。

  針對以上常見內(nèi)存錯(cuò)誤,評價(jià)一種內(nèi)存自動(dòng)檢測技術(shù)的檢測目標(biāo)指標(biāo)主要包括:

  (1)誤報(bào)(false positives):在無錯(cuò)的情況下分析過程報(bào)錯(cuò),這是靜態(tài)分析的最大問題。

  (2)漏報(bào)(false negatives):發(fā)生錯(cuò)誤沒報(bào),這是所有分析過程的關(guān)鍵問題,怎樣找出程序中的所有問題是分析過程的目標(biāo)。

  (3)路徑敏感(pathsenitive):程序中的某些變量在一定值的范圍內(nèi)有些執(zhí)行路徑不可能進(jìn)入,在分析過程中,排除這些不可能執(zhí)行路徑的分析稱為路徑敏感分析,這是一種分析優(yōu)化技術(shù),減少分析過程中的誤報(bào)。

  (4)上下文敏感(context-senitive):某個(gè)函數(shù)中的變量值和其調(diào)用者相關(guān),在分析時(shí)能綜合考慮這些因素稱為上下文敏感。

  (5)過程間分析(Interprocedual):幾個(gè)函數(shù)都操作同一變量,分析過程能處理這種情況的,稱為過程間分析。與之相對應(yīng)的過程內(nèi)分析(Intraprocedual)只在單個(gè)函數(shù)內(nèi)分析變量的訪問。

2動(dòng)態(tài)二進(jìn)制分析方法

  內(nèi)存檢測的動(dòng)態(tài)分析方法是在源代碼中插入分析代碼、狀態(tài)檢測代碼,在運(yùn)行時(shí),這些代碼檢測存儲區(qū)的狀態(tài),并且分析程序的行為,從而發(fā)現(xiàn)程序中的BUG。目前,內(nèi)存動(dòng)態(tài)分析技術(shù)的實(shí)現(xiàn)主要是在動(dòng)態(tài)堆管理庫中添加檢測代碼來實(shí)現(xiàn)。庫替換可以在編譯時(shí)替換,也可以在目標(biāo)程序動(dòng)態(tài)鏈接時(shí)替換,還有其他一些特殊的檢測代碼插入方法。動(dòng)態(tài)二進(jìn)制分析和動(dòng)態(tài)源代碼分析的主要區(qū)別在于,動(dòng)態(tài)二進(jìn)制分析是在指令級插入檢測代碼,動(dòng)態(tài)源代碼分析是在庫級、函數(shù)級插入代碼。

  本文動(dòng)態(tài)二進(jìn)制分析采用的主要技術(shù)如下。

  2.1影子內(nèi)存

  在目標(biāo)代碼的指令中動(dòng)態(tài)插入檢測代碼,檢測代碼跟蹤存儲區(qū)中每個(gè)字節(jié)(可以有字級、字節(jié)級)的可尋址性或存儲區(qū)的每個(gè)字節(jié)(可以有字級、字節(jié)級、位級)或寄存器的有效性,這些存儲區(qū)的存儲狀態(tài)信息保存在影子存儲中。當(dāng)目標(biāo)程序有數(shù)據(jù)移動(dòng)、數(shù)據(jù)操縱等操作時(shí),檢測代碼檢查影子存儲中該字節(jié)的狀態(tài),從而檢測存儲相關(guān)問題。

  影子內(nèi)存具體有多種實(shí)現(xiàn)方式,下面是兩種最簡單的方式。

  (1)將用戶態(tài)的地址空間分為2個(gè)部分,一部分程序使用,另一部分作為影子內(nèi)存。存儲空間的開銷大,地址映射關(guān)系簡單,查找效率高。

  (2)采用動(dòng)態(tài)分配的存儲作為影子內(nèi)存,未分配存儲空間就不需要影子內(nèi)存從而優(yōu)化對存儲空間的需求。

  影子內(nèi)存的狀態(tài)位表示對應(yīng)存儲的使用狀態(tài)。

  (1)A位:每一個(gè)內(nèi)存字節(jié)都有一個(gè)A 位(Addressability),用來表示客戶程序?qū)ζ湓L問的合法性。A=0 表示不可尋址的字節(jié), A=1表示可以尋址的字節(jié),分配存儲空間時(shí)置位,釋放時(shí)清0;可以檢測堆緩沖溢出、指針越界等。

  (2)V位:寄存器或者內(nèi)存的每一個(gè)字節(jié)的每個(gè)位(bit)都有一個(gè)V位(Validity),用來標(biāo)明該位的值是已經(jīng)定義了的。V=0 表示已經(jīng)定義位,V=1表示未定義位。可以檢測未初始化存儲錯(cuò)。

  圖1是本文實(shí)現(xiàn)的檢測工具影子內(nèi)存的具體實(shí)現(xiàn)情況。

 

001.jpg

  圖1中,采用二級表實(shí)現(xiàn)影子內(nèi)存管理。表目PM[1]和PM[2]對應(yīng)已被寫入的64 KB內(nèi)存區(qū),這些已被寫入的內(nèi)存區(qū)有自己的影子內(nèi)存。剩余的PM條目仍指向NoAccess DSM區(qū)。

  2.2狀態(tài)管理

  在采用影子內(nèi)存的檢測技術(shù)中,通常采用圖2所示狀態(tài)圖管理存儲區(qū)的狀態(tài)。

  圖2中,系統(tǒng)內(nèi)存中的每個(gè)字節(jié)(如果采用位級的影子內(nèi)存,則是每個(gè)位)存在4個(gè)狀態(tài)。

  (1)程序啟動(dòng)時(shí),所有可用存儲區(qū)都是unallocated和uninitialized,即在影子內(nèi)存中對應(yīng)存儲區(qū)的A位和V位都置為無效,本文將此類存儲區(qū)記為為紅色狀態(tài),訪問紅色存儲區(qū)發(fā)出未分配存儲訪問錯(cuò)。

  (2)存儲區(qū)分配函數(shù)作用于紅色存儲區(qū)、藍(lán)色存儲區(qū)時(shí),存儲區(qū)進(jìn)入圖2“Allocated But UnInitialized”狀態(tài),即黃色狀態(tài)存儲區(qū)。訪問黃色存儲區(qū)發(fā)出未初始化存儲訪問錯(cuò)。

  (3)當(dāng)釋放函數(shù)作用于黃色存儲區(qū)時(shí),存儲區(qū)回到紅色存儲區(qū)狀態(tài)。

  (4)在黃色存儲區(qū)進(jìn)行寫操作時(shí),存儲區(qū)進(jìn)入圖2的“Allocated And Initialized”狀態(tài),即綠色存儲區(qū)狀態(tài),訪問該存儲區(qū)是合法的。

  (5)當(dāng)釋放函數(shù)作用于綠色存儲區(qū)時(shí),存儲區(qū)進(jìn)入圖2的“Freed But Still Uninitialized”狀態(tài),即藍(lán)色存儲區(qū)狀態(tài),訪問藍(lán)色存儲區(qū)狀態(tài)發(fā)出為分配存儲訪問錯(cuò)。

  2.3類型檢測

  類型檢測方法解釋編譯后的二進(jìn)制文件,跟蹤所有存儲器變量和寄存器的類型值,當(dāng)存儲訪問發(fā)生類型不匹配錯(cuò)誤時(shí),發(fā)出警告信息。本文類型檢測工具可以檢測存儲訪問錯(cuò)和類型錯(cuò)等兩種錯(cuò)誤方式。存儲訪問錯(cuò)指存儲訪問操作訪問無效的存儲區(qū)(無效的存儲區(qū)包括讀寫未分配存儲區(qū),訪問未初始化存儲區(qū)等)。類型錯(cuò)指存儲訪問操作的操作數(shù)和操作本身不一致(例如:指針變量和實(shí)數(shù)相加、調(diào)用函數(shù)的參數(shù)數(shù)量或類型錯(cuò)誤、將一個(gè)整型變量作為一個(gè)指針等)。

  3利用動(dòng)態(tài)二進(jìn)制方法實(shí)現(xiàn)自動(dòng)內(nèi)存檢測

  Valgrind是一個(gè)動(dòng)態(tài)二進(jìn)制指令插入(Dynamic Binary Instrumentation,DBI)框架,能夠?qū)崿F(xiàn)運(yùn)行時(shí)(動(dòng)態(tài))在目標(biāo)程序中添加檢測代碼[6]。因此,可以在動(dòng)態(tài)二進(jìn)制指令插入框架上建立動(dòng)態(tài)二進(jìn)制分析器,在目標(biāo)程序運(yùn)行時(shí)從機(jī)器指令級上分析目標(biāo)程序。

  Valgrind采用模塊化的設(shè)計(jì)方式,系統(tǒng)體系結(jié)構(gòu)基本上可以看成由“Valgrind核心+工具插件”組成,核心提供一個(gè)動(dòng)態(tài)二進(jìn)制指令插入的基礎(chǔ)設(shè)施,而各個(gè)工具插件提供具體功能的實(shí)現(xiàn)。Valgrind核心采用即時(shí)編譯技術(shù)(JustInTime,JIT)(二進(jìn)制變換)的虛擬機(jī)技術(shù),目標(biāo)程序不直接從實(shí)際處理器上運(yùn)行,而是運(yùn)行在Valgrind的JIT虛擬機(jī)上。

  以此工具為基礎(chǔ),本文采用影子存儲保存存儲區(qū)的分配狀態(tài)和存儲的類型信息,在目標(biāo)程序運(yùn)行時(shí)檢查這些信息,以檢測它支持的存儲相關(guān)錯(cuò)誤。實(shí)現(xiàn)的內(nèi)存自動(dòng)檢測實(shí)驗(yàn)結(jié)果如圖3所示。

  

002.jpg

  圖3的例程中,先向union寫入一個(gè)指針值,然后從中讀一個(gè)整型值。當(dāng)程序在x.p上存儲&i的值時(shí),類型檢測器標(biāo)識union中存儲的是指針值(union的類型信息由機(jī)器指令lea指令(計(jì)算&i)中推導(dǎo)出來)。當(dāng)程序在取x.k的值進(jìn)行乘法運(yùn)算時(shí),類型檢測器檢測出操作類型不匹配,從而發(fā)出警告消息。該例子同時(shí)也表明,在不需要編譯器和調(diào)試器支持的情況下,能進(jìn)行類型檢查。

003.jpg

  圖4內(nèi)存自動(dòng)檢測的數(shù)組越界錯(cuò)誤檢測實(shí)驗(yàn)又如,在圖4所示的程序代碼中,存在數(shù)組越界錯(cuò)誤,采用傳統(tǒng)內(nèi)存分析方法不容易檢測出來。y.a[10]賦值操作語句中數(shù)組已經(jīng)越界,通過本文類型檢測可以發(fā)現(xiàn)該類越界訪問錯(cuò)誤。

4結(jié)論

  靜態(tài)程序分析誤報(bào)率、漏報(bào)率非常高,在當(dāng)前的所有自動(dòng)檢測方法中,實(shí)用性不強(qiáng),目前還沒有靜態(tài)分析工具能保證程序的健壯性,通常都作為一種調(diào)試手段在使用。動(dòng)態(tài)檢測方法可以在程序運(yùn)行時(shí)檢測,因此,可以在發(fā)布的產(chǎn)品中附帶動(dòng)態(tài)檢測工具,當(dāng)在軟件實(shí)現(xiàn)運(yùn)行過程中出現(xiàn)問題時(shí),方便開發(fā)人員快速定位BUG的位置,從而消除BUG。因此,動(dòng)態(tài)檢測方法可以有效地降低程序BUG所造成的損失。本文在動(dòng)態(tài)二進(jìn)制內(nèi)存自動(dòng)檢測框架的基礎(chǔ)上,通過狀態(tài)管理和類型檢測等方法實(shí)現(xiàn)了常見軟件內(nèi)存錯(cuò)誤的自動(dòng)檢測。研究結(jié)果表明,該自動(dòng)檢測方法能夠在不需要編譯器和調(diào)試器支持的情況下實(shí)現(xiàn)高效的內(nèi)存錯(cuò)誤自動(dòng)檢測,為更好地研究自動(dòng)內(nèi)存管理提供了幫助。

參考文獻(xiàn)

  [1] 肖如良. 虛擬計(jì)算環(huán)境的運(yùn)行時(shí)資源監(jiān)控與內(nèi)存泄漏檢測技術(shù)[M]. 北京:電子工業(yè)出版社,2015.

  [2] JONES R, HOSKINGntony. 垃圾回收算法手冊:自動(dòng)內(nèi)存管理的藝術(shù)[M]. 王雅光,譯.北京:機(jī)械工業(yè)出版社,2016.

  [3] 楊宇,張健. 程序靜態(tài)分析技術(shù)與工具[J]. 計(jì)算機(jī)科學(xué), 2004,31(2): 171174.

  [4] 吳民,涂奉生. 內(nèi)存泄漏的動(dòng)態(tài)跟蹤分析[J]. 計(jì)算機(jī)工程與應(yīng)用, 2005,45(14): 1820.

  [5] 夏超,邱衛(wèi)東.二進(jìn)制環(huán)境下的緩沖區(qū)溢出漏洞動(dòng)態(tài)檢測[J]. 計(jì)算機(jī)工程, 2008,34(22): 187191.

  [6] 潘竹生,童維勤, 周正. 基于Valgrind的嵌入式應(yīng)用程序調(diào)試技術(shù)[J].微計(jì)算機(jī)信息, 2009, 25(22):5860.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一区二区国产日产| 久久成人av少妇免费| 日韩午夜激情av| 国产一区三区三区| 欧美特黄一级| 欧美成人一区二区三区| 欧美一区二区三区久久精品茉莉花| 亚洲清纯自拍| 欧美影院成人| 亚洲香蕉视频| 日韩一区二区免费高清| 亚洲第一成人在线| 韩国精品一区二区三区| 国产精品免费在线| 欧美视频在线观看一区二区| 免费看亚洲片| 久久久久久亚洲精品中文字幕| 亚洲免费视频一区二区| 一区二区电影免费观看| 亚洲精品日本| 亚洲国产精品v| 久久精品首页| 欧美一区二区三区四区高清| 这里只有精品电影| 夜久久久久久| 在线视频欧美日韩精品| 一本一本久久| 99视频日韩| 亚洲国产欧美久久| 亚洲高清电影| 亚洲国产欧美在线人成| 国产精品综合| 国产欧美一区二区精品仙草咪| 国产精品播放| 国产精品久久久久9999高清| 欧美三区美女| 欧美视频专区一二在线观看| 欧美日韩精品综合在线| 欧美日韩福利在线观看| 欧美精品一区二区蜜臀亚洲| 欧美精品999| 欧美日韩在线不卡一区| 国产日本欧美一区二区三区在线 | 欧美日韩中文字幕综合视频 | 亚洲国产成人久久综合| 亚洲日本aⅴ片在线观看香蕉| 99精品欧美一区二区三区综合在线| 亚洲一级片在线观看| 欧美与欧洲交xxxx免费观看 | 一本久久知道综合久久| 亚洲欧美中日韩| 久久一区二区视频| 欧美日本不卡高清| 国产片一区二区| 亚洲黄色天堂| 亚洲影视在线播放| 亚洲国产精品免费| 亚洲午夜精品久久久久久app| 欧美一区三区三区高中清蜜桃| 久久一区视频| 欧美亚洲成人网| 在线观看日韩欧美| 亚洲一区二区三区免费在线观看| 亚洲夫妻自拍| 亚洲一二三区精品| 久久久久一区| 国产精品www994| 亚洲国产欧美在线| 欧美一区二视频| 亚洲天堂男人| 欧美成人视屏| 国产偷久久久精品专区| 亚洲精品久久久久久久久| 性欧美超级视频| 亚洲午夜极品| 欧美成人中文| 国产亚洲一区精品| 亚洲婷婷在线| 9人人澡人人爽人人精品| 久久高清福利视频| 欧美日韩精品免费观看视一区二区 | 夜夜嗨av一区二区三区中文字幕 | 欧美一区二区三区四区在线观看| 亚洲电影在线播放| 一区二区欧美在线观看| 性欧美在线看片a免费观看| 欧美激情一二三区| 国产亚洲一区在线| 亚洲一区二区三区四区五区午夜| 亚洲欧洲综合另类在线| 久久久久久久91| 国产精品国产三级国产普通话99| 在线成人亚洲| 午夜精品一区二区三区电影天堂 | 久久精品国产一区二区三区免费看| 欧美激情久久久| 国产自产精品| 亚洲在线中文字幕| 在线一区二区三区四区五区| 麻豆精品在线视频| 国产农村妇女精品| 99在线精品视频在线观看| 亚洲国产综合视频在线观看| 午夜欧美精品| 国产精品久久午夜| aa级大片欧美| 日韩亚洲欧美在线观看| 麻豆国产va免费精品高清在线| 国产女主播在线一区二区| 一区二区三区视频在线| 中文精品一区二区三区| 欧美激情第1页| 亚洲欧洲一区二区三区久久| 亚洲人成绝费网站色www| 久久免费视频观看| 国产欧美一区二区精品仙草咪| 亚洲午夜未删减在线观看| 亚洲一区日本| 欧美午夜剧场| 一级成人国产| 亚洲一区二区三区乱码aⅴ| 欧美日韩亚洲视频一区| 亚洲精品视频在线观看网站| 亚洲精品欧美精品| 欧美丰满高潮xxxx喷水动漫| 亚洲第一网站| 亚洲精品小视频| 欧美理论电影在线观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲一区国产一区| 欧美天堂亚洲电影院在线播放| 一区二区精品在线观看| 亚洲一区二区三区精品在线| 欧美视频在线观看视频极品| 在线亚洲欧美| 午夜精品理论片| 国产欧亚日韩视频| 亚洲成在人线av| 欧美韩日精品| av成人毛片| 欧美一区二区在线免费观看| 国产亚洲一本大道中文在线| 久久精品欧洲| 欧美激情导航| 亚洲图片在线观看| 久久久噜噜噜久久中文字免| 精东粉嫩av免费一区二区三区| 亚洲激情欧美| 欧美日韩在线一二三| 亚洲一区欧美一区| 久久偷看各类wc女厕嘘嘘偷窃| 雨宫琴音一区二区在线| 一区二区精品| 国产精品久久久久久久久搜平片| 亚洲欧美日韩精品| 美女视频黄 久久| 99精品欧美一区二区蜜桃免费| 欧美亚洲视频| 在线观看日韩av| 亚洲特级毛片| 国产亚洲精品美女| 亚洲伦理在线免费看| 国产精品久久久久久久7电影| 欧美一区亚洲二区| 欧美日韩成人综合在线一区二区| 亚洲永久免费av| 模特精品在线| 宅男噜噜噜66一区二区 | 激情久久中文字幕| 一区二区三区视频在线| 国产麻豆成人精品| 亚洲日本成人网| 国产精品久久7| 亚洲国产色一区| 国产精品久久久久久久久婷婷| 久久黄金**| 欧美视频福利| 久久精品国产一区二区电影| 欧美日韩国产丝袜另类| 午夜精品三级视频福利| 欧美欧美全黄| 久久精品成人| 国产精品大全| 亚洲精品系列| 国产亚洲精品自拍| 亚洲一区亚洲| 亚洲高清自拍| 欧美在线欧美在线| 亚洲精品中文在线| 久久综合网hezyo| 亚洲影院污污.| 欧美日韩国产综合新一区| 久久精品99国产精品酒店日本| 欧美日韩中文在线| 欧美在线观看www| 国产精品jizz在线观看美国 | 国产一区二区三区四区hd| 在线视频亚洲一区| 一区精品在线播放| 欧美一级日韩一级|