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

如何用幾行代碼打造應用程序熱補丁?(一)

企業動態
本篇將介紹一種簡單實用的應用程序熱補丁技術。不少場景下,用該方法編寫幾行代碼即可免重啟修復應用程序BUG!

一、前言

應用程序,作為核心業務組件,每天都面臨著嚴峻的高可用挑戰,每次重啟,都會導致服務受損。尤其是單點的虛擬化組件和有狀態的應用程序,一旦重啟,影響更甚。

熱補丁,一種在程序運行時動態修復內存中代碼bug的技術,能避免系統重啟導致的業務中斷、有效保證操作系統的可用性。

經過大量的研究和實踐,UCloud從0到1,自研了一套應用程序熱補丁技術。千錘百煉出真金,經過內部數十萬臺次修復驗證,UCloud應用程序熱補丁技術已自成體系,成為UCloud核心黑科技之一。

二、原理

一般來說,應用程序熱補丁的流程是,首先通過編譯器將熱補丁源碼制作成可加載的動態鏈接庫,然后通過加載程序將熱補丁加載到目標進程的地址空間,***在進行一致性模型檢查確認安全的情況下,把原始代碼替換成新的代碼,完成在線修復的過程。

下面我們分別介紹熱補丁本身和熱補丁加載程序,熱補丁本身是因patch而異的,加載程序是通用的。

假設我們有熱補丁加載程序Loader、目標進程T、熱補丁patch.so,目標程序的func函數替換為func_v2。

三、熱補丁

1. 編寫熱補丁源碼,編譯成動態鏈接庫的格式的熱補丁patch.so,patch.so中包含func和func_v2的信息。

2. 熱補丁patch.so在被加載程序Loader加載到目標進程T地址空間的過程中,通過dlsym調用找到func的地址,并將func的入口指令改為可寫,同時改變為跳轉到func_v2。

3. 至此,所有對func的調用都會被重定向到func_v2,func_v2執行完畢后返回,程序繼續運行。

4. 如圖所示:

熱補丁

四、熱補丁加載程序

1. 加載程序Loader找到目標進程T的dlopen函數入口地址。

2. Loader通過ptrace依附到目標進程T,Loader將熱補丁的名字放入放入目標進程T的堆棧,將IP寄存器設置為dlopen函數的地址。

3. Loader使目標進程T繼續運行。因為IP寄存器已經設置為dlopen函數的入口,目標進程T會調用dlopen把熱補丁加載到T的地址空間中。

4. 如圖所示:

熱補丁加載程序

了解原理之后,我們一步步實現一種簡單的基于x86_64的熱補丁。

(對于需要制作熱補丁的同學,只需自己編寫patch.so,而Loader是通用的。patch.so編寫可以參考下面的例子,往往只需幾行代碼做相應替換。)

五、實現

1. 熱補丁

1) 目標進程T執行dlopen的過程中,通過預先在熱補丁(動態鏈接庫)中寫入的constructor函數,在加載過程中函數func_v1替換函數func。

  1. static void __attribute__((constructor)) init(void) 
  2.  { 
  3.      int numpages; 
  4.      void *old_func_entry, *new_func_entry; 
  5.  
  6.      old_func_entry = dlsym(NULL, "func"); 
  7.      new_func_entry = dlsym(NULL, "func_v2"); 
  8.  
  9.      #define PAGE_SHIFT              12 
  10.      #define PAGE_SIZE               (1UL << PAGE_SHIFT
  11.      #define PAGE_MASK               (~(PAGE_SIZE-1)) 
  12.  
  13.      numpages = (PAGE_SIZE - (old_func_entry & ~PAGE_MASK) >= size) ? 1 : 2; 
  14.      mprotect((void *)(old_func_entry & PAGE_MASK), numpages * PAGE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC); 
  15.  
  16.      /* 
  17.       * Translate the following instructions  
  18.       *  
  19.       * mov $new_func_entry, %rax  
  20.       * jmp %rax  
  21.       *  
  22.       * into machine code  
  23.       *  
  24.       * 48 b8 xx xx xx xx xx xx xx xx  
  25.       * ff e0  
  26.       */ 
  27.      memset(old_func_entry, 0x48, 1); 
  28.      memset(old_func_entry + 1, 0xb8, 1);  
  29.      memcpy(old_func_entry + 2, &new_func_entry, 8);  
  30.      memset(old_func_entry + 10, 0xff, 1); 
  31.      memset(old_func_entry + 11, 0xe0, 1); 
  32.  } 

