青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天秤座的唐風(fēng)

總會(huì)有一個(gè)人需要你的分享~!- 唐風(fēng) -

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  13 隨筆 :: 0 文章 :: 69 評(píng)論 :: 0 Trackbacks

前幾天和柯柯交流一個(gè)小問題,說是如何在一個(gè)函數(shù)內(nèi)得到調(diào)用該函數(shù)的函數(shù)地址。有點(diǎn)拗口,就是說如果有一個(gè)函數(shù)A(當(dāng)然我們?cè)谶@個(gè)問題中并不知道它是哪個(gè)函數(shù))調(diào)用了B函數(shù),現(xiàn)在希望用個(gè)什么辦法得到A函數(shù)的地址。  

我首先聯(lián)想到的是,一般調(diào)試器都能給出嵌套的函數(shù)調(diào)用關(guān)系。那么肯定是有什么辦法解決這個(gè)問題。上網(wǎng)查了一通之后只找到一些debug用的API和一些開發(fā)環(huán)境提供的調(diào)整宏等等,感覺不是很適用。后來想想,函數(shù)調(diào)用都涉及到“函數(shù)調(diào)用棧”(call stack),也許這里可以得到些什么信息。隱約回想起以前匯編課里老師講過的一些函數(shù)調(diào)用時(shí)要“壓棧”、“要保存現(xiàn)場(chǎng)”等,但已經(jīng)記得不太清楚了,于是就又上網(wǎng)找了些函數(shù)調(diào)用棧的知識(shí),發(fā)現(xiàn)了一些有意思的信息(上網(wǎng)時(shí)看到ChinaUnix上的一篇,也是轉(zhuǎn)的,原地址和作者不詳,如果你知道請(qǐng)告訴我):

  1. 一個(gè)函數(shù)調(diào)用動(dòng)作可分解為:零到多個(gè)PUSH指令(用于參數(shù)入棧),一個(gè)CALL指令。CALL指令內(nèi)部其實(shí)還暗含了一個(gè)將返回地址(即CALL指令下一條指令的地址)壓棧的動(dòng)作。
  2. 幾乎任何本地編譯器都會(huì)在每個(gè)函數(shù)體之前插入類似如下指令:PUSH EBP; MOV EBP ESP;即,在程式執(zhí)行到一個(gè)函數(shù)的真正函數(shù)體時(shí),已有以下數(shù)據(jù)順序入棧:參數(shù),返回地址,EBP。 

這里我最關(guān)心的是:函數(shù)調(diào)用時(shí),會(huì)在棧里壓入返回地址,和EBP。

因?yàn)楹瘮?shù)調(diào)用的返回地址,正是調(diào)用指令Call的下一個(gè)指令的地址,那么,有了返回地址,就可以得到Call指令的位置了。有Call指令的位置又能干什么呢?幸好匯編課里的知識(shí)還記得一點(diǎn)點(diǎn):Call指令就是一個(gè)跳轉(zhuǎn)指令,它可以讓IP(instruction point[Thanks to RednaxelaFX])指向要跳轉(zhuǎn)的指令的地址,從那里開始執(zhí)行。對(duì)于函數(shù)調(diào)用來說,就是讓IP指向被調(diào)用的函數(shù)的地址。Call指令的操作數(shù)其實(shí)和被調(diào)用函數(shù)的地址有非常重要的關(guān)系。有了Call指令的操作數(shù),就可以計(jì)算出被調(diào)用函數(shù)的地址。

但僅僅有這個(gè)還不夠,比如,A調(diào)用了B,那么在A函數(shù)中肯定有一個(gè)Call指令,但這個(gè)Call指令中的操作數(shù)是和B函數(shù)地址相關(guān)的,與A的函數(shù)地址直接關(guān)系不大(至少在沒有其它信息的情況下,不能計(jì)算出A的地址)。而我們要得到的卻是A函數(shù)的地址。所以,得向上再找一層,找到調(diào)用A函數(shù)的地方,那個(gè)地方的Call指令里的操作數(shù)才和A函數(shù)地址有關(guān)。也就是說,Z函數(shù)調(diào)用了A函數(shù),A函數(shù)調(diào)用了B函數(shù)。現(xiàn)在要得到A函數(shù)的地址,我們得在Z函數(shù)里找Call指令的操作數(shù)。這時(shí)候EBP就派上用場(chǎng)了。本地編譯器在每個(gè)函數(shù)體之前插入的指令(PUSH EBP; MOV EBP ESP)構(gòu)造了一個(gè)巧妙的結(jié)構(gòu),使得我們可以順著函數(shù)調(diào)用棧一層一層向上,找到所有調(diào)用關(guān)系。

