精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實踐API鉤子攔截DLL庫調用

安全 應用安全
在日常分析使用某個軟件的過程中,如果我們想要去挖掘軟件的漏洞、或者是通過打補丁的方式給軟件增添一些新的功能,抑或是為了記錄下軟件運行過程中被調用的函數及其參數,有時候我們需要劫持對某些DLL庫的調用過程。

[[177879]]

前言

在日常分析使用某個軟件的過程中,如果我們想要去挖掘軟件的漏洞、或者是通過打補丁的方式給軟件增添一些新的功能,抑或是為了記錄下軟件運行過程中被調用的函數及其參數,有時候我們需要劫持對某些DLL庫的調用過程。在一般情況下,如果我們是軟件的開發者或者該軟件提供源碼下載,那么剛才提到的問題只要對源碼進行一定的修改就可以了,簡直是小菜一碟。但是在更多情況下,我們無從獲取軟件或是庫的源碼,因為他們根本沒有采用源碼發行的方式。那這樣我們是否就一籌莫展了呢?通過閱讀這篇文章,我會告訴你最流行的“API鉤子”方法是什么,并且會以略微不同的方式展現給大家。

API鉤子

正如上文我們已經提到的,劫持DLL最流行的方法被稱作“API鉤子”——一種將庫函數調用重定向到你的代碼的技術。最為流行的API鉤子庫非微軟的 Microsoft Detours (常用于游戲破解)莫屬,并且這個商業庫被打上的價值標簽已經高達9999.95美元(約68999元人民幣)。再舉一個例子,在Dephi語言中有一個庫叫做 madCodeHook,他的商業價值約為349歐元(約2564元人民幣)。

下面就讓我們來看一看API鉤子的具體實現原理。

對于已經加載的DLL庫及對應函數,通過在想要鉤取的函數頭部首字節打上一個補丁(也叫重寫,個人認為叫覆蓋最為貼切),補丁內容為一個JMP指令,像是 JMP NEAR 這樣的形式,轉換成16進制就是 E9 xx xx xx xx。如下圖所示:

圖1:被鉤取的函數前后內容示意

當控制權被傳遞到我們鉤取過的函數后,通常這時就可以執行我們自己想要執行的代碼了,執行完畢后又會接著運行原函數然后返回到之前從DLL庫中調用該函數的代碼位置。

API鉤子其實會導致一些問題,而問題的來源就在于編譯過的軟件結構和它本身的代碼結構。當我們想要通過鉤子本身來調用原函數的時候(通常不加處理情況下會導致一個死循環),我們必須要創建一個特殊的代碼區塊來調用原函數代碼,這個代碼區塊有個別稱叫做“蹦床”(個人覺得在國內更常被稱為跳板),這樣的話就不用管鉤子本身是否在要調用的函數體內了。

另外需要說明的是,API鉤子技術不是萬能的,在受保護的DLL庫中幾乎不可能實現。說得詳細一點就是,比如存在CRC校驗保護的時候,無論是從硬盤上還是內存中對庫DLL庫代碼的修改都是不可行的。

還有一點就是,經典的API鉤子也不適用于DLL庫導出的“偽函數”,這里的偽函數是指導出的變量、類指針等等。因為在這種類型的“函數”條件下我們根本不可能在原函數和我們的代碼之間建立一個經典的代碼鉤子(事實上根本就沒有函數可鉤取)。那是不是就無可奈何了呢?上面我們提到的方法是改寫原函數代碼,而下面要介紹的第二種常見方法就是修改PE導出表。只不過這種方法的局限性很大,遠不如前一種流行,而且只有很少的一部分鉤子庫支持它。

DLL轉發

一種更加有創意但是也更為麻煩的API鉤取方式叫做“DLL”轉發,它通過Windows的內部機制來實現,基本原理就是轉發DLL調用至其他模塊。