2. 熱補丁加載程序

1) Loader得到目標進程T地址空間中dlopen入口地址

  • dlopen函數有libdl提供,并不是所有的程序都加載libdl,幸運的是,libc中提供了同樣功能的函數libc_dlopen_mode,并且接受的參數和dlopen相同。除非特殊情況,所有程序都會加載libc。所以我們需要找到libc_dlopen_mode在目標進程T地址空間中的函數入口地址。
  • 我們知道,不同進程中libc會被加載到不同的基地址,但是libc中函數的地址相對基地址的偏移是不變的。
  • 通過Loader和目標進程T的/proc/pid/maps,我們可以得到libc在Loader和目標進程T中加載的基地址。通過Loader運行dlsym,我們可以得到Loader中的libc_dlopen_mode的地址。這樣我們可以得到目標進程T中libc_dlopen_mode的地址(Loader_dlopen - Loader_libc + T_libc)。
  1. / Take a hint and find start addr in /proc/pid/maps / 
  2.   static unsigned long find_lib_base(pid_t pid, char *so_hint) 
  3.   { 
  4.   FILE *fp; 
  5.   char maps[4096], mapbuf[4096], perms[32], libpath[4096]; 
  6.   char *libname; 
  7.   unsigned long start, end, file_offset, inode, dev_major, dev_minor; 
  8.  
  9.   sprintf(maps, "/proc/%d/maps", pid); 
  10.   fp = fopen(maps, "rb"); 
  11.   if (!fp) { 
  12.           fprintf(stderr, "Failed to open %s: %s\n", maps, strerror(errno)); 
  13.           return 0; 
  14.   } 
  15.  
  16.   while (fgets(mapbuf, sizeof(mapbuf), fp)) { 
  17.           sscanf(mapbuf, "%lx-%lx %s %lx %lx:%lx %lu %s", &start, 
  18.                   &end, perms, &file_offset, &dev_major, &dev_minor, &inode, libpath); 
  19.  
  20.           libname = strrchr(libpath, '/'); 
  21.           if (libname) 
  22.                   libname++; 
  23.           else 
  24.                   continue; 
  25.  
  26.           if (!strncmp(perms, "r-xp", 4) && strstr(libname, so_hint)) { 
  27.                   fclose(fp); 
  28.                   return start; 
  29.           } 
  30.   } 
  31.  
  32.   fclose(fp);   return 0;  
  33.   } 
  34.   loader_libc = find_lib_base(getpid(), “libc-c”); 
  35.   T_libc = find_lib_base(T_pid, “libc-“); 
  36.   Loader_dlopen = (unsigned long)dlsym(NULL, “__libc_dlopen_mode”); 
  37.   T_dlopen = T_libc + (Loader_dlopen - Loader_libc); 

