999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于模式切換的ARM匯編代碼混淆算法

2021-09-26 10:43:28樂德廣龔聲蓉
計算機工程與應用 2021年18期
關鍵詞:指令程序

樂德廣,趙 杰,龔聲蓉

1.常熟理工學院 計算機科學與工程學院,江蘇 常熟215500

2.蘇州同程網絡科技股份有限公司,江蘇 蘇州215123

ARM架構的處理器以其高速度、低功耗等許多優(yōu)異的特性而在智能手機中得到非常廣泛的應用。目前大部分的安卓智能手機都采用ARM處理器。與此同時,ARM應用程序的數量每年呈現指數式的增長。2019年,全球手機APP下載量高達2040億次[1],在休閑、娛樂、社交、辦公、投資、購物、生活和醫(yī)療等方面都有手機APP的身影,它們不僅影響著人們的日常生活,而且推動著經濟發(fā)展。

在各類ARM應用呈井噴式增長,為用戶帶來便利和促進經濟增長的同時,針對ARM架構的程序攻擊日益突出,如ARM指令形式化變換逆向工程、靜態(tài)分析和動態(tài)調試等[2],帶來了巨大的隱私信息泄露的隱患,也造成各種惡意軟件和盜版應用泛濫。因此,如何保護基于ARM處理器的應用程序,成為軟件安全研究的重點。

代碼混淆是一種保留語義的程序變換技術,其目的是使程序邏輯變得難以理解,增加逆向工程的難度,從而有效保護軟件[3]。文獻[4]在分析安卓軟件遭受惡意攻擊的基礎上,提出一種基于Java的安卓應用代碼混淆技術,旨在提高安卓應用代碼的隱蔽性,進而使安卓應用得到更有效的保護。但是該技術工作在Java層,很容易被逆向反編譯。文獻[5]通過研究市場上流行的軟件混淆技術,開發(fā)了一種主要針對Smali代碼的混淆算法,研究其控制流混淆,變量混淆和虛假代碼的注入,通過分析反編譯工具的弱點,其混淆之后的代碼可以免受反編譯工具的靜態(tài)分析。文獻[6]通過對原DEX文件進行重構和加密,將其關鍵Java函數屬性改為Native(C/C++屬性),并通過Hook技術和反射機制隱式恢復并執(zhí)行原Java函數,可以有效抵御靜態(tài)分析攻擊,獲取高強度的保護效果。

以上ARM程序混淆方法都是從高級語言(如Java或C/C++)層面,或者中間語言(如Smali)層面對程序進行混淆,沒有從底層匯編指令層面進行考慮,并充分利用ARM指令集的工作模式及寄存器間接尋址等特性對程序進行混淆。而目前針對底層匯編ARM指令的混淆,尚未有適當理論方法來指導生成多模式切換的指令混淆以準確測試ARM應用安全充分性、達到更全面的代碼指令安全。

為此,本文研究如何從混淆底層ARM匯編指令方式的角度,提高ARM程序安全性,并提出一種基于模式切換的ARM匯編代碼混淆算法。該算法通過ARM處理器的多指令集工作模式建立新的模式切換模型,描述ARM指令切換行為的全貌和邏輯規(guī)律,提高指令混淆中考慮模式切換的全面性,建立指令混淆的新型指令模式切換混淆方式,并提出對應的指令切換混淆算法。此外,在對ARM指令集中數據處理和切換指令進行分析的同時,結合ARM體系結構寄存器尋址特征,提出基于寄存器間接尋址跳轉的ARM寄存器混淆和虛假指令混淆的優(yōu)化方法,使得ARM應用中關鍵代碼的安全性在ARM平臺上進一步的提升。

1 ARM匯編指令安全性分析