如何向上查找呢?我們看看函數(shù)調(diào)用時(shí)棧、EBP的值的情況就知道了。

假設(shè)現(xiàn)在函數(shù)在正Z函數(shù)內(nèi)執(zhí)行,那么此時(shí)棧和EBP的值可能是像下圖這樣的:

我們先不管現(xiàn)在EBP指向的內(nèi)存(0x000f)中的內(nèi)容XXX是什么(要不然會(huì)是雞生蛋生雞的問題),總之目前在棧中的著色塊中的內(nèi)容是屬于函數(shù)Z的參數(shù),Z執(zhí)行結(jié)束后應(yīng)該返回的地址以及Z函數(shù)的局部變量值。

現(xiàn)在Z函數(shù)調(diào)用A函數(shù),會(huì)先將傳給A的參數(shù)壓棧,然后將現(xiàn)在這個(gè)指令(就是"Call A"啦)的下一個(gè)指令的地址壓入棧中,以便A函數(shù)完后返回到Z中繼續(xù)執(zhí)行。然后進(jìn)入A函數(shù)的內(nèi)存空間,首先就是調(diào)用PUSH EBP,也就是將Z的EPB的內(nèi)容(地址0x000f)壓入棧中,然后再M(fèi)OV EBP ESP,讓EBP有一個(gè)新的棧頂(此時(shí)棧頂中的內(nèi)容不就是Z函數(shù)時(shí)EBP的內(nèi)容么?),然后再將A函數(shù)的局部變量壓入棧中,開始執(zhí)行A函數(shù)的代碼。這時(shí),棧和EBP的情況就像如圖所示了: 

哈,這樣就很清楚了,原來現(xiàn)在的EBP中的內(nèi)容,正是上一級(jí)函數(shù)的EBP中的內(nèi)容。而每一個(gè)函數(shù)的EBP指向的位置,向棧頂可以得到該函數(shù)的局部變量,向棧底可以得到函數(shù)的返回地址和參數(shù)。于是我們就可以根據(jù)這個(gè)結(jié)構(gòu)層層向上,找到任何一層我們想找的函數(shù)EBP,從而也就能得到相應(yīng)的返回地址了。  

好,從B函數(shù)中得到Z函數(shù)對(duì)A函數(shù)調(diào)用點(diǎn)的返回地址的問題也就解決了。現(xiàn)在就是處理Call指令的問題了。

我在Visual Studio 2003的Debug版中進(jìn)行反匯編調(diào)試,發(fā)現(xiàn)Call指令對(duì)應(yīng)的機(jī)器指令都是5個(gè)byte,第一個(gè)byte(E8)是指令的器碼,猜想后面4個(gè)byte應(yīng)該就是它的轉(zhuǎn)移的目標(biāo)地址了。結(jié)果按這個(gè)地址去找,發(fā)現(xiàn)根本不對(duì),想想?yún)R編也忘得差不多了,于是又去找了教程看看,才記起原來Call的操作數(shù)并不是絕對(duì)地址,而是偏移地址(跳轉(zhuǎn)目標(biāo)地址-Call指令地址-sizeof(Call指令)),這樣就好辦了,我有返回地址,于是就有了向上5個(gè)byte就是Call的地址,再從這個(gè)地址中取出Call指令機(jī)器碼的后四個(gè)字節(jié),加上返回地址,就得到了目標(biāo)地址。

原以為已經(jīng)搞定了。不過還有一個(gè)小插曲,就是在VS的Debug版中,Call并不直接跳到一函數(shù)中去(不知道為什么),而是跳到一塊代碼區(qū),這塊區(qū)域內(nèi)排布了很多的Jmp指令用于各種跳轉(zhuǎn)(不知道為什么這么搞,也許是為調(diào)試的功能而設(shè)計(jì)的吧,誰知道?還請(qǐng)不吝賜教),不過沒關(guān)系,也就是多走一點(diǎn)路而已,Jmp指令的操作數(shù)和Call指令的意義是一樣的,最終Jmp是跳到函數(shù)代碼塊中去的。于是也就得到了想要的結(jié)果。

  