DLL轉發技術基于“替換表“來實現,所以也被稱為“DLL代理”,它可以導出所有的原始庫函數,也可以傳遞所有對庫函數的調用——除了我們想要鉤取的那部分函數。而函數調用是被通過一些鮮為人知的Windows機制傳遞給原函數庫的,這樣我們就可以借此來調用其他庫函數,裝作他們本來就是存儲在我們使用的API鉤子庫里一樣,但事實上這些代碼被存儲在其他的庫中。弄明白以上這些過程,我們也就不難得知為什么要叫做“DLL轉發”了。

函數調用慣例

函數調用慣例是一個低等級的用于傳遞函數參數和處理函數調用返回前的堆棧的方式。很大一部分情況下它取決于編譯時的設置,并且在大多數高級編程語言中可以任意選擇函數調用的方式,所以兩者任取其一均可。為了讓我們的API鉤子庫正常運行,它的鉤取函數也必須使用和已經被鉤取的函數相同的調用慣例。他們只有在二進制情況下相互兼容才不會引發像堆棧破壞之類的異常。

表1. 函數調用慣例

調用慣例高度依賴于編譯器的默認設置,比如Delphi默認采用register調用慣例,C語言默認采用cdecl調用慣例。

WinAPI函數(Windows系統函數)默認使用stdcall調用慣例,所以在調用之前,函數的參數都使用push指令存儲在棧中,然后call指令被執行,執行完畢后并沒有必要去修正棧指針ESP,因為在stdcall調用慣例中,棧在函數返回前是自動修正的。這里值得一提的是,一個很有趣的現象是WinAPI中的有些函數并不使用stdcall而是C語言的cdecl,cdecl并不將參數存儲于棧,但棧的修正會在調用完成后根據函數參數的數量被編譯器修正。舉一個例子,user32.dll中的一個函數wsprintfA()(它在C函數庫中的對應是sprintf())就采用cdecl慣例,這種調用方式是備受推崇的,因為這樣除了編譯器之外沒有人知道究竟傳遞了多少個參數。

API鉤子實例

作為一個例子,我想讓它盡量簡單易懂一點,只會用到一個測試庫BlackBox.dll,它只導出兩個函數Sum()和Divide(),想必你已經猜到了,第一個函數的作用是兩個數的求和,第二個函數是兩個數的除法。讓我們假設我們擁有一個完整的庫文檔,并且清楚地知道這兩個函數使用的調用慣例(假設我們有這個庫的頭文件),而且我們還知道它們各自都使用哪些參數。在其他情況下我們需要使用逆向工程來獲得這些底層信息。

代碼清單1:

  1. 6// 該函數將兩個數相加并將結果儲存于Result變量中 
  2. // 成功返回TRUE,失敗返回ERROR  
  3. BOOL __stdcall Sum(int Number1, int Number2, int * Result);  
  4. // 該函數將兩個數相除并將結果儲存于Result變量中  
  5. // 成功返回TRUE,失敗返回ERROR  
  6. BOOL __stdcall Divide(int Number1, int Number2, int * Result); 

在我們的樣例庫中,Divide()函數是有bug的,因為如果除0就會導致程序崩潰(假設我們的程序并沒有做異常處理),現在我們的目標就是來修補這個漏洞。

代理DLL

為了修補BlackBox.dll中的漏洞,我們接下來需要創建一個中間庫,能夠使Divide()函數得以有效應用而不出現除0異常。該應用采用FASM編譯器(波蘭的mr Tomasza Grysztar 創建)的32位匯編器。在下面你會看到帶有精確注釋的樣例庫模板。

代碼清單2:樣例庫的開頭

  1. -------------------------------------------------  
  2. ; DLL 輸出文件格式  
  3. ;-------------------------------------------------  
  4. format PE GUI 4.0 DLL  
  5. ; DLL 入口點函數名  
  6. entry DllEntryPoint  
  7. ; 導入的Windows函數和常數  
  8. include '%fasm%\include\win32a.inc' 