ARM是一種低功耗、高性能的RISC處理器架構。ARM體系結構采用定長指令,指令格式和尋址方式也相對簡單,大大降低了體系結構的復雜性。為兼容數據總線寬度為16位的應用系統(tǒng),ARM體系結構除了支持執(zhí)行效率很高的32位ARM指令集以外,同時支持16位的Thumb指令集[7]。與ARM指令集相比較,Thumb指令集中的數據處理指令的操作數和指令地址仍然是32位,但Thumb指令集為實現16位的指令長度,并舍棄了ARM指令集的一些特性,如ARM指令大多數都是有條件執(zhí)行的,而Thumb指令則是無條件執(zhí)行。此外,大多數的Thumb數據處理指令的目的寄存器與其中一個源寄存器相同。因此,與等價的32位指令相比,Thumb指令集在保留32指令優(yōu)勢的同時,大大地節(jié)省了系統(tǒng)的存儲空間。

在ARM應用程序的編寫過程中,只要遵循一定調用的規(guī)則,Thumb子程序和ARM子程序可以互相調用[8]。當處理器在執(zhí)行ARM程序段時,稱ARM處理器處于ARM工作模式,當處理器在執(zhí)行Thumb程序段時,稱ARM處理器處于Thumb工作模式。和X86程序一樣,ARM程序面臨逆向攻擊。在程序逆向分析中,一般以反匯編技術為基礎通過分析二進制文件,利用線性掃描或遞歸遍歷算法反匯編整個可執(zhí)行程序,將機器碼翻譯成匯編代碼[9],并通過分析和處理匯編指令發(fā)現其內部的行為和特征。文獻[10]提出一種結合具體路徑執(zhí)行和遞歸遍歷算法的反匯編技術,用于更好地針對自修改和重疊指令的逆向工程分析。文獻[11]根據所有可能的基本塊可以通過推測恢復的原理,提出一種二進制代碼的推測性反匯編技術。該技術結合重疊沖突分析和控制流圖沖突分析提煉基本塊來確定匯編指令。文獻[12]利用演繹驗證和有界模型檢測,提出一種基于反向有界動態(tài)符號執(zhí)行的反匯編方法實現對混淆代碼的動態(tài)精確反匯編分析。文獻[13]通過增加成功的反匯編樣本,并基于SVM進行對它們進行訓練和分類,然后結合線性掃描算法建立一種輕量反匯編方法,有效反匯編出代碼混淆后的指令操作碼。文獻[14]通過對程序運行時的能耗側信道泄露監(jiān)測和結合機器學習算法確定其匯編指令,并提出一種側信道反匯編器用于固件逆向工程。文獻[15]通過模擬二進制程序分析中的不確定性提出一種概率反匯編技術。該技術基于融合一組能到達地址的不確定特征計算代碼空間中每個地址的概率,用于指示該地址表示真正指令的可能性,并進行相應的反匯編,從而實現對反匯編代碼的求精,即在避免漏報的同時,具有很低的誤報率。

因此,通過反匯編對ARM程序進行逆向分析與利用,引起ARM程序的破解和盜版、隱私數據泄露和知識產權竊取等安全問題。

2 ARM匯編代碼混淆算法

在ARM反匯編中,因為ARM和Thumb指令集切換的不明晰而導致切換信息丟失并且造成反匯編出現錯誤。因此,在下面提出的ARM匯編代碼混淆算法中,結合Thumb模式與ARM模式,首先通過指令等價變換將Thumb模式中的指令序列變換成ARM模式下的指令序列。其次,利用切換指令在Thumb模式和ARM模式之間進行切換混淆,使程序的控制流復雜化,并利用寄存器間接尋址混淆進一步隱藏切換信息,導致在反匯編中漏解析本來可達的分支流程或者錯解析本來不可達的分支流程。此外,通過虛假指令對反匯編工具的混淆作用,在程序中構造虛假分支,來迷惑反匯編器,達到代碼保護的目的。算法總體架構如圖1所示。

圖1 算法總體架構Fig.1 Architecture of algorithm