下面是代碼:

 1#include "stdafx.h"
 2
 3#include <string>
 4
 5unsigned int GetCallerAddress(void)
 6{
 7    unsigned int _ebp;
 8    __asm mov _ebp, ebp
 9
10    for (int i=2; i != 0--i) {
11        _ebp = *(unsigned int *)(_ebp);
12    }

13    unsigned int* ipAddress = (unsigned int*)(*(unsigned int *)(_ebp + 4));
14
15    ipAddress = (unsigned int*)((unsigned char *)ipAddress - 5);
16    unsigned int callInstructAddress = (unsigned int)ipAddress;
17    ipAddress = (unsigned int*)((unsigned char *)ipAddress + 1);
18    int funcAddrOffset = *ipAddress;
19    unsigned int *jumAddr = (unsigned int*)(callInstructAddress + funcAddrOffset + 5); 
20    callInstructAddress = (unsigned int)jumAddr;
21    jumAddr = (unsigned int*)((unsigned char *)jumAddr + 1);
22    funcAddrOffset = *jumAddr;
23    
24    return funcAddrOffset + callInstructAddress + 5;    
25}

26
27void fun1();
28
29void fun2()
30{
31    fun1();
32}

33
34void fun3()
35{
36    fun1();
37}

38
39
40void fun1()
41{
42    unsigned int _ebp;
43    __asm mov _ebp, ebp // 取當(dāng)前EBP
44    unsigned int _preEbp = *(unsigned int *)(_ebp);   //得到上層函數(shù)的EBP
45    unsigned int* ipAddress = (unsigned int*)(*(unsigned int *)(_preEbp + 4)); // 取得返回地址
46    ipAddress = (unsigned int*)((unsigned char *)ipAddress - 5); // 得到Call指令地址  
47    unsigned int callInstructAddress = (unsigned int)ipAddress;     // 保存Call指令地址  
48    ipAddress = (unsigned int*)((unsigned char *)ipAddress + 1); 
49    int funcAddrOffset = *ipAddress; // 得到Call指令操作數(shù)
50    unsigned int *jumAddr = (unsigned int*)(callInstructAddress + funcAddrOffset + 5); // 找到Jmp指令
51    callInstructAddress = (unsigned int)jumAddr; // 保存jmp指令地址
52    jumAddr = (unsigned int*)((unsigned char *)jumAddr + 1); 
53    funcAddrOffset = *jumAddr; // 得到j(luò)mp指令操作數(shù)
54    unsigned int addr = funcAddrOffset + callInstructAddress + 5//得到函數(shù)地址
55
56    // 或者:unsigned int addr = GetCallerAddress();
57    printf("fun1 said : Caller Addres is 0x%08x\n", addr);
58}

59
60int _tmain(int argc, _TCHAR* argv[])
61{
62    fun1();
63    fun2();
64    fun3();
65
66    return 0;
67}

68
69


PS:后經(jīng)柯柯驗(yàn)證,只有VC6、2003、2008的Debug版里才有效。Release版中不行,具體原因未細(xì)查(沒時(shí)間,畢竟不是"正務(wù)",呵呵)。以后再遇到時(shí)再細(xì)究吧。至少,現(xiàn)在對(duì)函數(shù)調(diào)用棧有了一些新的認(rèn)識(shí)。很開心,呵呵呵。  

 

后記: 

  這兩天翻看《Windows95編程大奧秘》(候捷譯)中,作者在分析PE格式的時(shí)候提到了,Call指令并不直接將程序控制轉(zhuǎn)到目標(biāo)函數(shù),而是轉(zhuǎn)入一個(gè)Jmp的代碼塊中,由Jmp來最終將控制權(quán)交給函數(shù)。為什么這么做呢?作者給出的結(jié)論是這樣做可以使得載入器的行為變得簡(jiǎn)單。因?yàn)镴mp的操作數(shù)是存放在idata區(qū)的一個(gè)“變量”,載入器只需要將被調(diào)用的DLL的地址一次寫入這個(gè)“變量”中就可以了。如果不這么做,那么需要在每個(gè)Call指令中的位置對(duì)函數(shù)地址進(jìn)行Fixup,這樣會(huì)有更多的工作量。 

  OK,你不要笑話我說還看Win95的書哦。是的,我承認(rèn)我不知道上面這段話中內(nèi)容在現(xiàn)在的XP或是Vista或是2000中是否依然有效(因?yàn)槲覜]有去驗(yàn)證過),但我看到了解決的方向。另外,這本書真的像候捷先生所說,“仍然極具技術(shù)價(jià)值”。我很認(rèn)同! 

  鑒于RednaxelaFX的提示和本書給的信息,我下一步將償試從PE文件來找這個(gè)問題的解決之道,并順帶學(xué)習(xí)一下PE格式。讀完《Win95》后,也可能會(huì)寫篇讀后感,敬請(qǐng)留意,嘿嘿。

  