注意源代碼的開頭,你可以在找到輸出文件的類型聲明,并且在頭文件、DLL庫的函數入口點也可以放置這些代碼。

代碼清單3:未初始化的數據段

  1. ;------------------------------------------------- 
  2. ; 未初始化的數據段 
  3. ;------------------------------------------------- 
  4. section '.bss' readable writeable 
  5. ; uchwyt HMODULE oryginalnej biblioteki 
  6. hLibOrgdd ? 

可執行文件和DLL庫被分割為一個個獨立的部分,他們其中之一是未初始化的數據段,這部分并不占用硬盤的空間,僅僅擁作于記錄程序所使用的未初始化變量的整體大小信息。可執行文件的段名稱并不重要(它被限制為最多只有8個字符),通常它會被賦以公司合同的名稱。在這個段的聲明中還會定義訪問權限(如讀、寫、執行),但是在FASM編譯器下.bss段的聲明還會為變量創建一個未初始化的段。

代碼清單4:數據段

  1. ;------------------------------------------------- 
  2. ; 初始化的數據段 
  3. ;------------------------------------------------- 
  4. section '.data' data readable writeable 
  5. ; 原始庫的名稱 
  6. szDllOrgdb 'BlackBox_org.dll',0 

因為原始庫已經有了名稱了,所以這里我們重命名一個BlackBox_org.dll(它以ASCII形式存儲于源代碼中,以null結束),這個庫會在后面用到。

代碼清單5:帶有DLL入口點的代碼段

  1. ;------------------------------------------------- 
  2. ; 庫的代碼段 
  3. ;------------------------------------------------- 
  4. section '.text' code readable executable 
  5. ;------------------------------------------------- 
  6. ; DLL庫入口點 (DllMain) 
  7. ;------------------------------------------------- 
  8. proc DllEntryPoint hinstDLL, fdwReason, lpvReserved 
  9. moveax,[fdwReason] 
  10. ; DLL library 加載完畢后立即傳遞事件 
  11. cmpeax,DLL_PROCESS_ATTACH 
  12. je_dll_attach 
  13. jmp_dll_exit 
  14. ; 庫已經加載 
  15. _dll_attach: 
  16. ; 獲得原始 DLL 庫的句柄 
  17. ; 如果想要調用原始函數就會使用 
  18. pushszDllOrg 
  19. call[GetModuleHandleA] 
  20. mov[hLibOrg],eax 
  21. ; 返回 1 說明庫初始化成功 
  22. moveax,1 
  23. _dll_exit: 
  24. ret 

代碼段包含所有庫函數和DLL入口點函數。這是一個特殊的函數,它在庫加載以后被Windows系統函數調用。代碼段需要被標記上可執行的標記,以此來告訴操作系統這段內存區域包含可以執行的代碼段。如果沒有這樣標記,那么任何想從這塊內存區域執行代碼的行為都會以觸發CPU處理器的DEP(Data Execution Prevention)內存保護機制而告終。在初始化函數內部(DllMain),接收到 DLL_PROCESS_ATTACH 事件后我們將使用原始DLL庫名稱來獲得他的句柄,也就是 HMODULE (這樣之后就可以被調用了)。

代碼清單6:過度優化保護

  1. ; 調用任何原始庫 
  2. ; BlackBox_org.dll 中的函數, 沒有它FASM編譯器就會 
  3. ; 移除對庫的引用并且不會被自動加載 
  4. calldummy 

我們自定義的庫會調用到原始庫,但是如果我們一點引用也不放在源代碼中,FASM編譯器會移除所有對它的引用(優化)而且原始庫并不會被自動加載,這就是為什么在ret指令后直接放了一個偽調用的緣故(這樣在任何時候都不會執行)。