在圖1中,首先預處理待保護的Thumb指令,定位關鍵指令序列ST,然后對關鍵指令序列進行等價變形SA指令序列。接著,在原始Thumb模式中添加新ARM模式,并將變形處理后新生成的SA指令序列保存在新的ARM模式中。然后,利用切換指令對程序指令進行模式切換,當程序執(zhí)行到關鍵指令序列時,會切換至ARM模式中執(zhí)行變形處理后的指令序列,并利用MT寄存器混淆保護模式切換地址。同時,在模式切換過程中加入QT虛假指令序列填充ST指令序列空間。根據圖1算法架構,基于模式切換的ARM匯編代碼混淆算法描述如下:

步驟1在Thumb指令序列中選定一個分割位置P,設定分割位置后的待移動指令序列為ST,ST的結束位置為E。

步驟2在分割位置P處,隨機選定可用的寄存器作為間接跳轉尋址的寄存器。

步驟3將Thumb指令序列ST轉換為等價的ARM指令序列SA:AR M(SA)=Thumb(ST)。

步驟4在ARM指令序列中選取一個新位置P1,將SA放在位置P1處。

步驟5在Thumb指令集中構造寄存器混淆指令序列MT,使得步驟2中選定的寄存器的計算結果為新的跳轉位置P1。

步驟6在Thumb指令集中構造切換指令,使MT之后的控制流跳轉到P1處,并將指令集切換至ARM模式。

步驟7如果len(ST)-len(MT+1)>0,那么在切換指令之后構造虛假指令序列QT,且len(QT)=len(ST)-len(MT+1)。

步驟8在SA的最后構造指令并使用切換指令跳轉至位置E,并將指令集切換至Thumb模式。

算法中的模式切換使用ARM匯編指令集中的模式切換指令來進行構造。其中,根據變形模板函數ARM()和變形參數等對指令序列ST進行變形,生成變形指令序列SA。而SA處的地址是寄存器間接選址,且寄存器值是通過間接計算指令序列MT混淆產生。在進行反匯編時,反匯編器無法直接判定寄存器值,所以不能確定模式切換路徑SA的執(zhí)行入口信息,造成遞歸掃描反匯編結果出錯。另外,通過在切換指令后插入不可執(zhí)行虛假指令序列QT構建另一條分支路徑。因為添加的切換指令是合法的,且不可執(zhí)行虛假指令序列QT處的地址也是合法的目的地址,所以QT處的虛假指令序列一定會被反匯編器反匯編,從而將虛假指令QT與其后的原指令結合在一起,引起線性掃描反匯編出錯。

根據上述算法描述,ARM匯編代碼混淆部分主要包含三方面研究內容:(1)模式切換混淆,主要通過模式切換指令和設計指令變形的模板函數ARM(),利用模板函數對原始指令進行等價變形和模式切換。(2)寄存器混淆,通過寄存器隨機分配及間接選址計算,隱藏模式切換指令的真實地址。(3)虛假指令混淆,提供了在算法中利用虛假指令序列來實現對于線性掃描反匯編的重同步的延遲。下面重點介紹這些關鍵技術。

2.1 模式切換混淆

在ARM程序中有兩種方法可以實現程序控制流程的跳轉,一種是直接向PC寄存器賦值實現跳轉,另一種是使用跳轉指令直接跳轉。其中,BX(Branch eXchange)是帶模式切換的跳轉指令,跳轉到指定的目標地址執(zhí)行程序。ARM架構支持在一個上下文中運行ARM和Thumb兩種指令集,它們可通過BX指令進行切換。BX指令格式如下所示:

其中,BX需要一個目標地址寄存器作為第一操作數:BX寄存器(Rx)。如果目標地址寄存器的[0]位為1,則跳轉時將當前程序狀態(tài)寄存器(Current Program Status Register,CPSR)中的標志T置位,即把目標地址的代碼解釋為Thumb指令。如果目標地址寄存器的[0]位為0,則跳轉時將CPSR中的標志T復位,即把目標地址的代碼解釋為ARM指令。因此,切換依據如下所示:

在以上代碼中,如果需要跳轉的地址模2余1則表示跳轉到Thumb模式,否則就是ARM模式。如果原始程序是Thumb模式,那么就可以利用這個特性來混淆ARM匯編指令。例如,混淆前關鍵代碼如下所示:

在以上混淆代碼中,同時存在Thumb和ARM兩種模式的指令序列時,反匯編工具在進行反匯編時需要準確地識別出不同位置對應的指令序列。但是在多模式指令混淆中,通過2次BX實現了跨指令集的來回切換,再配合其他等價變形指令[0x233C~0x2360],所以反匯編工具在執(zhí)行自動分析時往往容易出錯,包括無法識別和識別成錯誤模式。

2.2 寄存器混淆

為了進一步加強復雜度,需要對Rx寄存器混淆,從靜態(tài)和動態(tài)兩方面增加逆向分析的難度。寄存器混淆的核心思想是將寄存器隨機分配和間接化計算,同時保持程序指令及其行為相同,即把立即數賦值變換成間接賦值,并把一個指令的輸出值重新定位到一個任意的內部寄存器,導致代碼中每次出現的指令版本都是不相同,大大增加動靜態(tài)分析難度。例如:

在代碼片段[0x2236~0x2242]中,通過“ADD R6,R6,R5”計算最終的跳轉地址,它的結果依賴寄存器R5的值,而R5又是從內存地址R4中讀取的,即需要再進一步向前分析向該內存地址存儲寫數據的位置。這樣就實現了R5的一個間接賦值,從而使得其更難看出0x2242處BX R6實際的跳轉位置。

2.3 虛假指令混淆

由于虛假指令對反匯編工具的混淆作用,在本算法中利用虛假指令序列來實現對線性掃描反匯編的重同步的延遲。虛假指令本身對程序執(zhí)行并沒有影響,因此虛假指令序列的主體部分還需要無效指令和隨機數據的填充。為有效利用這部分填充的隨機數據,在生成虛假指令序列時,就需要對這部分數據進行有目的的構造,在隨機的數據中引用原程序中的元變量和對象(如寄存器和內存地址等),通過寫內存和加減法計算,然后根據指令長度選取指定數量指令形成虛假指令序列,進一步提升虛假分支的迷惑性,提高混淆強度。此外,為了使元數據更有效與虛假指令配合,元數據會經過變形,誤導反匯編器的判斷,使得即使發(fā)現此處的指令,也無法確定指令的執(zhí)行邏輯。例如:

其中,地址空間0x2242到0x2244是在添加了模式切換BX R6指令后,反匯編引擎對二進制數據進行的重新解讀所得出的反匯編虛假指令序列。這里,利用了寄存器R1和內存地址[SP,#0x1C+var_10]作為元數據構造虛假指令。盡管動態(tài)執(zhí)行無法執(zhí)行其原本的功能,但是仍然會進行靜態(tài)線性掃描反匯編,因為原本的二進制數據并未發(fā)生改變,因此更難看出[0x2242~0x2244]處的指令是虛假指令,使得逆向分析者無法進行正確的靜態(tài)分析。

3 測試與分析

本文實驗平臺選取Google Pixel XL硬件和Android 7.1.1操作系統(tǒng)。選用的測試程序來自arm mbedtls密碼庫,分別是MD5和SHA1哈希算法,及DES和AES加密算法程序[16],并參考Collberg提出的對代碼混淆的評價指標[17],分別從強度、彈性和開銷三方面進行測試與分析。

3.1 強度測試

經過本文算法混淆后匯編代碼塊的指令數量和跳轉指令的數量顯著增加,同時程序的控制流變得更加復雜。因此,本文以控制流循環(huán)復雜度作為強度測試指標,分析混淆前后控制流循環(huán)復雜度的變化。控制流循環(huán)復雜度記為V(G)[18],計算公式如公式(1)所示:

其中,e表示控制流圖中邊的數量,n表示控制流圖中節(jié)點的數量。

由于混淆前,程序的控制流僅涉及Thumb模式邏輯,而混淆后的程序控制流包含Thumb模式的原始邏輯和ARM模式的新增混淆兩種執(zhí)行邏輯。為降低分析的復雜度,首先把混淆前的ST執(zhí)行邏輯看作一個整體,其控制流循環(huán)復雜度表示為x。混淆后,SA的執(zhí)行邏輯部分的控制流循環(huán)復雜度為執(zhí)行ARM模式等價指令變換混淆部分的控制流循環(huán)復雜度,如3.1節(jié)所示,仍然把它看作一個整體,表示為y1。其次,SA的模式切換入口混淆指令變換部分的執(zhí)行代碼邏輯主要由MT和QT構成,如3.2節(jié)和3.3節(jié)所示,其控制流循環(huán)復雜度分別表示為y2和y3。其中,y2為寄存器混淆的控制流循環(huán)復雜度,y3為虛假指令混淆的控制流循環(huán)復雜度。最后,通過模式切換指令在整個混淆后的匯編代碼的控制流中新增2條邊,即e=2。綜上,混淆前后程序的控制流循環(huán)復雜度比為VT/V=(y1+y2+y3+2)/x。根據ARM原始程序Thumb模式邏輯,在4個測試用例中分別選取MD5的mbedtls_md5_update_ret、SHA1的mbedtls_sha1_update_ret、AES的mbedtls_internal_aes_encrypt、DES的mbedtls_des_crypt_ecb作為測試函數,計算其混淆前后的x和y1,y2,y3值,其測試結果如表1所示。

表1 程序混淆前后控制流循環(huán)復雜度比較Table1 Comparison of cyclomatic complexity between two programs before and after obfuscation

由表1可知,混淆后ARM應用程序控制流循環(huán)復雜度遠大于混淆前,復雜度的增加主要是由于本文算法的寄存器混淆和虛假花指令混淆所產生,這部分復雜度遠大于原始ST的復雜度,所以會引起較大的增長率,說明本文混淆方法對ARM應用程序的混淆強度大大提高。此外,本混淆算法的核心在于對原始ST控制流的破壞,且混淆后的yi,i=1,2,3是一個不確定量,使得像IDA Pro等常見的控制流分析工具難以準確地分析其控制流循環(huán)復雜度。所以從這個角度看,它同樣提高了混淆的強度。

3.2 彈性測試

彈性的度量用于衡量本文算法能夠抵抗ARM反匯編逆向分析的能力。本文利用IDA Pro自動化分析逆向工具對指令模式切換混淆前后的程序進行比較,分析指令模式切換混淆抗逆向分析的效果。其中,在對MD5哈希算法中的mbedtls_md5_update_ret反匯編后,其混淆前后的局部控制流分別如圖2和圖3所示。

圖2 mbedtls_md5_update_ret混淆前局部控制流圖Fig.2 Partial control flow graph of mbedtls_md5_update_ret before obfuscation

圖3 mbedtls_md5_update_ret混淆后局部控制流圖Fig.3 Partial control flow graph of mbedtls_md5_update_ret after obfuscation

在圖2中,混淆前的mbedtls_md5_update_ret局部控制流圖的基本塊“l(fā)oc_12C8C”原本在結束位置會通過跳轉指令跳轉至基本塊“l(fā)oc_12CA2”,該局部控制流圖被正確分析。從圖3混淆后的mbedtls_md5_update_ret局部控制流發(fā)現,原本正確的控制流被截斷,基本塊“l(fā)oc_12C8C”被分析成以“BX R4”結尾,因此在ARM反匯編分析時,不能直觀地從控制流圖中得出其跳轉的信息,從而影響了其進一步準確地分析完整的控制流。

采用IDA Pro,Objdump和Radare等ARM逆向工具進一步對MD5、SHA1、DES和AES測試用例中的mbedtls_md5_update_ret、mbedtls_sha1_update_ret、mbedtls_internal_aes_encrypt和mbedtls_des_crypt_ecb關鍵函數進行逆向工程測試。表2顯示了所有測試用例的測試結果。

表2 逆向工程測試結果Table 2 Test results of reverse engineering

從表2的測試結果可以看出,ARM靜態(tài)逆向工程無法分析出被本文模式切換混淆過的關鍵函數。這是由于mbedtls_md5_update_ret、mbedtls_sha1_update_ret、mbedtls_internal_aes_encrypt和mbedtls_des_crypt_ecb函數的ST指令在Thumb模式中被切換混淆,而這些逆向編譯工具都是基于Thumb模式中對這部分指令進行分析的,所以這些工具都不能正確地逆向編譯出被模式切換混淆過的ARM匯編代碼。

3.3 開銷測試

下面對混淆前后,程序的開銷進行測試,測試指標包含體積開銷和時間開銷。首先,對MD5、SHA1、DES和AES四個測試用例程序進行體積開銷測試,并與OLLVM混淆進行橫向比較。這里定義GRS為程序文件體積的增長率(%),S0為混淆前程序的文件大小,S1為混淆后程序的文件大小。這樣得到計算GRS的公式如公式(2)所示:

ARM匯編指令為定長指令,為準確衡量混淆前后程序大小的增加幅度,以匯編指令條數I量化體積大小,則對測試程序的體積性能開銷的測試數據對比,在靜態(tài)和動態(tài)情況下的結果分別如表3和表4所示。

表3 靜態(tài)指令程序混淆前后體積開銷比較Table 3 Comparison of size cost between two static instruction programs before and after obfuscation

從表3可以看出,本文方法混淆的程序靜態(tài)指令增長的絕對值波動較小,集中在40條左右,這主要與選擇的基本塊指令數量有關,增長率則呈現出原始總質量越多,增長率越低的情況。而OLLVM混淆后的程序靜態(tài)指令增長的絕對值波動較大,且其平均增長率為111.76%,是本文方法的14倍。動態(tài)指令是指在正確輸入的情況下,混淆前后在執(zhí)行時被執(zhí)行到的指令,從表4可以看出,本文方法混淆后的程序動態(tài)指令增長的規(guī)律與靜態(tài)指令一致,且比OLLVM混淆后的程序動態(tài)指令增長的絕對值和增長率都更低,因此本文方法的程序體積開銷更小。

表4 動態(tài)指令程序混淆前后體積開銷比較Table 4 Comparison of size cost between two dynamic instruction programs before and after obfuscation

時間開銷是衡量軟件保護技術的另一重要指標,定義程序運行時間增長率GRT:

其中,T1表示本文混淆算法處理后程序的運行時間,T0表示程序原始運行時間。分別對16、32、64和128 Byte的隨機數進行MD5和SHA1哈希運算,以及DES和AES加密運算,其中DES和AES分別采用mbedtls中的測試密鑰。表5顯示了本文方法和OLLVM混淆前后的運算時間(ms)及其增長率(%)比較。

從表5可以看出,本文方法混淆前后程序運行時間增長率在[1%,21%]之間波動,呈現出與體積增長一致的特征,且原始運行時間越長,增長率就越低,對原始程序的影響就越小。此外,OLLVM混淆前后程序運行時間的增長率在[7%,44%]區(qū)間,不論是增長的大小還是波動范圍都比本文方法大。因此,本文方法的時間開銷對于程序本身運行影響不大。

表5 程序混淆前后時間開銷比較Table 5 Comparison of time cost between two programs before and after obfuscation

4 結束語

針對ARM反匯編和逆向分析引起的ARM二進制程序破解和盜版、隱私數據泄露和知識產權竊取等安全問題,提出了一種基于模式切換的ARM匯編代碼混淆算法,該算法對底層的匯編指令進行代碼混淆,使反匯編時得到的錯誤匯編指令在之后的逐級逆向分析中,會由于逐步積累而很難獲取有價值的結果。此外,由于模式切換和變形指令在變換混淆后,不論是在靜態(tài)執(zhí)行文件中,還是在內存里動態(tài)調試中,都呈現不同的控制流,因此給傳統(tǒng)的靜態(tài)和動態(tài)反匯編分析方法帶來了極大挑戰(zhàn)。同時,還對本文提出的代碼混淆算法的強度、彈性和開銷進行了測試評價。實驗測試結果表明,該方法能有效地提升ARM程序的混淆強度和彈性,并且對于性能開銷的消耗比較少。在下一步工作中,將結合ARM指令集和Thumb指令集的切換特性,繼續(xù)擴展模式切換指令,進一步提高保護效果。在寄存器混淆中插入不透明謂詞。針對虛假指令混淆,研究隱藏有效數據和進行二次分支跳轉的條件,使虛假指令被更有效的利用。

猜你喜歡
指令程序
聽我指令:大催眠術
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
殺毒軟件中指令虛擬機的脆弱性分析
電信科學(2016年10期)2016-11-23 05:11:56
創(chuàng)衛(wèi)暗訪程序有待改進
一種基于滑窗的余度指令判別算法
主站蜘蛛池模板: 欧美精品在线免费| 久久综合亚洲鲁鲁九月天| 免费看a级毛片| 欧美成人h精品网站| 伦伦影院精品一区| 欧美在线中文字幕| 亚洲天堂久久新| 国产中文一区a级毛片视频| 国产无码高清视频不卡| 蜜臀av性久久久久蜜臀aⅴ麻豆| 精品五夜婷香蕉国产线看观看| 欧美影院久久| 永久在线播放| 午夜小视频在线| 欧美日韩中文国产va另类| 成人综合久久综合| 日韩欧美国产中文| 999精品视频在线| 人妻精品久久无码区| 伊人无码视屏| 亚洲熟女中文字幕男人总站| 国产午夜在线观看视频| 久久精品无码中文字幕| 免费看久久精品99| 免费观看男人免费桶女人视频| 国产午夜精品鲁丝片| aa级毛片毛片免费观看久| 国产美女在线免费观看| 国产97色在线| 国产a网站| 亚洲天堂777| a欧美在线| 国产精品欧美激情| 热九九精品| 天堂av高清一区二区三区| 在线欧美一区| 天天摸天天操免费播放小视频| 久爱午夜精品免费视频| 国产在线精品人成导航| 在线观看视频一区二区| 一级毛片a女人刺激视频免费| 成年人免费国产视频| 狠狠色婷婷丁香综合久久韩国| 99偷拍视频精品一区二区| 亚洲中文字幕在线精品一区| 亚亚洲乱码一二三四区| 国产精品自在在线午夜| 亚洲无码熟妇人妻AV在线| 成人国产精品网站在线看| 乱系列中文字幕在线视频| 天天摸夜夜操| 亚洲AV色香蕉一区二区| 人妻少妇久久久久久97人妻| 欧美另类第一页| 国产黄在线免费观看| 国产91线观看| 亚洲成人黄色在线| 亚洲AV永久无码精品古装片| 18禁色诱爆乳网站| 久久久久夜色精品波多野结衣| 国产一区二区福利| 日韩在线2020专区| 婷婷色中文| 亚州AV秘 一区二区三区| 国产毛片不卡| 国产手机在线ΑⅤ片无码观看| 国产精品jizz在线观看软件| 亚洲美女操| 一级一级特黄女人精品毛片| 乱码国产乱码精品精在线播放| 成人午夜亚洲影视在线观看| 欧美一级99在线观看国产| 91成人在线观看| 无码AV高清毛片中国一级毛片| 亚洲黄色高清| 精品国产成人三级在线观看| 欧美成人二区| 欧美在线天堂| 色噜噜狠狠色综合网图区| 国产成人免费观看在线视频| 思思99热精品在线| 波多野结衣中文字幕一区二区|