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

沒畫完的畫

喂馬 劈柴 BBQ~
posts - 37, comments - 55, trackbacks - 0, articles - 0
  C++博客 ::  :: 新隨筆 :: 聯系 :: 聚合  :: 管理
總是試圖想把想表達的東西表達清楚,但總是發現表達的不夠清楚

 

_BEGIN(廢話

一直很奇怪為什么VC中,要把堆棧的內容全初始化為 0xCC

今天才突然想起其中的原因,

原來 0xCC 翻譯成匯編代碼就是  int3 ;(斷點)

[指今執行越界]時,就會產生中斷

證實方法: 可以在程序中加上 _asm int3

然后設置斷點,查看指令的地址,再查看地址的內存,你會發現是 0xCC

_END(廢話)

 

1集,第2集說過的東西,由于記性衰退的緣故,已經忘記了!!!!!!!!

 

為了更簡單,把代碼進行改動,把第1集中的代碼作了刪減,

Make it sample!!!!!

Make it sample!!

Make it sample!

一切為了弄懂 Win32 中函數調用做了什么.

 

void func1(int input1, int input2)
{
    int i, j;
    char c;
   
    i = input1;
    j = input2;
    c = 0;
}
int main()
{
    int i, j;
    i=2;
    j=3;
   
    func1(i,j);
    return 0;
}

 

讓一切回到調用 func1() 函數這前

 

_BEGIN(廢話

本文所列出的 004010XX 地址,會因為機器的配置不同而有所差異,

請不要太在意

_END(廢話)

------------------------------------------------------------

13:       i=2;                                                    <--- 很黃很暴力的斷點在此
00401078   mov         dword ptr [ebp-4],2
14:       j=3;
0040107F   mov         dword ptr [ebp-8],3
15:
16:       func1(i,j);
00401086   mov         eax,dword ptr [ebp-8]
00401089   push        eax
0040108A   mov         ecx,dword ptr [ebp-4]
0040108D   push        ecx
0040108E   call        @ILT+0(func1) (00401005)
00401093   add         esp,8

------------------------------------------------------------

此時寄存器的狀態

 EAX = CCCCCCCC EBX = 7FFDE000 ECX = 00000000
 EDX = 00370D78 ESI = 00000000 EDI = 0012FF80
 EIP = 00401078 ESP = 0012FF2C EBP = 0012FF80
 EFL = 00000212

------------------------------------------------------------

內存的內容

0012FF6B  CC CC CC CC CC CC CC  燙燙燙.
0012FF72  CC CC CC CC CC CC CC 
燙燙燙.
0012FF79  CC CC CC CC CC CC CC 
燙燙燙.
0012FF80  C0 FF 12 00 E9 11 40  ......@
0012FF87  00 01 00 00 00 00 0D  .......
0012FF8E  37 00 78 0D 37 00 00  7.x.7..

 

_BEGIN(廢話)

注:像 CC 表示一個字節的內容,一行共 7 個字節

_END(廢話)

------------------------------------------------------------

函數內聲明的變量,需要一塊空間去保存它們,

這塊空間,是以 ebp寄存器 指向的地址 的一塊內存空間,

請看證據~

 

14:       i=2;
00401078   mov         dword ptr [ebp-4],2   <--- i
存放在 ebp寄存器 指向的地址 減去4 的地方

15:       j=3;
0040107F   mov         dword ptr [ebp-8],3   <--- j 存放在 ebp寄存器 指向的地址 減去8 的地方,

                                                                   因為i 占用了 4個字節, 所以 4 + 4 = 8

 

所以不難想象出下面這個圖

               |   ……   |

0012FF80: |--------|     <---  [ebp]寄存器里 存放著 0012FF80

               |           |

0012FF7C: |--------|    

               |           |

0012FF78: |--------|

               |           |

               |--------|

               |           |

               |--------|

 

按了下 F10

14:       i=2;
00401078   mov         dword ptr [ebp-4],2
15:       j=3;                                                  <---
斷點來到這兒了
0040107F   mov         dword ptr [ebp-8],3

寄存器變化

-----------------------------------------------------------

EAX = CCCCCCCC EBX = 7FFD9000 ECX = 00000000
EDX = 00370F58 ESI = 00000000 EDI = 0012FF80
EIP = 0040107F ESP = 0012FF2C EBP = 0012FF80
EFL = 00000212
-----------------------------------------------------------

內存的變化

-----------------------------------------------------------

0012FF72  CC CC CC CC CC CC CC  燙燙燙.
0012FF79  CC CC CC 02 00 00 00 
.....
0012FF80  C0 FF 12 00 D9 12 40  ......@

-----------------------------------------------------------

_BEGIN(廢話)

注:在VC中,執行一條指令后,寄存器的值或內存的值有變化,變化的部份會顯示為紅色

_END(廢話)

 

再下 F10

寄存器變化

-----------------------------------------------------------

EAX = CCCCCCCC EBX = 7FFD9000 ECX = 00000000
EDX = 00370F58 ESI = 00000000 EDI = 0012FF80
EIP = 00401086 ESP = 0012FF2C EBP = 0012FF80
EFL = 00000212
-----------------------------------------------------------

內存的變化

-----------------------------------------------------------

0012FF72  CC CC CC CC CC CC 03  燙燙燙.
0012FF79  00 00 00 02 00 00 00  .......
0012FF80  C0 FF 12 00 D9 12 40  ......@

-----------------------------------------------------------

 

再想象一下

               |   ……   |

0012FF80: |--------|     <---  [ebp]寄存器里 存放著 0012FF80

               |           |

0012FF7C: |--------|    

               |    2     |      <--- 存放著 i

0012FF78: |--------|

               |    3     |      <--- 存放著 j

               |--------|

               |           |

               |--------|

 

 

調用 func1() 函數前需要做什么? 看下編譯器編譯后的匯編就知道了~

17:       func1(i,j);
00401086   mov         eax,dword ptr [ebp-8]        <----
斷點在此
00401089   push        eax
0040108A   mov         ecx,dword ptr [ebp-4]
0040108D   push        ecx
0040108E   call        @ILT+0(func1) (00401005)
00401093   add         esp,8

地址 0x00401086  地址 0x00401093 的指令,

做的事情就是 把調用 func1() 函數時所需要的參數分別入棧,push

 

00401086   mov         eax,dword ptr [ebp-8]            <--- 看回前面 j = 3; 就知道 這里 j 是先入棧的
00401089   push        eax
0040108A   mov         ecx,dword ptr [ebp-4]
0040108D   push        ecx

 

為什么讓 j 先入棧,i j 可愛多了~

因為參數入棧的順序是有規定的!

 

修飾函數參數的入棧順序的關鍵字有

1. __cdecl    

   C/C++MFC默認的約定    

   參數從右至左順序入棧 并且由[調用者]負責把參數 pop 堆棧  

 

2. __stdcall

    WIN API 采用的約定

    參數從右至左順序入棧,被調用的函數在返回前清理堆棧的的內容,所以函數的參數個數需要是固定個數                            

 

3. __fastcall  

   用于對性能要求非常高的場合

   參數從左邊開始的兩個不大于4字節(DWORD)的參數分別放在ECXEDX寄存器,

   其余的參數仍舊自右身左壓棧,被調用的函數在返回前負責清理傳送參數的堆棧

 

MSDN有云:

Keyword

Stack cleanup

Parameter passing

__cdecl

Caller

Pushes parameters on the stack, in reverse order (right to left)

__stdcall

Callee

Pushes parameters on the stack, in reverse order (right to left)

__fastcall

Callee

Stored in registers, then pushed on stack

thiscall
(not a keyword)

Callee

Pushed on stack; this pointer stored in ECX

 

 

Obsolete Calling Conventions

Microsoft Specific

The __pascal, __fortran, and __syscall calling conventions are no longer supported. You can emulate their functionality by using one of the supported calling conventions and appropriate linker options.

WINDOWS.H now supports the WINAPI macro, which translates to the appropriate calling convention for the target. Use WINAPI where you previously used PASCAL or __far __pascal.

END Microsoft Specific

 

原來如此,這下明白了~

 

00401086   mov         eax,dword ptr [ebp-8]       

00401089   push        eax
0040108A   mov         ecx,dword ptr [ebp-4]
0040108D   push        ecx
0040108E   call        @ILT+0(func1) (00401005)   <----
斷點來到這里
00401093   add         esp,8
 

此時的寄存器狀態

EAX = 00000003  EBX = 7FFDF000 ECX = 00000002

EDX = 00030EA8  ESI = 00000000  EDI = 0013FF80
EIP = 0040108E ESP = 0013FF24  EBP = 0013FF80

EFL = 00000212

 

F11

它跳轉到這里

@ILT+0(?func1@@YAXHH@Z):
00401005   jmp         func1 (00401020)         <----
斷點在此

 

此時的寄存器狀態

EAX = 00000003 EBX = 7FFDF000 ECX = 00000002
EDX = 00030EA8 ESI = 00000000 EDI = 0013FF80
EIP = 00401005 ESP = 0012FF20 EBP = 0013FF80
EFL = 00000212

此時的 ESP 寄存器的值為什么變了,為什么???

 

_BEGIN(廢話)

SP(Stack Pointer)ESP 是堆棧指針寄存器,

SS(Stack Segment,堆棧段寄存器) 相配合,指向指向堆棧的位置

它存放的地址 始終 指向堆頂

當執行 push, pop 操作 SP 的值都會作相應的改變

 

不妨看下以下代碼

void main()
{
 _asm
 {
  push 0xAABBCCDD     <----
斷點在此
  pop  eax
 }
}

 

此時,寄存器狀態

EAX = CCCCCCCC EBX = 7FFD4000 ECX = 00000000
EDX = 00030EA8 ESI = 00000000 EDI = 0013FF80
EIP = 00401038 ESP = 0013FF34 EBP = 0013FF80
EFL = 00000202

 

ESP 寄存器指向的地址是棧頂的地址,0013FF34

 

0013FF10  30 FF 13 00 1F 3F 40 00 00  0....?@..
0013FF19  08 00 00 00 00 00 00 02 00  .........
0013FF22  00 00 30 2F 42 00 83 00 00  ..0/B....
0013FF2B  00 A8 1E 03 00 54 FF 13 00  .....T...
0013FF34  00 00 00 00 00 00 00 00 00  .........              <----
在此
0013FF3D  40 FD 7F CC CC CC CC CC CC  @?燙燙燙

 

執行 push 0xEEEEEEEE 后寄存器的狀態

EAX = CCCCCCCC EBX = 7FFDF000 ECX = 00000000
EDX = 00030EA8 ESI = 00000000 EDI = 0013FF80
EIP = 0040103D ESP = 0013FF30 EBP = 0013FF80
EFL = 00000202

 

內存狀態

0013FF22  00 00 30 2F 42 00 83 00 00  ..0/B....
0013FF2B  00 A8 1E 03 00 DD CC BB AA  .....
萏華
0013FF34  00 00 00 00 00 00 00 00 00  .........

 

不難看出 push 0xAABBCCDD 指令就是將

AABBCCDD 復制到 0013FF33, 0013FF32, 0013FF31, 0013FF30  這四個內存單元,每個單元一字節

并且把原來 ESP 的值 0013FF34 減去 4 得到 0013FF30

可見 棧頂 是向低地址 前進的

 

再按 F10

5:            push 0xAABBCCDD
00401038   push        0AABBCCDDh
6:            pop  eax
0040103D   pop         ax
7:        }
8:    }
0040103F   pop         edi        <---- 
斷點在此

 