代碼清單7:有效的Divide()函數代碼

  1. ;------------------------------------------------- 
  2. ; 我們修改后能夠處理除0錯誤的Divide() 函數 
  3. ;------------------------------------------------- 
  4. proc Divide Number1, Number2, Result 
  5. ; 檢查除數是否為0 
  6. ; 如果是的話返回ERROR代碼 
  7. movecx,[Number2] 
  8. testecx,ecx 
  9. jeDivisionError 
  10. ; 將第一個數字載入 EAX 處理器 
  11. moveax,[Number1] 
  12. ;擴展 EDX 寄存器來處理有符號數 
  13. cdq 
  14. ; 現在 EDX:EAX 寄存器對可以處理64位數據了 
  15. ; EDX:EAX / ECX 除法的實現, 除法在EDX:EAX寄存器對 
  16. ; 上實現,就像對待64位數據一樣, 除法的結果保存在EAX 
  17. ; 寄存器中, 余數保存在EDX 寄存器中 
  18. idiv ecx 
  19. ; 檢查有效的指向結果的指針 
  20. ; 如果沒有檢測到則返回error 代碼 
  21. movedx,[Result] 
  22. testedx,edx 
  23. jeDivisionError 
  24. ; 在受保護的地址存儲除法的結果 
  25. mov[edx],eax 
  26. ; 以 exit code TRUE (1) 返回 
  27. moveax,1 
  28. jmpDivisionExit 
  29. ; 除法錯誤,返回FALSE (0) 
  30. DivisionError: 
  31. sub eax,eax 
  32. DivisionExit: 
  33. ; 從除法函數中返回 
  34. ; 布爾型的exit 代碼被設置在 EAX 寄存器中 
  35. ret 
  36. endp 

修改后的Divide()函數的實現增添了對除0錯誤的校驗,函數遇到錯誤會返回錯誤代碼FALSE,另外還額外做了對指向結果變量result的指針非空檢查,如果指針指向null也會報錯。另外請注意,修改后的函數的調用慣例與原函數是完全一致的,并且在我們的這個例子中使用的是stdcall慣例,所以函數參數被傳遞到棧中,函數返回值儲存于EAX寄存器,棧指針也被FASM編譯器自動修復,方法是根據源代碼中的ret聲明生成ret (number_of_parameters * 4)指令。

代碼清單8:庫的導入表

  1. ;------------------------------------------------- 
  2. ; 我們的庫使用的函數段 
  3. ;------------------------------------------------- 
  4. section '.idata' import data readable writeable 
  5. ; 在代碼中用到的庫的列表 
  6. library kernel,'KERNEL32.DLL',\ 
  7. blackbox, 'BlackBox_org.dll' 
  8. ; KERNEL32.dll庫的函數列表 
  9. importkernel,\ 
  10. GetModuleHandleA, 'GetModuleHandleA' 
  11. ; 聲明了原始庫的用途 
  12. ; DLL 庫會被自動加載 
  13. importblackbox,\ 
  14. dummy, 'Divide' 

FASM編譯器允許我們手動地定義我們自己的庫調用到的庫和函數,除了標準系統庫,我們需要在這里添加一個對 BlackBox.dll 的引用。多虧于此,當Windows加載我們的鉤子庫的同時也會根據地址空間加載原始庫,從而無需再手動調用 LoadLibraryA() 函數來加載它。 在某些情況下想要使用導入表來加載庫甚至是強制性要求使用 LoadLibraryA() 的,它需要使用多線程應用程序中TLS(Thread Local Storage)機制的動態鏈接庫來支持。

代碼清單9:函數導出表

  1. ;------------------------------------------------- 
  2. ; 導出表段包含我們的庫中導出的函數 
  3. ; 這里我們也許要聲明原始庫中聲明的函數 
  4. ;------------------------------------------------- 
  5. section '.edata' export data readable 
  6. ; 導出函數列表及其指針 
  7. export'BlackBox.dll',\ 
  8. Sum'Sum',\ 
  9. Divide, 'Divide' 
  10. ; 轉發表名稱, 首先目的庫被存儲 (無需.DLL擴展) 
  11. ; 然后最終的函數名稱被存儲 
  12. Sum db 'BlackBox_org.Sum',0 