2) Loader對目標進程T使用ptrace attach,并保存T此時的寄存器信息。

  1. static int ptrace_attach(pid_t pid) 
  2.   { 
  3.   int status; 
  4.  
  5.   if (ptrace(PTRACE_ATTACH, pid, NULL, NULL)) { 
  6.           fprintf(stderr, "Failed to ptrace_attach: %s\n", strerror(errno)); 
  7.           return 1; 
  8.   } 
  9.  
  10.   if (waitpid(pid, &status, __WALL) < 0) { 
  11.           fprintf(stderr, "Failed to wait for PID %d, %s\n", pid, strerror(errno)); 
  12.           return 1; 
  13.   } 
  14.   return 0; 
  15.   static int ptrace_call(pid_t pid, unsigned long func_addr, unsigned long arg1, unsigned long arg2, unsigned long *func_ret) 
  16.   { 
  17.   … 
  18.   memset(&saved_regs, 0, sizeof(struct user_regs_struct)); 
  19.   ptrace_getregs(pid, &saved_regs); 
  20.  
  21.   … 
  22.   } 

3) 將目標進程T的%RIP指向dlopen,熱補丁的名字的字符串放入堆棧,字符串的地址寫入%rdi,RTLD_NOW的值寫入%rsi作為dlopen的flag。同時把dlopen返回地址設置為非法地址0x0(把0x0壓入棧中),這樣Loader可以捕獲目標進程T產生的SIGSEGV信號進而重新獲得T的控制權。

  1. unsigned long invalid = 0x0
  2.  regs.rsp -sizeof(invalid); 
  3.  ptrace_poketext(pid, regs.rsp, ((void *)&invalid), sizeof(invalid)); 
  4.  ptrace_poketext(pid, regs.rsp + 512, filename, strlen(filename) + 1); 
  5.  regs.rip = dlopen_addr
  6.  regsregs.rdi = regs.rsp + 512; 
  7.  regs.rsi = RTLD_NOW
  8.  ptrace_setregs(pid, &regs); 

4) Loader使目標進程T繼續運行。當T執行完dlopen之后,T產生的SIGSEGV信號被Loader捕獲,Loader重新獲得T進程的控制權。

  1. static int ptrace_cont(pid_t pid) 
  2.  
  3. {int status; 
  4.  
  5. if (ptrace(PTRACE_CONT, pid, NULL, 0)) { 
  6.  
  7. fprintf(stderr, "Failed to ptrace_cont: %s\n", strerror(errno));return 1; 
  8.  
  9.  
  10. if (waitpid(pid, &status, __WALL) < 0) {fprintf(stderr, "Failed to wait for PID %d, %s\n", pid, strerror(errno)); 
  11.  
  12. return 1;} 
  13. return 0;} 

5) Loader通過讀取目標進程T此時的%rax寄存器得到dlopen的返回值,恢復T最開始的執行狀態,***釋放對T的控制

  1. ptrace_getregs(pid, &regs); 
  2. dlopen_ret = regs.rax; 
  3. ptrace_setregs(pid, &saved_regs); 
  4. ptrace_detach(pid); 

至此對目標進程T的熱補丁就完成了。下面我們看一個例子。

六、驗證

假設我們運行target程序,每隔一秒打印Hello一次:

  1. # ./target 
  2. Hello 
  3. Hello 
  4. … 