此時寄存器狀態

EAX = AABBCCDD EBX = 7FFD6000 ECX = 00000000
EDX = 00030EA8 ESI = 00000000 EDI = 0013FF80
EIP =
0040103E ESP = 0013FF34 EBP = 0013FF80
EFL = 00000202 MM0 = 0000000000000000

內存

0013FF22  00 00 30 2F 42 00 83 00 00  ..0/B....
0013FF2B  00 A8 1E 03 00 DD CC BB AA  .....
萏華
0013FF34  00 00 00 00 00 00 00 00 00  .........
0013FF3D  60 FD 7F CC CC CC CC CC CC  `?
燙燙燙

 

可見, pop eax 指令做的事情,就是

0013FF33, 0013FF32, 0013FF31, 0013FF30 四個字節的內存單元 里面的內容 復制到 eax 寄存器

同時把 ESP 寄存器  4,得到 0013FF34

換句話說,ESP 寄存器 的值改變了,意味了執行過 push pop 操作

地址向低地址偏移,說明進行了 push 操作

地址向高地址偏移,說明時行了 pop  操作

_END(廢話)

 

說完廢話后,看回 call 指令

 

@ILT+0(?func1@@YAXHH@Z):
00401005   jmp         func1 (00401020)         <----
斷點在此

 

此時的寄存器狀態

EAX = 00000003 EBX = 7FFDF000 ECX = 00000002
EDX = 00030EA8 ESI = 00000000 EDI = 0013FF80
EIP = 00401005 ESP = 0012FF20 EBP = 0013FF80
EFL = 00000212

 

在執行 call 指令前的 寄存器狀態

此時的寄存器狀態

EAX = 00000003  EBX = 7FFDF000 ECX = 00000002

EDX = 00030EA8  ESI = 00000000  EDI = 0013FF80
EIP = 0040108E ESP = 0012FF24  EBP = 0013FF80

EFL = 00000212

 

很明顯,ESP 向低地址偏移了四個字節,說它 call 指令執行了 push  操作,入棧

它把什么東西入棧了????

 

看下 ESP = 0012FF20 指向的內存地址的內容先

0013FF0E  03 00 30 FF 13 00 1F 3F 40  ..0....?@
0013FF17  00 00 08 00 00 00 00 00 00  .........
0013FF20  83 10 40 00 02 00 00 00 03  ..@......
0013FF29  00 00 00 00 00 00 00 00 00  .........

 

從內存中看出, 00401083  就是剛剛 push 進去的內容了

 

再看回前面的 call 指令

18:       func1(i,j);
00401076   mov         eax,dword ptr [ebp-8]
00401079   push        eax
0040107A   mov         ecx,dword ptr [ebp-4]
0040107D   push        ecx
0040107E   call        @ILT+10(func1) (00401020)
00401093   add         esp,8                                <----
請注意,這條指令的地址

 

原來 00401093  是一個地址,

那么可以肯定地說

call        @ILT+10(func1) (00401020)  指令做的事情就是

先將 下一條指令 的地址 push 進去堆棧,然后再無條件跳轉到 (00401020) 這個地址

 

奇怪,為什么在

call 指令將 下一條指令的地址 push 進去 堆棧后,為什么不直接跳轉到 func1 (00401020)

而是 先跳轉到 00401005 呢?????

why? why?? why???

 

還是一個 @ILT+0(?func1@@YAXHH@Z) 的東東是什么?

 

DEBUG版本中,VC匯編程序會產生一個函數跳轉指令表,
該表的每個表項存放一個函數的跳轉指令。
程序中的函數調用就是利用這個表來實現跳轉到相應函數的入口地址。

ILT就是函數跳轉指令表的名稱,是Import Lookup Table的縮寫;
@ILT
就是函數跳轉指令表的首地址。
DEBUG版本中增加函數跳轉指令表,其目的是加快編譯速度,當某函數的地址發生變化時,只需要修改ILT相應表項即可,而不需要修改該函數的每一處引用。
注意:在RELEASE版本中,不會生成ILT,也就是說call指令的操作數直接是函數的入口地址,例如在本例中是這樣的:call 00401020

 

經過千親萬苦,終于進入 func1() 函數了

 

1:    void func1(int input1, int input2)
2:    {
00401020   push        ebp                     <----------- 
這兩個 經典語句 在后面再研究它們的作用,
00401021   mov         ebp,esp                <----------  
先從第三個語句看起
00401023   sub         esp,4Ch
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-4Ch]
0040102C   mov         ecx,13h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]

00401023   sub         esp,4Ch 

然后,堆棧寄存器 ESP 向低地址偏移76(0x4C)字節。這里相當于為 func1()函數層 分配了棧內存 76個字節。

76個字節,是編譯器根據你定義的變量的個數和大小,算出來的!

接著又把 ebx, esi, edi 分別入棧, 目的是為了保存 main 函數層的相關內容
00401026   push        ebx
00401027   push        esi
00401028   push        edi

 

ebx, esi, edi 分別保存了什么內容? 為什么要把它們分別壓入堆棧????

 

再接著,

0xCC初始化上述為func1()函數層所分配的棧內存的每個字節。這里每一步用F11單步跟蹤,棧內存的變化你會看得更清楚。
00401029   lea         edi,[ebp-4Ch]     ;
將有效的地址 [ebp-0x4Ch] 賦值到 edi,

                                                    ; [ebp-0x4Ch] 的值正是為 func1() 函數分配的 76個字節內存塊的 初始地址
0040102C   mov         ecx,13h           ;
00401031   mov         eax,0CCCCCCCCh    ;
00401036   rep stos    dword ptr [edi]   ;

 

stos指令:
字符串存儲指令 STOS
格式: STOS OPRD
其中OPRD為目的串符號地址.
功能: AL(字節)AX()中的數據存儲到DI為目的串地址指針所尋址的存儲器單元中去.指針DI將根據DF的值進行自動調整.
由于上面的指令是 dword ptr 類型
dword
表示雙字 ptr 表示取首地址
那么 stos    dword ptr [edi] 執行的操作就是
ES:[DI]AXDIDI±4   (DI 加或減是由 DF 標志位確定的)
如果是 那么 stos word ptr [edi] 的話那么就是
ES:[DI]ALDIDI±2   (DI 加或減是由 DF 標志位確定的)
不然推出 stos BYTE ptr [edi]

:
DF:
方向標志DF位用來決定在串操作指令執行時有關指針寄存器發生調整的方向。

重復前綴
格式: REP           ;CX<>0 重復執行字符串指令

REP 每執行一次后面的字符串指令后, cx1, 直至 cx 0
在本例中, 每次拷貝 sizeof(DWORD) 四個字節, 而堆棧大小是 76(0x4C) 個字節, 只需要重復執行 76 / 4 = 19 (0x13) 次就可以了

0040102C   mov         ecx,13h           ;

現在終于清楚

00401029   lea         edi,[ebp-4Ch]     ; 將有效的地址 [ebp-0x4Ch] 賦值到 edi
0040102C   mov         ecx,13h           ;
00401031   mov         eax,0CCCCCCCCh    ;
00401036   rep stos    dword ptr [edi]   ;

的作用就是把堆棧的數據置為 0xCC;

6:        i = input1;
00401038   mov         eax,dword ptr [ebp+8]               <----
斷點現在在這里
0040103B   mov         dword ptr [ebp-4],eax

 

這兩句語句,讀取了 輸入的第一個參數,并將它賦給了 i

在上面的

 

12:       int i, j;
13:       i=2;
00401078   mov         dword ptr [ebp-4],2   

14:       j=3;
0040107F   mov         dword ptr [ebp-8],3
15:

16:       func1(i,j);                                             <-- 斷點在此,EBP = 0012FF80
00401086   mov         eax,dword ptr [ebp-8]
00401089   push        eax
0040108A   mov         ecx,dword ptr [ebp-4]
0040108D   push        ecx

 

--------------------------------------------------

 

12:       int i, j;
13:       i=2;
00401078   mov         dword ptr [ebp-4],2             <--
main 的函數層也像 func1() 函數層一樣

                                                                      <-- 在函數內變量 存放在 EBP 指向的一塊內存空間

 

然后,ji 分別入棧

 

1:    void func1(int input1, int input2)
2:    {
00401020   push        ebp
00401021   mov         ebp,esp 

 

EBP 原來是 0012FF80,現在 變成了 0012FF1C

在進入 func1 前,

 

ESP 存放著此時的堆棧地址

 

00401023   sub         esp,4Ch
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-4Ch]
0040102C   mov         ecx,13h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]

00401023   sub         esp,4Ch 

 

ESP 向低地址偏移了 4CH~~~  然后,肚子好餓,需要先去吃飯~~

 

 

Feedback

# re: 函數堆棧是這么回事 第3集   回復  更多評論   

2008-10-02 22:44 by feosun
很贊的說

# re: 函數堆棧是這么回事 第3集   回復  更多評論   

2008-10-03 15:26 by kouprey
很強呀

# re: 函數堆棧是這么回事 第3集   回復  更多評論   

2008-10-05 00:45 by NewSketcher
很好,我很喜歡這種東西,學習了...

# re: 函數堆棧是這么回事 第3集   回復  更多評論   

2008-10-09 09:51 by Garfiled
膜拜ing....
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 久久综合导航| 另类国产ts人妖高潮视频| 激情国产一区二区| 久久er99精品| 老牛嫩草一区二区三区日本| 国产麻豆精品在线观看| 亚洲直播在线一区| 午夜在线视频一区二区区别| 国产精品日韩在线| 亚洲欧美日韩一区在线观看| 欧美专区在线观看| 狠狠久久亚洲欧美| 蜜桃av综合| 亚洲精品久久久久久久久久久| 国语自产精品视频在线看8查询8| 久久精品夜色噜噜亚洲a∨| 久久久亚洲一区| 亚洲第一视频| 欧美精品1区2区3区| 999亚洲国产精| 亚洲欧美日韩一区| 国产一区高清视频| 蜜桃av噜噜一区| 亚洲另类视频| 久久aⅴ国产欧美74aaa| 亚洲第一毛片| 国产精品高潮呻吟视频| 欧美一区二区三区在| 欧美大片国产精品| 亚洲天堂网在线观看| 国产午夜精品理论片a级大结局 | 亚洲欧美日韩中文在线制服| 国产精品午夜国产小视频| 久久不射电影网| 亚洲黄一区二区三区| 亚洲欧美在线看| 精品91免费| 欧美日本中文字幕| 欧美一区二区网站| 亚洲精品一区二区三区不| 欧美中文在线免费| 日韩视频中文字幕| 国产亚洲人成a一在线v站| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久久91精品国产一区二区三区 | 国产精品一区二区三区乱码| 久久久久久国产精品mv| 日韩视频一区二区| 老牛嫩草一区二区三区日本| 这里是久久伊人| 激情国产一区| 国产精品美女| 欧美99在线视频观看| 亚洲欧美日韩专区| 亚洲麻豆av| 欧美大片第1页| 欧美在线亚洲一区| 在线午夜精品| 亚洲国产精品成人综合色在线婷婷| 国产精品高潮呻吟久久| 欧美二区在线观看| 久久久国产一区二区| 亚洲伊人第一页| 亚洲人成网在线播放| 久久综合综合久久综合| 欧美亚洲免费在线| 国产精品99久久久久久www| 亚洲国产成人精品久久久国产成人一区 | 日韩视频一区二区三区| 嫩草影视亚洲| 久久久久欧美| 香蕉av777xxx色综合一区| 99精品视频一区| 亚洲国产精品久久久久婷婷884| 国产日韩欧美成人| 国产精品久久久免费| 欧美精品在线观看一区二区| 毛片一区二区| 免播放器亚洲| 欧美jizzhd精品欧美巨大免费| 久久激情婷婷| 久久精品中文字幕免费mv| 篠田优中文在线播放第一区| 亚洲视频一二区| 99精品久久免费看蜜臀剧情介绍| 欧美激情91| 欧美黄色免费网站| 亚洲福利视频专区| 亚洲国产精品久久久久婷婷884 | 欧美在线看片a免费观看| 亚洲一二三区在线观看| 正在播放欧美视频| 亚洲天堂av图片| 亚洲午夜激情免费视频| 亚洲视频一区在线观看| 亚洲一区二区在线| 香蕉av777xxx色综合一区| 午夜精品福利一区二区蜜股av| 午夜国产一区| 久久国产欧美日韩精品| 久久久99久久精品女同性 | 亚洲国产婷婷香蕉久久久久久99| 欧美1区2区3区| 欧美阿v一级看视频| 亚洲电影毛片| 亚洲精品一区二区在线| 亚洲午夜精品久久| 欧美一区综合| 美女成人午夜| 欧美精品xxxxbbbb| 国产精品高潮呻吟久久av黑人| 国产精品视频成人| 国内精品久久久久久久果冻传媒| 国产一区在线观看视频| 亚洲二区视频| av成人免费在线| 亚洲欧美三级在线| 久久天天综合| 亚洲丰满在线| 在线综合亚洲| 欧美一级网站| 久热精品视频| 欧美日韩在线免费观看| 国产欧美一区二区精品性色| 依依成人综合视频| 亚洲精品日本| 亚洲欧美日韩国产综合| 老司机久久99久久精品播放免费 | 亚洲视频在线观看免费| 午夜日韩在线| 女人香蕉久久**毛片精品| 亚洲精品久久久久久一区二区| 亚洲私人影院| 久久久久国产一区二区三区四区| 免费短视频成人日韩| 欧美日韩一区二区在线| 国产亚洲电影| 99re在线精品| 久久久久久久精| 亚洲精品日韩激情在线电影| 午夜精品电影| 欧美了一区在线观看| 国产婷婷色一区二区三区四区| 91久久视频| 欧美一区二区私人影院日本 | 亚洲激精日韩激精欧美精品| 亚洲欧美国产毛片在线| 免费不卡在线观看| 国产精品国产三级国产aⅴ入口 | 国产一区清纯| 亚洲夜晚福利在线观看| 久久天天躁夜夜躁狠狠躁2022 | 久久精品一区二区三区不卡牛牛 | 亚洲一区二区三区午夜| 久久综合成人精品亚洲另类欧美| 亚洲欧洲另类国产综合| 欧美一级日韩一级| 国产精品hd| 亚洲精品视频中文字幕| 久久久久久电影| 一区二区三区你懂的| 美日韩精品视频免费看| 国产精品视频九色porn| 亚洲美女视频在线观看| 久久久久国产精品人| 一区二区三区三区在线| 免费观看日韩av| 国产日韩欧美在线视频观看| 亚洲小少妇裸体bbw| 欧美黄色aa电影| 久久精品女人天堂| 国产精品九色蝌蚪自拍| 亚洲精品一区在线| 久久亚洲私人国产精品va| 亚洲无限乱码一二三四麻| 欧美精品一区二区三区蜜臀| 影音先锋久久| 久久久蜜臀国产一区二区| 午夜电影亚洲| 国产精品免费久久久久久| 一区二区三区四区蜜桃| 亚洲国产经典视频| 免费高清在线一区| 亚洲国产精品福利| 老司机aⅴ在线精品导航| 性色av一区二区三区| 国产精品日本一区二区| 亚欧成人精品| 亚洲女同性videos| 国产精品女人久久久久久| 亚洲在线观看免费视频|