在這個段中我們必須聲明原始庫中的所有函數,而且我們想要鉤取的函數必須在代碼中得以應用,想要傳遞給原始庫的函數存儲在一個特殊的文本格式中:

DestinationDllLibrary.FunctionName

DestinationDllLibrary.#1

以此來順序導入函數而非按照名稱的順序。該機制的所有內部工作均交由Windows系統自身處理。以上為DLL轉發。

代碼清單10:重定位部分

  1. ;------------------------------------------------- 
  2. ; 重定位部分 
  3. ;------------------------------------------------- 
  4. section '.reloc' fixups data discardable 

我們的庫中最后一個段是重定位段,它保證了我們的庫能夠正常運行。這是因為動態鏈接庫被加載的基地址是非常多變的,而引起這個多變性的原因在于指針使用的絕對地址和匯編器的指令使用的絕對地址必須根據當前內存中的基地址做出更新,而這個基地址的信息正是由編譯器在重定位段中生成的。

總結

這篇API鉤子介紹的方法可以被成功應用于各種使用動態鏈接庫的場合,較傳統的經典API鉤子方法而言各有利弊,但是在我看來本文的方法為實踐打開了更大的拓展空間,并提供了一種更加簡單的改變軟件完整功能性的方法。該方法同樣可以在高級語言中以適當的導出函數定義文件(DEF)的方式實現。

責任編輯:武曉燕 來源: overXsky
相關推薦

2009-08-05 16:49:42

C#中調用dll

2024-03-01 20:59:11

C#DLL開發

2009-12-14 16:44:56

Ruby調用DLL

2024-09-25 08:04:58

2009-07-31 17:28:35

C#語言調用DLL

2009-08-03 12:57:27

C#調用DLL

2009-08-07 17:22:36

C#調用dll導出函數

2011-06-28 13:12:07

Qt 調用 DLL DLL

2009-08-05 09:40:02

C#調用DLL函數

2009-08-05 16:41:36

C#調用VC dll

2009-09-02 17:16:01

冒泡排序

2009-08-05 09:30:39

C#調用DLL函數

2019-01-21 14:20:26

Java開發代碼

2013-06-13 09:21:31

RESTful APIRESTfulAPI

2011-12-02 09:20:58

JavaScript

2010-01-26 14:04:14

C++Builder

2009-06-17 13:19:50

Java調用DLL

2022-03-29 10:04:44

APIHarmony文件管理

2016-12-27 08:49:55

API設計策略

2009-07-08 17:02:11

JDK實現調用攔截器
點贊
收藏

51CTO技術棧公眾號