target程序由target本身和libold.so組成,分別代碼如下:

  1. /* target.c */ 
  2. #include <unistd.h> 
  3. #include "old.h" 
  4.  
  5. int main() { 
  6.     for (;;) { 
  7.         print(); 
  8.         sleep(1); 
  9.     } 
  10.  
  11. /* old.c */ 
  12. #include <stdio.h> 
  13.  
  14. void print(void) 
  15.     printf("Hello\n"); 

編譯

  1. gcc -fPIC --shared old.c -o libold.so 
  2. gcc target.c ./libold.so -o target 

我們想要修改print函數,變成打印“Goodbye”。我們需要編寫熱補丁new.c,并添加新函數和constructor:

  1. /* new.c */ 
  2. #include <stdio.h> 
  3.     #include <string.h>  
  4. #include <sys/mman.h>  
  5. #include <dlfcn.h>  
  6.  
  7. print_v2(void) 
  8.     printf("Goodbye\n"); 
  9.  
  10. static void __attribute__((constructor)) init(void) 
  11. {  
  12.     int numpages; 
  13.     void *old_func_entry, *new_func_entry; 
  14.  
  15.     old_func_entry = dlsym(NULL, print); 
  16.     new_func_entry = dlsym(NULL, print_v2); 
  17.  
  18.     #define PAGE_SHIFT              12  
  19.     #define PAGE_SIZE               (1UL << PAGE_SHIFT)  
  20.     #define PAGE_MASK               (~(PAGE_SIZE-1)) 
  21.  
  22.     numpages = (PAGE_SIZE - (old_func_entry & ~PAGE_MASK) >= size) ? 1 : 2; 
  23.     mprotect((void *)(old_func_entry & PAGE_MASK), numpages * PAGE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC); 
  24.     memset(old_func_entry, 0x48, 1); 
  25.     memset(old_func_entry + 1, 0xb8, 1);  
  26.     memcpy(old_func_entry + 2, &new_func_entry, 8);  
  27.     memset(old_func_entry + 10, 0xff, 1); 
  28.     memset(old_func_entry + 11, 0xe0, 1); 
  29. }  

編譯:

  1. gcc -fPIC --shared new.c -ldl -o libnew.so  

然后通過加載程序對target進程打入熱補丁libnew.so,***我們對target程序打入這個熱補丁,觀察變化:

  1. # ./target 
  2. Hello 
  3. Hello 
  4. Goodbye 
  5. Goodbye 
  6. … 

我們發現熱補丁確實改變了print函數,***通過gdb進一步確認,可以看出print函數的入口被修改成48 b8 dc b6 15 a9 c1 7f 00 00 ff e0,與我們的預期相符:

  1. (gdb) disas /r print 
  2. Dump of assembler code for function print: 
  3.    0x00007fc1a98f456c <+0>:     48 b8 dc b6 15 a9 c1 7f 00 00   movabs $0x7fc1a915b6dc,%rax 
  4.    0x00007fc1a98f4576 <+10>:    ff e0   jmpq   *%rax # 這里print在入口處跳轉到0x7fc1a915b6dc這個地址 
  5. … 
  6. (gdb) info symbol 0x7fc1a915b6dc 
  7. print_v2 in section .text of /root/process-hotupgrade/test/libnew.so # 0x7f2ea417971c這個地址就是print_v2函數的地址 

七、總結

我們介紹了應用程序熱補丁的基本原理,實踐了一個應用程序熱補丁demo。此類熱補丁適用于動態替換共享鏈接庫中的可見函數,可以修復例如glibc “GHOST漏洞”(CVE-2015-0235)等等,在UCloud我們利用熱補丁修復了若干缺陷,在用戶沒有感知的情況下把bug快速及時的修復。這些熱補丁修復程序里,絕大多數代碼是通用的,只需少數幾行做特殊替換。

上文介紹的熱補丁技術對于適用的場景非常理想,簡單可靠,但存在幾個缺點:

  • 手寫熱補丁代碼門檻較高,特別是被修復函數的依賴函數鏈較長時手寫熱補丁很容易出錯
  • 無法修復局部函數和局部變量(只能修復全局可見的函數和變量)

下一篇文章我會介紹一種更加先進的應用程序熱補丁技術。

【本文是51CTO專欄機構作者“大U的技術課堂”的原創文章,轉載請通過微信公眾號(ucloud2012)聯系作者】

 戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-06-07 23:33:01

應用程序熱補丁代碼

2017-03-15 17:57:04

代碼免重啟BUG

2013-02-22 09:28:45

MEAP軟件移動應用開發HTML5

2023-12-21 08:00:00

ChatGPT人工智能大型語言模型

2009-10-19 14:14:19

OSGi Web應用

2011-07-21 16:19:30

iOS Twitter

2022-09-19 00:37:13

SaaS云計算開發

2011-06-07 09:36:41

BlackBerry 應用程序

2015-11-05 10:16:33

2024-10-10 13:30:00

2013-02-21 14:14:40

開發Tizen

2018-09-18 09:30:17

微信熱補丁Android

2019-01-16 10:33:41

Linux

2010-01-18 17:32:03

2025-08-27 08:12:21

2012-05-04 08:28:10

2021-05-17 07:45:06

Linux系統程序

2013-11-19 15:35:01

2017-12-10 14:13:14

云服務云原生應用程序

2010-02-05 18:21:24

Android應用程序
點贊
收藏

51CTO技術棧公眾號

美女视频黄久久| 波多野结衣在线观看一区二区三区 | 欧美黄色录像| 91福利社在线观看| 日本道在线视频| 午夜性色福利视频| 精品一区二区三区在线播放 | 欧美黄色网页| 亚洲三级在线免费观看| 国产日本一区二区三区| 中文av免费观看| 亚洲午夜黄色| 精品精品国产国产自在线| 少妇精品无码一区二区三区| 视频精品导航| 丁香五六月婷婷久久激情| 亚洲精品中文字幕乱码三区不卡| 亚洲精品国产精| 热久久久久久久| 97超级碰碰碰久久久| 久久av红桃一区二区禁漫| 丝袜av一区| 日韩午夜激情视频| 成人性做爰aaa片免费看不忠| 羞羞的视频在线看| 中文字幕二三区不卡| 久久国产精品一区二区三区四区| 国产视频www| 久热精品视频| 97av在线影院| 日韩精品人妻中文字幕| 欧美精品网站| 久久精品国产91精品亚洲| 免费在线观看污| 美女av一区| 欧美不卡激情三级在线观看| 成年人三级黄色片| 香蕉成人影院| 欧美日在线观看| 久久在线中文字幕| 青春草免费在线视频| 专区另类欧美日韩| 在线观看日本一区| 尤物网在线观看| 欧美国产1区2区| 欧美最大成人综合网| 三级av在线| 97精品久久久午夜一区二区三区| 国产麻豆日韩| 狠狠综合久久av一区二区| 国产精品18久久久久久久久久久久| 国产精品视频区| 中文字幕免费观看视频| 日韩一区欧美二区| 国产精品电影在线观看| 婷婷激情五月综合| 日韩不卡一二三区| 成人国产在线视频| 国产精品无码专区av免费播放| 免费成人av在线| 国产美女精品视频免费观看| 一区二区三区亚洲视频| 看片网站欧美日韩| 亚洲一区二区三区久久 | 亚洲人成电影在线观看天堂色| 久久久久国产精品区片区无码| 秋霞蜜臀av久久电影网免费| 亚洲另类欧美自拍| x88av在线| 日韩欧美高清在线播放| 久久精品欧美视频| 免费看一级一片| 国产欧美欧美| 国产精品白嫩美女在线观看 | 亚洲国产精品影视| 亚洲电影视频在线| 精品久久久一区| 不卡av免费在线| 99re8精品视频在线观看| 日韩精品一区二区三区中文不卡| 北京富婆泄欲对白| 精品国产美女| 欧美理论片在线观看| 日韩乱码在线观看| 七七婷婷婷婷精品国产| 91福利入口| 欧美扣逼视频| 亚洲天堂精品视频| 黑人糟蹋人妻hd中文字幕| 99re久久| 亚洲成成品网站| 中文字幕 自拍| 综合av在线| 热草久综合在线| 国产日产亚洲系列最新| 99久久精品久久久久久清纯| 亚洲免费精品视频| av影视在线看| 欧美区在线观看| aaaaaav| 我不卡神马影院| 97人洗澡人人免费公开视频碰碰碰| 国产无遮挡又黄又爽又色视频| 国产福利一区在线| 日韩精品国内| а_天堂中文在线| 欧美精品自拍偷拍| av在线网站观看| 欧美日韩亚洲三区| 国产精品一区专区欧美日韩| 头脑特工队2在线播放| 亚洲免费av网站| 男人搞女人网站| 国产精品极品在线观看| 久久精品99久久久久久久久| 久久久久久久久久影院| 国产精品一级片在线观看| 日本三级中国三级99人妇网站| 日韩精品亚洲人成在线观看| 欧美日韩久久久久久| 波多野结衣办公室33分钟| 欧美日韩一区二区国产| 成人免费在线网址| av电影在线观看一区二区三区| 欧美日韩精品在线| 性活交片大全免费看| 日韩免费高清| 国产精品老牛影院在线观看| 亚洲三级中文字幕| 婷婷开心激情综合| 黑人巨大猛交丰满少妇| 2023国产精品久久久精品双| 国产精品久久久久一区二区| 久草视频视频在线播放| 欧美特级www| 粉嫩av懂色av蜜臀av分享| 国产精品www994| 99精品国产一区二区| 精品176二区| 91.麻豆视频| 日本裸体美女视频| 麻豆国产精品官网| 亚洲综合第一| 亚洲欧美专区| 超碰97人人做人人爱少妇| 国产熟女一区二区三区五月婷| 国产精品看片你懂得| 高清一区在线观看| 久久美女精品| 91久久国产综合久久91精品网站 | 香蕉久久夜色精品国产更新时间 | 99久久精品免费观看| 欧美 日本 亚洲| 亚洲a级精品| 国产精品久久久久久av福利软件| 韩国福利在线| 欧美日韩大陆在线| 神马午夜精品91| 国产成人超碰人人澡人人澡| 日韩网站在线免费观看| 视频福利一区| 国产精品中文在线| 岛国中文字幕在线| 精品999在线播放| 亚洲国产成人精品激情在线| 91麻豆精品在线观看| 老熟妇仑乱视频一区二区| 日韩中文字幕高清在线观看| 亚洲一区二区三区久久 | 成人有码在线视频| 污视频在线看网站| 亚洲国产天堂久久国产91| 久久国产视频一区| 国产精品美女久久久久久久久 | 国产网站一区二区| 亚洲成人天堂网| 国产一区欧美| 欧美性色黄大片人与善| 四虎成人精品一区二区免费网站| 欧美黑人巨大精品一区二区| 日本一卡二卡四卡精品| 欧美日韩激情一区二区| 久草视频在线资源站| 26uuu另类欧美亚洲曰本| 艹b视频在线观看| 国内视频精品| 水蜜桃亚洲精品| 日本在线成人| 国产精品激情自拍| 欧美黑人猛交的在线视频| 国产丝袜一区二区三区免费视频 | 久久99久久99| 日本欧美视频在线观看| 大色综合视频网站在线播放| 99久久精品无码一区二区毛片| av有声小说一区二区三区| 欧美成人免费播放| 精品久久av| 精品日韩欧美一区二区| 中文字幕在线观看视频免费| 亚洲在线视频网站| 成人做爰69片免网站| 成人高清在线视频| 福利视频999| 久久成人免费| 国产 欧美 日本| 日本a级不卡| 老司机精品福利在线观看| 福利一区三区| 国产精品成人国产乱一区| 91桃色在线观看| 欧美xxxx14xxxxx性爽| 国产1区2区3区在线| 亚洲精品理论电影| 99久久精品无免国产免费 | 黑人糟蹋人妻hd中文字幕 | 自拍偷拍一区| 成人三级在线| 经典三级久久| 国产精品揄拍500视频| 欧美成人免费电影| 91av国产在线| sm在线播放| 色综合天天综合网国产成人网| 欧美成年黄网站色视频| 在线观看欧美日韩| 国产专区在线| 亚洲男人av在线| 婷婷在线免费观看| 欧美刺激午夜性久久久久久久| 国产精品欧美激情在线| 欧美伊人久久久久久久久影院| 欧美黑人一区二区| 午夜一区二区三区在线观看| 久久精品这里只有精品| 亚洲黄一区二区三区| 污污视频网站在线免费观看| 欧美国产一区二区| 蜜桃无码一区二区三区| 国产午夜精品久久久久久免费视| 国产精品探花一区二区在线观看| 成人短视频下载| 免费黄色a级片| 成人高清在线视频| 日韩精品一区二区三区高清免费| 国产a精品视频| 影音先锋资源av| 成人福利视频在线看| 免费成人蒂法网站| 久久精品一区四区| 欧美激情久久久久久久| 国产精品视频你懂的| 国产不卡在线观看视频| 中文字幕在线不卡一区 | 亚洲大片免费看| 国产无码精品视频| 黑人巨大精品欧美一区免费视频| 免费看毛片网站| 欧美在线free| 国产又粗又猛又爽又黄的| 欧美一区二区三区人| 午夜精品一二三区| 亚洲国产美女久久久久| 日本亚洲欧美| 中文字幕欧美日韩在线| 麻豆电影在线播放| 欧美激情亚洲另类| 国产三级电影在线播放| 国产成人精品av在线| 欧美黄色a视频| 国产精品v欧美精品∨日韩| 亚洲va久久久噜噜噜久久| 视频在线99re| 国产精品红桃| 午夜精品在线免费观看| 国产在线不卡一区| 中文字幕在线永久| 亚洲国产成人在线| 九九免费精品视频| 色综合久久中文综合久久牛| 亚洲影视一区二区| 精品福利视频一区二区三区| 激情小视频在线观看| 亚洲一区黄色| 国产精品高潮粉嫩av| 国产成人免费视频网站视频社区| 国产高清精品一区二区| 红桃成人av在线播放| 9色视频在线观看| 美女精品网站| 中国男女全黄大片| 国产日产欧产精品推荐色| 亚洲欧美小视频| 欧美日韩亚洲精品内裤| 国产精品亚洲lv粉色| 亚洲免费视频网站| 里番在线播放| 国产日产亚洲精品| 亚洲伊人春色| 免费的av在线| 日本美女一区二区三区| 中文字幕一区二区三区乱码不卡| 欧美国产精品一区二区| 日本系列第一页| 91精品国产福利在线观看| 精品无吗乱吗av国产爱色| 欧美裸体男粗大视频在线观看| 亚洲www.| 九九九九九精品| 中文字幕一区二区av| 国产福利影院在线观看| 三区四区在线视频| 久久久女女女女999久久| 另类一区二区三区| 久久资源亚洲| 黄色精品免费| 北条麻妃亚洲一区| 欧美激情中文不卡| 亚洲天堂男人av| 亚洲国产高清高潮精品美女| 亚洲第一图区| 亚洲aa中文字幕| 色喇叭免费久久综合网| 成人羞羞国产免费网站| 91在线视频免费观看| 久久久久久久9999| 欧美成人综合网站| 国产高清一区二区三区视频 | 最近中文字幕2019免费| 小草在线视频免费播放| 激情视频在线观看一区二区三区| 午夜欧美精品久久久久久久| 91高清国产视频| 国产精品人成在线观看免费 | 日韩一本精品| 久久青草久久| 成人免费毛片糖心| 一本色道久久综合亚洲aⅴ蜜桃| 午夜视频福利在线观看| 国产69精品久久久| 欧美日韩麻豆| 国产aaa一级片| 久久精品一二三| 日韩国产亚洲欧美| 中文字幕亚洲二区| 欧美午夜三级| 亚洲一卡二卡区| 精品一区二区国语对白| 久久国产美女视频| 日韩一区二区三区高清免费看看 | 日韩av免费在线看| 蜜桃视频欧美| 日本肉体xxxx裸体xxx免费| 亚洲国产成人私人影院tom| 中文字幕一级片| 久久精品久久久久久| 97一区二区国产好的精华液| 国产va亚洲va在线va| 91久色porny| 中文在线字幕免费观| 日韩中文字幕欧美| 玖玖精品一区| 免费不卡av在线| 久久女同互慰一区二区三区| 少妇又紧又色又爽又刺激视频| 中文字幕国产精品| 99精品美女视频在线观看热舞| 国内精品国产三级国产99| 成人aa视频在线观看| 欧美一区二区三区不卡视频| 最近2019免费中文字幕视频三| 欧美亚洲福利| 久久久久久久久久网| 国产网站一区二区| 国产日韩在线观看一区| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美三级在线播放| av观看在线| 乱一区二区三区在线播放| 美女爽到高潮91| 国产一级在线观看视频| 亚洲欧洲av一区二区| 高清一区二区三区av| 国产免费观看高清视频| 国产精品久久久久影院| 手机在线观看毛片| 国产有码在线一区二区视频| 亚洲一级影院| 国产农村妇女精品一区| 精品国产伦一区二区三区观看方式 | 91久久精品www人人做人人爽| 日韩五码在线| 久艹在线观看视频| 亚洲欧美日韩爽爽影院| 亚洲1区在线观看| 高清av免费看| 色综合婷婷久久| 精品日韩av| 正在播放国产精品| 久久蜜桃香蕉精品一区二区三区|