posted on 2009-06-09 20:38 唐風(fēng) 閱讀(4445) 評(píng)論(7)  編輯 收藏 引用 所屬分類: 調(diào)試技術(shù)與逆向工程

評(píng)論

# re: 函數(shù)調(diào)用棧初探 2009-11-15 03:33 OwnWaterloo
調(diào)試器需要符號(hào)表。

  回復(fù)  更多評(píng)論
  

# re: 函數(shù)調(diào)用棧初探 2009-11-21 17:39 唐風(fēng)
@OwnWaterloo
調(diào)試器沒有符號(hào)表的情況下應(yīng)該也能工作,但給出來的信息是“人類不可讀”的。

一直在找一種方法,希望能實(shí)現(xiàn)這樣的需求:
給出兩個(gè)斷點(diǎn),當(dāng)程序停在第二個(gè)斷點(diǎn)的時(shí)候,希望得到在之期間被調(diào)用過的函數(shù)的列表(按時(shí)間順序)。
當(dāng)然,希望這個(gè)方法是非侵入性的。
棧信息顯然是不夠的,某一時(shí)刻的棧信息只有被斷點(diǎn)函數(shù)的上層函數(shù)信息,但可以肯定的是每個(gè)函數(shù)調(diào)用都會(huì)有壓棧出棧,能不能設(shè)置一個(gè)類似“勾子”的東西,在CPU進(jìn)行壓棧的時(shí)候記錄下某些信息呢?

  回復(fù)  更多評(píng)論
  

# re: 函數(shù)調(diào)用棧初探 2009-11-21 17:55 OwnWaterloo
@唐風(fēng)

但可以肯定的是每個(gè)函數(shù)調(diào)用都會(huì)有壓棧出棧

問題就在于這個(gè)前提是沒有保證的。
編譯器處理尾調(diào)用時(shí)可以使用jmp而不用call。
這種情況在msvc和gcc上都存在。

編譯器不一定會(huì)生成序言部分 —— push ebp mov ebp esp。
msvc肯定有這種情況,我見過。
gcc好像會(huì)嚴(yán)格生成這部分代碼。



vs2005 team suit好像有這個(gè)功能。 在性能測(cè)試中。 但沒這么靈活……
好像只能在程序跑完之后才能輸出分析的結(jié)果,不能任意兩個(gè)斷點(diǎn)之間。
輸出結(jié)果中記得是包含了調(diào)用樹的。
可以玩玩看,也許有輸出2個(gè)斷點(diǎn)之間的調(diào)用樹呢?

  回復(fù)  更多評(píng)論
  

# re: 函數(shù)調(diào)用棧初探 2009-11-21 17:56 OwnWaterloo
@唐風(fēng)

能不能設(shè)置一個(gè)類似“勾子”的東西,在CPU進(jìn)行壓棧的時(shí)候記錄下某些信息呢?

這個(gè)就不知道了……
查查vs的那個(gè)性能測(cè)試是怎么做到的? 也是非侵入的。
或者其他profile工具是怎么做的?

  回復(fù)  更多評(píng)論
  

# re: 函數(shù)調(diào)用棧初探 2009-11-22 12:54 唐風(fēng)
>>問題就在于這個(gè)前提是沒有保證的。編譯器處理尾調(diào)用時(shí)可以使用jmp而不用call。這種情況在msvc和gcc上都存在。
哦哦,原來還有這種情況,呃,如果是在 debug 模式下,優(yōu)化全關(guān)呢?嗯,找個(gè)時(shí)間我再也看看。

>>或者其他profile工具是怎么做的?
這倒是,以前沒想到這個(gè)可以做參考呢,嗯,謝謝提醒。