欧美tk—视频vk| 亚洲精品水蜜桃| 国产精品狼人色视频一区| 日韩在线一卡二卡| 成人网av.com/| 午夜电影一区二区三区| 香蕉久久夜色| 韩国av永久免费| 人人爽香蕉精品| 久久91超碰青草是什么| b站大片免费直播| 视频一区日韩| 欧美日韩亚州综合| 亚洲人成无码网站久久99热国产 | 日韩欧美一区二区视频| 日韩在线综合网| 成人三级网址| 国产日韩欧美精品一区| 国产精品一区二区a| 在线观看色网站| 午夜一区二区三区不卡视频| 久久久精品国产| 69精品无码成人久久久久久| 国产精品99久久免费观看| 欧美浪妇xxxx高跟鞋交| 欧美牲交a欧美牲交aⅴ免费真 | 国产精品久久久久一区| 久久精品人人做人人爽电影| 91亚洲欧美激情| 奶水喷射视频一区| 国内精品视频在线| 国产精品成人免费观看| 国产精品一区二区av交换| 亚洲精品电影在线| 人妻精油按摩bd高清中文字幕| 日韩一区精品| 色一情一乱一乱一91av| 日日橹狠狠爱欧美超碰| 成年网站在线视频网站| 夜夜嗨av一区二区三区网页| 一区二区三区视频在线播放| www在线播放| 国产亚洲精品久| 美女精品国产| 香蕉视频网站在线| 成人avav影音| 久久精品丝袜高跟鞋| 熟妇高潮一区二区高潮| 成人高清免费观看| 国产精品免费一区二区| 午夜精品久久久久久久99| 国产精品一区二区视频| 91影视免费在线观看| 国产成人毛毛毛片| 国产精品小仙女| 亚洲xxx大片| 国产77777| av网站免费线看精品| 久久99精品久久久久久三级| 天天在线女人的天堂视频| 91小视频在线观看| 清纯唯美一区二区三区| av电影在线观看一区二区三区| 国产欧美一区二区精品仙草咪| 日韩精品一区二区三区色偷偷| 免费在线高清av| 日本一区二区三区高清不卡| 亚洲人成网站在线观看播放| 午夜视频成人| 亚洲综合久久久| 日韩精品xxxx| 电影天堂国产精品| 欧美区视频在线观看| 操人视频免费看| 白嫩白嫩国产精品| 亚洲欧美三级伦理| 一本色道久久88| 欧美视频一区| 2019中文字幕在线免费观看| 成人毛片一区二区三区| 国产在线视频一区二区| 不卡一卡2卡3卡4卡精品在| 天天干视频在线| 国产区在线观看成人精品| 亚洲欧美日韩精品久久久| a级影片在线观看| 精品久久久视频| 国产日韩欧美久久| 风间由美性色一区二区三区四区| 日韩精品一区二区三区第95| 亚洲区自拍偷拍| 欧美大片专区| 日韩免费观看视频| 国产人妖一区二区| 久久众筹精品私拍模特| 亚洲AV无码成人精品一区| 国产精品xx| 欧美日本国产视频| 狠狠人妻久久久久久综合蜜桃| 日韩在线理论| 91精品国产成人| 国产精品怡红院| 91麻豆6部合集magnet| 一区二区视频在线免费| 欧亚av在线| 欧美一级日韩一级| 国产精久久一区二区三区| 欧美激情视频一区二区三区免费| 日产精品99久久久久久| 亚洲精品久久久久久动漫器材一区| 久久夜色精品国产欧美乱极品| 综合国产精品久久久| 日韩理论视频| 精品国产乱码久久久久久免费| 手机毛片在线观看| 国产欧美日韩综合一区在线播放 | 久久精品中文字幕免费mv| 国产精品自拍视频一区| 精品一区二区成人精品| 日韩高清国产一区在线观看| 成全电影大全在线观看| 日韩午夜小视频| 99在线视频免费| 久久激情视频| 国产自产精品| 日本精品600av| 欧美理论片在线| japanese中文字幕| 亚洲制服av| 国产欧美一区二区三区不卡高清| 色网站免费在线观看| 欧美综合亚洲图片综合区| 艳妇乳肉亭妇荡乳av| 国产伊人精品| 亚洲free性xxxx护士hd| 免费黄色在线观看| 欧美一a一片一级一片| 国产又粗又猛又爽视频| 国产精品综合色区在线观看| 国产综合第一页| xxxcom在线观看| 337p日本欧洲亚洲大胆色噜噜| 欧美日韩在线观看成人| 国产在线视频一区二区| 国产奶头好大揉着好爽视频| 亚洲天堂网站| 国产一区二区三区在线观看网站| 国产又大又黄又粗| 久久欧美一区二区| 成人羞羞国产免费网站| 蜜桃一区二区| 国产精品久久久久久超碰| 国产三区四区在线观看| 欧美性色aⅴ视频一区日韩精品| 无码人妻aⅴ一区二区三区69岛| 久久永久免费| 亚洲国产日韩综合一区| 国产成人精品一区二区三区视频| 亚洲午夜久久久影院| 进去里视频在线观看| 国产精品的网站| 国产亚洲色婷婷久久| 欧美日韩亚洲三区| 国产一区在线免费| 日本久久免费| 色婷婷综合成人| aa视频在线免费观看| 亚洲成人久久影院| 真实乱视频国产免费观看| 日韩电影在线观看一区| 黄色网址在线免费看| 91精品国产自产精品男人的天堂 | 电影久久久久久| 色综合伊人色综合网站| www.国产免费| 欧美日韩中文字幕综合视频| 2019男人天堂| 国产伦精品一区二区三区视频青涩| 国产黄色激情视频| 亚洲人成伊人成综合图片| 国产精品一区二区三区免费视频| 黄色成人影院| 日韩电影第一页| 最近中文字幕在线免费观看| 一区二区三区四区蜜桃| theav精尽人亡av| 蜜臀av性久久久久蜜臀aⅴ流畅| 午夜啪啪福利视频| 欧美亚洲色图校园春色| 国产日韩在线免费| 97人人在线视频| 最近2019中文字幕一页二页| 人妻视频一区二区三区| 欧美图片一区二区三区| 久久精品免费在线| 国产欧美日韩另类视频免费观看| 午夜视频在线免费看| 天堂成人免费av电影一区| 久久综合亚洲精品| 夜色77av精品影院| av在线亚洲男人的天堂| 天天综合网天天| 午夜精品久久17c| 日本高清中文字幕在线| 日韩麻豆第一页| 精品人妻av一区二区三区| 色婷婷精品久久二区二区蜜臀av| 中文字幕av久久爽av| 欧美极品另类videosde| 人妻av一区二区| 国产综合久久久久久鬼色| 日韩av在线综合| 亚洲国产导航| 99精品视频网站| 国模精品一区| 精品一区二区三区免费毛片| 国产高清视频一区二区| 国产精品久久av| www在线观看黄色| 九九热精品在线| 免费在线看a| 中文日韩电影网站| 你懂得网站在线| 亚洲国产毛片完整版| 精品国产亚洲av麻豆| 欧美日韩1区2区| 国产乱码在线观看| 91精品办公室少妇高潮对白| 三级黄色在线视频| 亚洲午夜电影网| 久草视频在线资源站| 亚洲欧美日韩在线播放| 国产精品成人在线视频| 国产亚洲欧美在线| 亚洲人成人无码网www国产| 99综合电影在线视频| 好吊操视频这里只有精品| 韩国成人精品a∨在线观看| 一区二区三区韩国| 日韩和欧美的一区| 在线看的黄色网址| 日韩高清电影一区| 日本a√在线观看| 日韩国产高清在线| 五月婷婷激情久久| 美女视频网站久久| 中日韩av在线播放| 激情偷乱视频一区二区三区| av亚洲天堂网| 精品一区二区久久| 欧美一区二区三区影院| 国产成人av一区二区三区在线观看| 日本高清免费在线视频| 国产一区二区成人久久免费影院| 久久久精品视频国产| 国产美女娇喘av呻吟久久| 污免费在线观看| 成人中文字幕合集| 国产精品三级在线观看无码| 91片在线免费观看| аⅴ天堂中文在线网| 欧美国产激情一区二区三区蜜月| 美国美女黄色片| 亚洲四区在线观看| 久草资源在线视频| 调教+趴+乳夹+国产+精品| 91精品国产高清一区二区三密臀| 色老头久久综合| 一区二区日韩视频| 精品91自产拍在线观看一区| 亚洲三区在线观看无套内射| 亚洲香蕉伊综合在人在线视看| 99re在线视频| 欧美日韩999| 中文字幕在线直播| 国产一区香蕉久久| 激情小说一区| 亚洲精品一区二区三| 欧美国产高清| 国产超级av在线| 久久成人精品无人区| 一级全黄裸体片| 国产日本亚洲高清| 国产1区2区3区4区| 日韩欧美国产网站| 国产又黄又大又爽| 亚洲国产成人在线播放| av在线三区| 高清欧美一区二区三区| 99久久亚洲国产日韩美女| 国产精品视频入口| 国产探花在线精品一区二区| 污污污污污污www网站免费| 裸体素人女欧美日韩| 佐山爱在线视频| 久久精品夜色噜噜亚洲a∨| 日本在线一级片| 色综合欧美在线| 国产不卡av在线播放| 亚洲人a成www在线影院| 色呦呦在线播放| 国产精品久久久久久久久久新婚 | 色综合影院在线观看| 在线观看一区| 国产永久免费网站| 2021久久国产精品不只是精品| 一级黄色片日本| 日本高清无吗v一区| a视频免费在线观看| 亚洲人成电影网站色…| 俄罗斯一级**毛片在线播放 | 欧美性久久久久| 国产一区二区电影| 老熟妇一区二区| 欧美性猛交xxxx免费看| 亚洲女人18毛片水真多| 日韩午夜在线视频| 国产91精品在线| 欧美少妇一区| 亚洲婷婷在线| 最好看的中文字幕| 亚洲日本在线看| 中文字幕在线网址| 亚洲天天在线日亚洲洲精| 国模精品视频| 国产欧美在线一区二区| 午夜日韩电影| 久久精品一卡二卡| 日韩毛片精品高清免费| 中文字幕精品在线观看| 国产亚洲精品久久久久久777| 激情黄产视频在线免费观看| av成人午夜| 欧美三级午夜理伦三级中文幕| 中日韩av在线播放| 中文字幕日韩精品一区| 又骚又黄的视频| 中文字幕国产亚洲2019| 超碰这里只有精品| 日韩精彩视频| 青青草97国产精品免费观看 | 免费观看a视频| 色与欲影视天天看综合网| 伊人久久噜噜噜躁狠狠躁| 白白操在线视频| 成人一区二区三区视频| 国产亚洲精品码| 亚洲第一区第一页| 成人在线黄色电影| 蜜桃导航-精品导航| 久久久久中文| 粉嫩精品久久99综合一区| 欧美日韩免费一区二区三区视频| 色哟哟免费在线观看| 91在线色戒在线| 激情成人亚洲| 国产又黄又粗又猛又爽的视频| 欧美日韩另类字幕中文| 四虎国产精品永远| 国产成人精品免费久久久久 | 视频一区视频二区国产精品| 欧美黄色a视频| 欧美日韩中文字幕在线播放| 懂色av中文字幕一区二区三区| 国产一级片视频| 亚洲黄色片网站| 一区二区视频免费完整版观看| 性欧美大战久久久久久久免费观看 | 伦伦影院午夜日韩欧美限制| **爰片久久毛片| 日韩黄色片视频| 国产精品久久久久婷婷二区次| av综合在线观看| 91极品女神在线| 欧美一级本道电影免费专区| 在线a免费观看| 精品久久久久久中文字幕大豆网| av在线第一页| av资源站久久亚洲| 日产欧产美韩系列久久99| 一区二区三区四区五区| 日韩激情av在线免费观看| 姬川优奈av一区二区在线电影| 四虎影院一区二区| av亚洲精华国产精华| 一级特黄aaa大片| 91精品国产网站| 欧美成人激情| 国产制服丝袜在线| 在线不卡免费欧美| 女人让男人操自己视频在线观看| 亚洲欧美日产图| 99久久99久久精品免费观看| 一区二区三区麻豆| 久久久久久亚洲精品| 日韩av在线播放网址| 在线免费看黄色片| 欧美日韩精品一区二区三区蜜桃 | 亚洲国产你懂的| 波多野结衣在线网站|