真是獨(dú)學(xué)而無友,則孤陋而寡聞。

PS:
一連兩天看到你搶占沙發(fā)長(zhǎng)篇回復(fù),果然是神人啊……
什么時(shí)候我夠格能和你“論戰(zhàn)”一番而后雙方受益,倒是可以“含笑九泉”了,:)

學(xué)習(xí)中……

  回復(fù)  更多評(píng)論
  

# re: 函數(shù)調(diào)用棧初探 2009-11-27 02:29 OwnWaterloo
你本來寫的是【quote】吧? cnblogs確實(shí)很偏心,cppblog確實(shí)是穿小鞋的……

說正題……
這里的評(píng)論里可能有你感興趣的內(nèi)容:
http://www.cnblogs.com/JeffreyZhao/archive/2009/11/17/linker-loader-library-correction-about-call-stack.html#1704232

關(guān)于push ebp,frame pointer,call-stack,debugging等。

有點(diǎn)長(zhǎng)哦,一直往下看。
哈哈,評(píng)論的主角就是這篇文章中提到的RednaxelaFX。
應(yīng)該是同一個(gè)人吧?
  回復(fù)  更多評(píng)論
  

# re: 函數(shù)調(diào)用棧初探 2009-11-27 19:49 唐風(fēng)
謝謝你的提醒啊~!
呵呵,這兩天跑去看 WinDbg 的擴(kuò)展命令去了,企圖看能不能通過寫 WinDbg 的擴(kuò)展來達(dá)到目的……有點(diǎn)頭大的說,哈哈。

RednaxelaFX 這個(gè)“家伙”也是個(gè)神人,我在 JavaEye 上第一次發(fā)表這篇文章的時(shí)候就有他的回復(fù),相信是同一個(gè)人,嘿嘿。(他在 JavaEye 上有關(guān)于 JavaScript 運(yùn)行機(jī)制的文章,看得出是很有幾把刷子的)

跑來跑去,發(fā)現(xiàn)世界挺大,圈子確挺小,哈哈哈哈 :P

嗯嗯,是夠長(zhǎng)的,明天早起好好看,嘿嘿!!

PS:
>>你本來寫的是【quote】吧? cnblogs確實(shí)很偏心,cppblog確實(shí)是穿小鞋的……
確實(shí)是的,唉……
這段時(shí)間在通過 CSS 和 JS 腳本在配置 cnblogs 的博客,已經(jīng)比較滿意了,嘿嘿。  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线亚洲精品| 亚洲人成网在线播放| 亚洲综合激情| 亚洲网站在线播放| 国产日韩欧美成人| 久久久久久高潮国产精品视| 久久狠狠一本精品综合网| 黄色免费成人| 亚洲激情在线观看| 欧美午夜三级| 久久九九国产精品| 欧美不卡在线视频| 亚洲欧美日韩精品综合在线观看 | 亚洲三级免费| 在线综合视频| 在线观看的日韩av| 亚洲欧洲在线视频| 国产农村妇女精品| 欧美成人首页| 国产精品久久久久999| 久久精品综合网| 毛片一区二区| 夜夜嗨一区二区| 又紧又大又爽精品一区二区| 亚洲黄色视屏| 国产在线拍揄自揄视频不卡99| 亚洲国产日韩一区| 国产一区二区精品| 亚洲毛片一区| 国外成人网址| 一区二区三区黄色| 亚洲国产欧美精品| 欧美亚洲免费| aa级大片欧美| 久久久久久国产精品一区| 亚洲淫性视频| 欧美激情日韩| 欧美成年人在线观看| 国产乱子伦一区二区三区国色天香| 欧美韩日一区| 国产亚洲va综合人人澡精品| 亚洲国内在线| 亚洲黄色视屏| 久久久久久亚洲综合影院红桃| 亚洲在线视频| 欧美成人亚洲成人| 美腿丝袜亚洲色图| 国产日韩欧美精品| 亚洲视频狠狠| 亚洲一区在线播放| 欧美三级午夜理伦三级中文幕| 欧美二区视频| 亚洲国产欧美另类丝袜| 亚洲欧美一区二区视频| 在线亚洲欧美视频| 欧美日韩高清在线播放| 你懂的国产精品| 在线电影欧美日韩一区二区私密| 亚洲免费在线精品一区| 中文在线资源观看视频网站免费不卡| 欧美大片一区二区| 亚洲国产影院| 夜夜狂射影院欧美极品| 美女视频黄 久久| 欧美国产日韩亚洲一区| 亚洲国产精品小视频| 麻豆freexxxx性91精品| 欧美成人tv| 亚洲国产视频直播| 欧美高清在线| 夜夜嗨av色综合久久久综合网| 亚洲激情国产精品| 免费观看在线综合| 亚洲黑丝在线| 夜夜嗨一区二区三区| 欧美日韩亚洲三区| 99国产精品视频免费观看| 一本久久精品一区二区| 欧美日韩美女| 亚洲一区亚洲二区| 欧美资源在线| 在线高清一区| 欧美激情一区二区三区蜜桃视频| 欧美激情第8页| 亚洲色在线视频| 国产精品另类一区| 亚洲一区二区三区午夜| 久久久999国产| 国产一区二区成人| 国产午夜精品在线观看| 亚洲国产精品黑人久久久| 亚洲精品国精品久久99热一| 欧美精品黄色| 亚洲一区二区日本| 久久久噜噜噜久久人人看| 亚洲人屁股眼子交8| 欧美日韩综合在线免费观看| 欧美一区二区三区播放老司机| 欧美成人免费在线观看| 亚洲女优在线| 一区在线播放| 欧美日韩国产在线播放网站| 亚洲欧美99| 亚洲激情视频在线| 午夜在线a亚洲v天堂网2018| 亚洲国产一区在线观看| 国产精品v片在线观看不卡 | 夜色激情一区二区| 精东粉嫩av免费一区二区三区| 欧美黄色免费网站| 欧美呦呦网站| 99国产精品久久久| 欧美wwwwww| 久久成年人视频| 亚洲激情成人网| 国精品一区二区| 国产精品美女一区二区| 欧美成人dvd在线视频| 亚洲免费在线播放| 99精品欧美一区| 亚洲电影免费观看高清| 欧美亚洲在线视频| 亚洲欧洲精品成人久久奇米网| 国产人成一区二区三区影院| 欧美成人亚洲成人| 久久资源在线| 欧美一二三视频| 一区二区三区四区五区视频| 欧美激情aⅴ一区二区三区| 亚洲欧美国产高清va在线播| 亚洲精选中文字幕| 韩日成人av| 国产九九视频一区二区三区| 欧美日韩在线不卡| 欧美成人第一页| 久久人人爽人人爽| 亚洲一区成人| 亚洲精品中文字幕女同| 亚洲国产精品专区久久| 亚洲国产1区| 91久久午夜| 欧美国产一区二区| 久久国产主播| 欧美在线免费看| 性欧美长视频| 久久成人综合视频| 久久久精品动漫| 午夜在线a亚洲v天堂网2018| 香蕉精品999视频一区二区 | 欧美黄色免费| 欧美黄色aaaa| 欧美四级电影网站| 欧美视频四区| 国产精品五月天| 国内精品久久久久久影视8| 国产一区二区视频在线观看| 国产一区二区三区在线观看免费| 国产一区二区三区精品久久久| 国内精品视频666| 亚洲区第一页| 亚洲精品欧美专区| 日韩视频精品在线| 亚洲在线一区二区| 久久国产精彩视频| 99视频精品全国免费| 欧美日韩蜜桃| 国产精品永久免费观看| 激情av一区二区| 日韩天堂av| 性欧美办公室18xxxxhd| 美国成人直播| 最新高清无码专区| 一区二区三区国产| 欧美一区二区成人| 欧美精品v国产精品v日韩精品| 欧美日韩亚洲一区| 国产日韩精品电影| 亚洲大片在线观看| 亚洲综合清纯丝袜自拍| 蜜桃av一区二区三区| 一区二区三区高清不卡| 欧美一区二区三区精品| 欧美sm视频| 国产欧美日韩麻豆91| 日韩一级精品视频在线观看| 久久av在线| 亚洲经典自拍| 性刺激综合网| 欧美日韩色综合| 1769国产精品| 欧美一区网站| 亚洲老板91色精品久久| 久久久欧美精品sm网站| 国产精品久久久久久一区二区三区| 国产一区二区观看| 亚洲午夜一区二区三区| 欧美1区2区3区| 亚洲已满18点击进入久久| 免费不卡在线视频| 国产婷婷色一区二区三区在线 |