日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

C++ LibCurl实现Web指纹识别

發布時間:2023/11/23 windows 57 coder
生活随笔 收集整理的這篇文章主要介紹了 C++ LibCurl实现Web指纹识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Web指紋識別是一種通過分析Web應用程序的特征和元數據,以確定應用程序所使用的技術棧和配置的技術。這項技術旨在識別Web服務器、Web應用框架、后端數據庫、JavaScript庫等組件的版本和配置信息。通過分析HTTP響應頭、HTML源代碼、JavaScript代碼、CSS文件等,可以獲取關于Web應用程序的信息。指紋識別在信息搜集、滲透測試、安全審計等方面具有重要作用。有許多開源和商業工具可以用于執行Web指紋識別,例如Wappalyzer、WebScarab、Nmap等。

Web指紋識別的主要目的包括:

  • 技術識別: 了解Web應用程序所使用的服務器軟件、框架、數據庫等技術。
  • 版本檢測: 確定這些技術的具體版本,有助于判斷應用程序是否存在已知的漏洞。
  • 配置檢測: 獲取Web應用程序的配置信息,包括安裝路徑、默認文件、目錄結構等。
  • 漏洞分析: 通過已知漏洞與特定版本相關聯,評估Web應用程序的安全性。

指紋識別是滲透測試中常用的一項技術,用于識別目標Web應用程序所使用的框架、技術和配置。其中,通過計算特定頁面的哈希值進行指紋識別是一種常見的方法,主要通過以下步驟實現:

  • 1.利用CURL庫獲取頁面內容: 使用LibCURL庫可以方便地獲取目標網站的頁面內容,將其讀入到std::string字符串中,以便后續處理。
  • 2.MD5算法計算哈希值: 對獲取的頁面內容進行MD5哈希計算,得到一個唯一的哈希值。MD5是一種常用的哈希算法,將任意長度的數據映射成128位的哈希值,通常以16進制表示。
  • 3.比對預先計算的框架頁面哈希值: 預先計算一些特定頁面的哈希值,這些頁面通常是目標框架中相對獨立且不經常變動的頁面。將獲取到的頁面的哈希值與預先計算的哈希值進行比對。
  • 4.框架識別: 如果哈希值匹配,則說明目標頁面的框架很可能是預先定義的框架,從而實現對框架的識別。比對的過程可以使用簡單的相等比對,也可以設置一定的相似度閾值。

通過計算頁面哈希值進行指紋識別是一種有效的方式,特別是針對那些相對穩定的頁面。首先我們利用LibCURL庫將目標頁面讀入到std::string字符串中,然后調用MD5算法計算出該頁面的HASH值并比對,由于特定框架中總是有些頁面不會變動,我們則去校驗這些頁面的HASH值,即可實現對框架的識別。

LibCURL讀入頁面

當我們需要獲取遠程服務器上的網頁內容時,使用C++編寫一個簡單的程序來實現這個目標是非常有用的。在這個例子中,我們使用了libcurl庫,在程序中引入libcurl庫的頭文件,并使用#pragma comment指令引入相關的庫文件。接下來,我們定義了一個回調函數WriteCallback,該函數將獲取的數據追加到一個std::string對象中。

主要的功能實現在GetUrlPageOfString函數中。該函數接受一個URL作為參數,并使用libcurl庫來執行HTTP GET請求。我們通過設置CURLOPT_URL選項來指定URL路徑,同時關閉了SSL證書驗證以及啟用了重定向。我們還設置了一些超時選項,以確保在連接或接收數據時不會花費太長時間。通過調用curl_easy_perform執行請求,并通過回調函數將獲取到的數據存儲在read_buffer中。最后,我們輸出接收到的數據的長度。

#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"

#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")

using namespace std;

// 存儲回調函數
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
  ((std::string*)userp)->append((char*)contents, size * nmemb);
  return size * nmemb;
}

// 獲取數據并放入string中.
std::string GetUrlPageOfString(std::string url)
{
  std::string read_buffer;
  CURL *curl;

  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
  if (curl)
  {
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // 忽略證書檢查
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  // 重定向

    curl_easy_setopt(curl, CURLOPT_URL, url);           // URL路徑
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);      // 查找次數,防止查找太深
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // 連接超時
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);        // 接收數據時超時設置

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer);

    curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    return read_buffer;
  }
  return "None";
}

int main(int argc, char *argv[])
{
  std::string urls = GetUrlPageOfString("https://www.baidu.com");
  std::cout << "接收長度: " << urls.length() << " bytes" << std::endl;

  system("pause");
  return 0;
}

運行上述代碼將會輸出訪問特定主機所接收到的流量字節數,如下圖所示;

LibCURL獲取狀態碼

在這個C++程序中,我們使用了libcurl庫來獲取指定URL的HTTP狀態碼。首先,我們引入libcurl庫的頭文件,并通過#pragma comment指令引入相關的庫文件。然后,我們定義了一個靜態的回調函數not_output,該函數用于屏蔽libcurl的輸出。

接著,我們定義了GetStatus函數,該函數接受一個URL作為參數,并返回該URL對應的HTTP狀態碼。在函數中,我們使用curl_easy_setopt設置了一些選項,包括URL、寫數據的回調函數(這里我們使用not_output屏蔽輸出),以及通過curl_easy_getinfo獲取狀態碼。

在main函數中,我們調用GetStatus函數并輸出獲取到的狀態碼。這個例子非常簡單,但展示了使用libcurl庫獲取HTTP狀態碼的基本方法。

#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"

#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")

using namespace std;

// 屏蔽輸出
static size_t not_output(char *d, size_t n, size_t l, void *p){ return 0; }

// 獲取狀態碼
long GetStatus(std::string url)
{
  CURLcode return_code;
  long retcode = 0;
  return_code = curl_global_init(CURL_GLOBAL_WIN32);
  if (CURLE_OK != return_code)
    return 0;

  CURL *easy_handle = curl_easy_init();
  if (NULL != easy_handle)
  {
    curl_easy_setopt(easy_handle, CURLOPT_URL, url);                   // 請求的網站
    curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, not_output);   // 設置回調函數,屏蔽輸出
    return_code = curl_easy_perform(easy_handle);                       // 執行CURL

    return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, &retcode);
    if ((CURLE_OK == return_code) && retcode)
    {
      return retcode;
    }
  }
  curl_easy_cleanup(easy_handle);
  curl_global_cleanup();
  return retcode;
}

int main(int argc, char *argv[])
{
  long ref = GetStatus("https://www.baidu.com/");
  std::cout << "返回狀態碼: " << ref << std::endl;

  system("pause");
  return 0;
}

運行上述代碼可得到特定網址的狀態碼信息,圖中200表示訪問正常;

計算字符串Hash值

我們使用Boost庫中的boost/crc.hppboost/uuid/detail/md5.hpp來計算CRC32和MD5值。首先,定義GetCrc32函數,該函數接受一個字符串作為輸入,使用Boost庫中的crc_32_type計算字符串的CRC32值。

接著,我們定義了GetMd5函數,該函數接受一個字符數組和其大小作為輸入,使用Boost庫中的boost::uuids::detail::md5計算字符串的MD5值。在這個例子中,我們使用了Boost的md5實現。

在main函數中,我們創建了一個測試字符串"hello lyshark",并分別調用GetMd5和GetCrc32函數來計算其MD5和CRC32值。最后,我們輸出計算得到的MD5和CRC32值。

#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>

#include <boost/crc.hpp>
#include <boost/uuid/detail/md5.hpp>
#include <boost/algorithm/hex.hpp>

using namespace std;
using namespace boost;

// 應用于crc32
long GetCrc32(std::string sz_string)
{
  long ref;
  crc_32_type crc32;
  cout << hex;
  crc32.process_bytes(sz_string.c_str(), sz_string.length());
  return crc32.checksum();
}

// 應用于md5
std::string GetMd5(const char  * const buffer, size_t buffer_size)
{
  if (buffer == nullptr)
    return false;

  std::string str_md5;
  boost::uuids::detail::md5 boost_md5;
  boost_md5.process_bytes(buffer, buffer_size);
  boost::uuids::detail::md5::digest_type digest;
  boost_md5.get_digest(digest);
  const auto char_digest = reinterpret_cast<const char*>(&digest);
  str_md5.clear();
  boost::algorithm::hex(char_digest, char_digest + sizeof(boost::uuids::detail::md5::digest_type), std::back_inserter(str_md5));
  return str_md5;
}

int main(int argc, char *argv[])
{
  std::string urls = "hello lyshark";
  std::cout << "計算Hash: " << urls << std::endl;

  // 計算MD5
  std::string str = GetMd5(urls.c_str(), urls.length());
  std::cout << "計算 MD5: " << str << std::endl;

  // 計算CRC32
  long crc = GetCrc32(urls.c_str());
  std::cout << "計算 CRC32: " << crc << std::endl;

  system("pause");
  return 0;
}

通過計算可得到hello lyshark字符串的CRC32與MD5特征碼,如下圖;

當具備了hash值的計算后,我們只需要將上述兩個功能組合起來就可以實現提取特定頁面的特征碼,首先通過libcurl庫完成對頁面的訪問,接著就是計算特征碼即可。

#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"

#include <boost/crc.hpp>
#include <boost/uuid/detail/md5.hpp>
#include <boost/algorithm/hex.hpp>

#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")

using namespace std;

// 存儲回調函數
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
  ((std::string*)userp)->append((char*)contents, size * nmemb);
  return size * nmemb;
}

// 獲取數據并放入string中.
std::string GetUrlPageOfString(std::string url)
{
  std::string read_buffer;
  CURL *curl;

  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
  if (curl)
  {
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // 忽略證書檢查
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  // 重定向

    curl_easy_setopt(curl, CURLOPT_URL, url);           // URL路徑
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);      // 查找次數,防止查找太深
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // 連接超時
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);        // 接收數據時超時設置

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer);

    curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    return read_buffer;
  }
  return "None";
}

// 應用于md5
std::string GetMd5(const char  * const buffer, size_t buffer_size)
{
  if (buffer == nullptr)
    return false;

  std::string str_md5;
  boost::uuids::detail::md5 boost_md5;
  boost_md5.process_bytes(buffer, buffer_size);
  boost::uuids::detail::md5::digest_type digest;
  boost_md5.get_digest(digest);
  const auto char_digest = reinterpret_cast<const char*>(&digest);
  str_md5.clear();
  boost::algorithm::hex(char_digest, char_digest + sizeof(boost::uuids::detail::md5::digest_type), std::back_inserter(str_md5));
  return str_md5;
}

// 計算特定頁面MD5
std::string CalculationMD5(std::string url)
{
  std::string page_string = GetUrlPageOfString(url);

  if (page_string != "None")
  {
    std::string page_md5 = GetMd5(page_string.c_str(), page_string.length());
    std::cout << "[+] 計算頁面: " << url << std::endl;
    std::cout << "[+] 壓縮數據: " << page_md5 << std::endl;
    return page_md5;
  }
  return "None";
}

int main(int argc, char *argv[])
{
  std::string md5 = CalculationMD5("https://www.baidu.com");

  system("pause");
  return 0;
}

上述代碼運行后,則可以計算出特定網站的MD5值,如下圖;

解析對比Hash值

指紋識別依賴于特征庫,如果需要實現自己的指紋識別工具則需要我么能自行去收集各類框架的特征庫,有了這些特征庫就可以定義一個如下所示的JSON文本,該文本中container用于存儲框架類型,其次hash則用于存放特征碼,最后的sub_url則是識別路徑。

{
    "data_base":
     [
        { "container": "typecho", "hash": "04A40072CDB70B1BF54C96C6438678CB" ,"sub_url":"/index.php/about.html" },
        { "container": "wordpress", "hash": "04A40072CBB70B1BF54C96C6438678CB" ,"sub_url":"/admin.php" },
        { "container": "baidu", "hash": "EF3F1F8FBB7D1F545A75A83640FF0E9F" ,"sub_url":"/index.php" }
    ]
}

接著就是解析這段JSON文本,我們利用BOOST提供的JSON解析庫,首先解析出所有的鍵值對,將其全部讀入到定義的結構體映射中,然后嘗試輸出看看,注意壓縮和解包格式必須對應。

#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using namespace std;
using namespace boost;
using namespace boost::property_tree;

// 定義映射字段
typedef struct
{
  std::vector<std::string> container;
  std::vector<std::string> hash;
  std::vector<std::string> sub_url;
}database_map;

// 獲取文本中的JSON,放入自定義database_map
std::vector<database_map> GetDataBase()
{
  std::vector<database_map> ref;

  boost::property_tree::ptree ptr;
  boost::property_tree::read_json("database.json", ptr);

  if (ptr.count("data_base") == 1)
  {
    boost::property_tree::ptree p1, p2;

    p1 = ptr.get_child("data_base");

    // 定義映射類型
    std::vector<std::string> x, y, z;
    database_map maps;

    for (ptree::iterator it = p1.begin(); it != p1.end(); ++it)
    {
      // 讀取出json中的數據
      p2 = it->second;
      std::string container = p2.get<std::string>("container");
      std::string hash = p2.get<std::string>("hash");
      std::string sub_url = p2.get<std::string>("sub_url");

      // 臨時存儲數據
      x.push_back(container);
      y.push_back(hash);
      z.push_back(sub_url);
    }
    // 打包結構壓入ref中
    maps.container = x;
    maps.hash = y;
    maps.sub_url = z;
    ref.push_back(maps);
  }
  return ref;
}
int main(int argc, char *argv[])
{
  std::vector<database_map> db_map = GetDataBase();

  for (int x = 0; x < db_map.size(); x++)
  {
    // 依次將字典讀入內存容器.
    database_map maps = db_map[x];
    std::vector<std::string> container = maps.container;
    std::vector<std::string> hash = maps.hash;
    std::vector<std::string> sub_url = maps.sub_url;

    // 必須保證記錄數完全一致
    if (container.size() != 0 && hash.size() != 0 && sub_url.size() != 0)
    {
      for (int x = 0; x < container.size(); x++)
      {
        std::cout << "容器類型: " << container[x] << std::endl;
        std::cout << "指紋: " << hash[x] << std::endl;
        std::cout << "根路徑: " << sub_url[x] << std::endl;
        std::cout << std::endl;
      }
    }
  }
  std::system("pause");
  return 0;
}

運行后則可以實現正常的json文檔解析,如下圖;

最后增加循環對比流程,這里我們以百度為例測試一下提取字段是否可以被解析。

#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"

#include <boost/format.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

#include <boost/crc.hpp>
#include <boost/uuid/detail/md5.hpp>
#include <boost/algorithm/hex.hpp>

#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")

using namespace std;
using namespace boost;
using namespace boost::property_tree;

// 定義映射字段
typedef struct
{
  std::vector<std::string> container;
  std::vector<std::string> hash;
  std::vector<std::string> sub_url;
}database_map;

// 存儲回調函數
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
  ((std::string*)userp)->append((char*)contents, size * nmemb);
  return size * nmemb;
}
// 屏蔽輸出
static size_t not_output(char *d, size_t n, size_t l, void *p){ return 0; }

// 獲取數據并放入string中.
std::string GetUrlPageOfString(std::string url)
{
  std::string read_buffer;
  CURL *curl;

  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
  if (curl)
  {
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // 忽略證書檢查
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  // 重定向

    curl_easy_setopt(curl, CURLOPT_URL, url);           // URL路徑
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);      // 查找次數,防止查找太深
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // 連接超時
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);        // 接收數據時超時設置

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer);

    curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    return read_buffer;
  }
  return "None";
}

// 獲取狀態碼
long GetStatus(std::string url)
{
  CURLcode return_code;
  long retcode = 0;
  return_code = curl_global_init(CURL_GLOBAL_WIN32);
  if (CURLE_OK != return_code)
    return 0;

  CURL *easy_handle = curl_easy_init();
  if (NULL != easy_handle)
  {
    curl_easy_setopt(easy_handle, CURLOPT_URL, url);                   // 請求的網站
    curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, not_output);   // 設置回調函數,屏蔽輸出
    return_code = curl_easy_perform(easy_handle);                       // 執行CURL

    return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, &retcode);
    if ((CURLE_OK == return_code) && retcode)
    {
      return retcode;
    }
  }
  curl_easy_cleanup(easy_handle);
  curl_global_cleanup();
  return retcode;
}

// 應用于md5
std::string GetMd5(const char  * const buffer, size_t buffer_size)
{
  if (buffer == nullptr)
    return false;

  std::string str_md5;
  boost::uuids::detail::md5 boost_md5;
  boost_md5.process_bytes(buffer, buffer_size);
  boost::uuids::detail::md5::digest_type digest;
  boost_md5.get_digest(digest);
  const auto char_digest = reinterpret_cast<const char*>(&digest);
  str_md5.clear();
  boost::algorithm::hex(char_digest, char_digest + sizeof(boost::uuids::detail::md5::digest_type), std::back_inserter(str_md5));
  return str_md5;
}

// 獲取文本中的JSON,放入自定義database_map
std::vector<database_map> GetDataBase()
{
  std::vector<database_map> ref;

  boost::property_tree::ptree ptr;
  boost::property_tree::read_json("database.json", ptr);

  if (ptr.count("data_base") == 1)
  {
    boost::property_tree::ptree p1, p2;

    p1 = ptr.get_child("data_base");

    // 定義映射類型
    std::vector<std::string> x, y, z;
    database_map maps;

    for (ptree::iterator it = p1.begin(); it != p1.end(); ++it)
    {
      // 讀取出json中的數據
      p2 = it->second;
      std::string container = p2.get<std::string>("container");
      std::string hash = p2.get<std::string>("hash");
      std::string sub_url = p2.get<std::string>("sub_url");

      // 臨時存儲數據
      x.push_back(container);
      y.push_back(hash);
      z.push_back(sub_url);
    }
    // 打包結構壓入ref中
    maps.container = x;
    maps.hash = y;
    maps.sub_url = z;
    ref.push_back(maps);
  }
  return ref;
}

int main(int argc, char *argv[])
{
  std::vector<database_map> db_map = GetDataBase();

  for (int x = 0; x < db_map.size(); x++)
  {
    // 依次將字典讀入內存容器.
    database_map maps = db_map[x];
    std::vector<std::string> container = maps.container;
    std::vector<std::string> hash = maps.hash;
    std::vector<std::string> sub_url = maps.sub_url;

    // 必須保證記錄數完全一致
    if (container.size() != 0 && hash.size() != 0 && sub_url.size() != 0)
    {
      for (int x = 0; x < container.size(); x++)
      {
        // 開始編寫掃描函數
        // 1.拼接字符串
        std::string ur = "https://www.baidu.com";
        
        std::string this_url = boost::str(boost::format("%s%s") %ur %sub_url[x]);

        // 2.判斷頁面是否存在
        long ref_status = GetStatus(this_url);
        if (ref_status != 0 && ref_status == 200)
        {
          // 3.讀入頁面字符串,判斷是否成功
          std::string read_page = GetUrlPageOfString(this_url);
          if (read_page != "None")
          {
            std::string check_md5 = GetMd5(read_page.c_str(),read_page.length());
            std::cout << "[+] 頁面MD5: " << check_md5 << std::endl;
            std::cout << "[+] 數據庫: " << hash[x] << std::endl;
            
            // 4.比對MD5值是否相同
            if (check_md5 == std::string(hash[x]))
            {
              std::cout << "[*] 診斷框架為: " << container[x] << std::endl;
              break;
            }
          }
        }
      }
    }
  }
  std::system("pause");
  return 0;
}

如下圖所示,說明對比通過,接著就可以增加命令行參數并使用了。

完整代碼總結

C++指紋識別助手程序,它使用了libcurl庫進行HTTP請求,通過比對頁面的MD5值與預先存儲在數據庫中的MD5值,從而識別目標網站所使用的容器框架。

通過參數-u用于識別一個網站是什么框架,使用-g則是獲取當前頁面指紋特征,如下圖;

#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"

#include <boost/format.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

#include <boost/crc.hpp>
#include <boost/uuid/detail/md5.hpp>
#include <boost/algorithm/hex.hpp>

#include <boost/program_options.hpp>

#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")

using namespace std;
using namespace boost;
using namespace boost::property_tree;
namespace opt = boost::program_options;

// 定義映射字段
typedef struct
{
  std::vector<std::string> container;
  std::vector<std::string> hash;
  std::vector<std::string> sub_url;
}database_map;

void ShowOpt()
{
  fprintf(stderr,
    "#                       #                          #       \n"
    "#                       #                          #       \n"
    "#     #    #    #####   ######    ######   # ###   #   ##  \n"
    "#     #    #   #        #     #  #     #   ##      #  #    \n"
    "#     #    #    ####    #     #  #     #   #       ###     \n"
    "#      #####        #   #     #  #    ##   #       #  #    \n"
    "######     #   #####    #     #   #### #   #       #   ##  \n\n"
    );
}

// 存儲回調函數
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
  ((std::string*)userp)->append((char*)contents, size * nmemb);
  return size * nmemb;
}
// 屏蔽輸出
static size_t not_output(char *d, size_t n, size_t l, void *p){ return 0; }

// 獲取數據并放入string中.
std::string GetUrlPageOfString(std::string url)
{
  std::string read_buffer;
  CURL *curl;

  curl_global_init(CURL_GLOBAL_ALL);
  curl = curl_easy_init();
  if (curl)
  {
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // 忽略證書檢查
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  // 重定向

    curl_easy_setopt(curl, CURLOPT_URL, url);           // URL路徑
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);      // 查找次數,防止查找太深
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); // 連接超時
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);        // 接收數據時超時設置

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer);

    curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    return read_buffer;
  }
  return "None";
}

// 獲取狀態碼
long GetStatus(std::string url)
{
  CURLcode return_code;
  long retcode = 0;
  return_code = curl_global_init(CURL_GLOBAL_WIN32);
  if (CURLE_OK != return_code)
    return 0;

  CURL *easy_handle = curl_easy_init();
  if (NULL != easy_handle)
  {
    curl_easy_setopt(easy_handle, CURLOPT_URL, url);                   // 請求的網站
    curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, not_output);   // 設置回調函數,屏蔽輸出
    return_code = curl_easy_perform(easy_handle);                       // 執行CURL

    return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, &retcode);
    if ((CURLE_OK == return_code) && retcode)
    {
      return retcode;
    }
  }
  curl_easy_cleanup(easy_handle);
  curl_global_cleanup();
  return retcode;
}

// 應用于md5
std::string GetMd5(const char  * const buffer, size_t buffer_size)
{
  if (buffer == nullptr)
    return false;

  std::string str_md5;
  boost::uuids::detail::md5 boost_md5;
  boost_md5.process_bytes(buffer, buffer_size);
  boost::uuids::detail::md5::digest_type digest;
  boost_md5.get_digest(digest);
  const auto char_digest = reinterpret_cast<const char*>(&digest);
  str_md5.clear();
  boost::algorithm::hex(char_digest, char_digest + sizeof(boost::uuids::detail::md5::digest_type), std::back_inserter(str_md5));
  return str_md5;
}

// 獲取文本中的JSON,放入自定義database_map
std::vector<database_map> GetDataBase()
{
  std::vector<database_map> ref;

  boost::property_tree::ptree ptr;
  boost::property_tree::read_json("database.json", ptr);

  if (ptr.count("data_base") == 1)
  {
    boost::property_tree::ptree p1, p2;

    p1 = ptr.get_child("data_base");

    // 定義映射類型
    std::vector<std::string> x, y, z;
    database_map maps;

    for (ptree::iterator it = p1.begin(); it != p1.end(); ++it)
    {
      // 讀取出json中的數據
      p2 = it->second;
      std::string container = p2.get<std::string>("container");
      std::string hash = p2.get<std::string>("hash");
      std::string sub_url = p2.get<std::string>("sub_url");

      // 臨時存儲數據
      x.push_back(container);
      y.push_back(hash);
      z.push_back(sub_url);
    }
    // 打包結構壓入ref中
    maps.container = x;
    maps.hash = y;
    maps.sub_url = z;
    ref.push_back(maps);
  }
  return ref;
}

// 掃描判斷容器類型
void ScanPage(std::string urls)
{
  std::vector<database_map> db_map = GetDataBase();

  for (int x = 0; x < db_map.size(); x++)
  {
    // 依次將字典讀入內存容器.
    database_map maps = db_map[x];
    std::vector<std::string> container = maps.container;
    std::vector<std::string> hash = maps.hash;
    std::vector<std::string> sub_url = maps.sub_url;

    // 必須保證記錄數完全一致
    if (container.size() != 0 && hash.size() != 0 && sub_url.size() != 0)
    {
      for (int x = 0; x < container.size(); x++)
      {
        // 1.拼接字符串
        std::string this_url = boost::str(boost::format("%s%s") % urls %sub_url[x]);

        // 2.判斷頁面是否存在
        long ref_status = GetStatus(this_url);
        if (ref_status != 0 && ref_status == 200)
        {
          // 3.讀入頁面字符串,判斷是否成功
          std::string read_page = GetUrlPageOfString(this_url);
          if (read_page != "None")
          {
            std::string check_md5 = GetMd5(read_page.c_str(), read_page.length());
            std::cout << "[+] 頁面MD5: " << check_md5 << std::endl;
            std::cout << "[+] 數據庫: " << hash[x] << std::endl;

            // 4.比對MD5值是否相同
            if (check_md5 == std::string(hash[x]))
            {
              std::cout << "[*] 診斷框架為: " << container[x] << std::endl;
              break;
            }
          }
        }
      }
    }
  }
}

int main(int argc, char *argv[])
{
  opt::options_description des_cmd("\n Usage: 容器識別助手 \n\n Options");
  des_cmd.add_options()
    ("url,u", opt::value<std::string>(), "指定目標URL地址")
    ("get,g", opt::value<std::string>(), "提取頁面指紋")
    ("help,h", "幫助菜單");

  opt::variables_map virtual_map;
  try
  {
    opt::store(opt::parse_command_line(argc, argv, des_cmd), virtual_map);
  }
  catch (...){ return 0; }

  // 定義消息
  opt::notify(virtual_map);

  // 無參數直接返回
  if (virtual_map.empty())
  {
    ShowOpt();
    return 0;
  }
  // 幫助菜單
  else if (virtual_map.count("help") || virtual_map.count("h"))
  {
    ShowOpt();
    std::cout << des_cmd << std::endl;
    return 0;
  }
  else if (virtual_map.count("url"))
  {
    std::string address = virtual_map["url"].as<std::string>();
    ScanPage(address);
  }
  else if (virtual_map.count("get"))
  {
    std::string address = virtual_map["get"].as<std::string>();
    std::string read_page = GetUrlPageOfString(address);
    std::cout << "[+] 提取指紋: " << GetMd5(read_page.c_str(), read_page.length()) << std::endl;
  }
  else
  {
    std::cout << "參數錯誤" << std::endl;
  }
  return 0;

  std::system("pause");
  return 0;
}

總結

以上是生活随笔為你收集整理的C++ LibCurl实现Web指纹识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

婷婷激情五月 | 九九久久国产 | 国产精品 视频 | 在线观看国产高清视频 | 日韩久久精品一区 | 麻豆传媒电影在线观看 | 日韩精品不卡在线 | 狠狠色丁香久久综合网 | 亚洲欧美国产精品va在线观看 | 天天艹日日干 | 久香蕉 | 欧美精品一二三 | 丁香五婷 | 欧洲精品在线视频 | 久久在线免费观看 | a在线观看免费视频 | 最近最新中文字幕 | 成人在线视频免费观看 | 亚洲精品影视在线观看 | 国产中文 | 日韩特黄一级欧美毛片特黄 | 夜夜躁天天躁很躁波 | 国产成人99久久亚洲综合精品 | 色视频成人在线观看免 | 91麻豆网站 | 精品一二 | 综合久久婷婷 | 麻豆国产露脸在线观看 | 麻豆传媒视频在线 | 五月天亚洲综合小说网 | 久久国产成人午夜av影院宅 | 天天人人综合 | 日韩视频一二三区 | 精品国产伦一区二区三区观看说明 | 日韩中文字幕在线看 | 久久a国产 | 日韩国产欧美在线视频 | 五月婷婷av在线 | 免费在线观看av不卡 | 国产尤物在线观看 | 成人午夜精品久久久久久久3d | 久久久久免费 | 欧美精品国产综合久久 | 黄色毛片观看 | 国产理论片在线观看 | 欧美va日韩va | 久久久久久美女 | 黄色软件大全网站 | 国产精品视频免费看 | 亚洲精品中文在线 | 国产区久久 | 欧美成人一区二区 | 亚州精品国产 | 91精品色| 日本三级不卡 | 黄色软件大全网站 | 97色视频在线 | 日韩不卡高清 | 在线观看亚洲免费视频 | 午夜国产一区二区三区四区 | 精品中文字幕在线观看 | 久久国产精品99久久久久久老狼 | 成人xxxx | 亚洲伊人婷婷 | 天天草天天干天天 | 日本视频精品 | 伊人亚洲综合网 | 久久久久久亚洲精品 | 亚洲天天看 | 综合色中文 | 成人中心免费视频 | 天堂中文在线视频 | 亚洲天天做| 91在线看黄| 日韩大片在线免费观看 | 一区二区三区精品在线 | 国产精品com | 91伊人影院 | 精品久久久久亚洲 | 国产成人精品国内自产拍免费看 | 国产999在线观看 | 日韩专区一区二区 | 久青草影院| 亚洲国产精品va在线看黑人 | 久久婷婷综合激情 | 天天爱天天射天天干天天 | 国产精品成人一区二区三区 | 国产成人区| 天天操夜夜操国产精品 | 五月天综合激情网 | 亚洲精品在线看 | 中文字幕亚洲情99在线 | 狠狠色丁香婷婷综合最新地址 | 成人av在线观 | 91av中文| 999热线在线观看 | 在线一二区 | 国产一区二区在线免费观看 | 天天在线视频色 | 久久久久久国产精品999 | 久久久久久久久久久久久影院 | 十八岁以下禁止观看的1000个网站 | 国产免费大片 | 日本中文字幕网址 | 五月天婷婷在线观看视频 | 香蕉视频在线观看免费 | 91中文在线视频 | 日日夜日日干 | 天天色欧美 | 免费在线视频一区二区 | 99精品久久精品一区二区 | 麻豆va一区二区三区久久浪 | 国产小视频在线免费观看 | 免费观看一区二区三区视频 | 手机看片国产日韩 | 欧美日韩在线视频一区二区 | 欧美午夜性生活 | 国产又粗又长的视频 | 亚洲国产小视频在线观看 | 成人精品福利 | 成人视屏免费看 | 欧美片网站yy | 91麻豆精品91久久久久同性 | 色干干| 91插插插免费视频 | 91爱爱视频| 国产女人免费看a级丨片 | 久草网在线视频 | 蜜臀久久99精品久久久无需会员 | 久久性生活片 | 国产一区视频在线播放 | 日韩欧美综合在线视频 | av在线看网站 | 福利久久久 | 黄色片免费在线 | 久久免费观看视频 | 亚洲狠狠婷婷综合久久久 | 丁香五月亚洲综合在线 | 成人性生交大片免费观看网站 | 午夜久久久精品 | 日韩区欧美久久久无人区 | 五月婷婷久久丁香 | 欧美专区亚洲专区 | 人人超碰97| 久久伊人精品一区二区三区 | 欧美综合久久久 | 在线观看日韩精品 | 三级在线视频观看 | 中文字幕电影在线 | www最近高清中文国语在线观看 | 456成人精品影院 | 国产一级黄色免费看 | 久久久久久久久久国产精品 | 伊人夜夜 | 在线观看黄网站 | 五月婷婷综合在线视频 | 久久超碰97| 国产1区2区3区在线 亚洲自拍偷拍色图 | 天天爽夜夜操 | 中文字幕永久在线 | 国产91精品高清一区二区三区 | 91精品天码美女少妇 | 九九天堂| 新av在线 | 久久99国产精品自在自在app | 亚洲免费av一区二区 | 欧美日韩在线观看视频 | 中文av在线播放 | 久草在线一免费新视频 | 一区二区三区视频在线 | 97精产国品一二三产区在线 | 69xxxx欧美| 午夜aaaa | 国产综合91 | 亚洲成a人片在线观看网站口工 | 亚洲涩涩网站 | 成人在线观看免费视频 | 国产精品999久久久 久产久精国产品 | 欧美精品资源 | 亚洲日本精品视频 | 国产999精品久久久久久麻豆 | 国产在线视频一区 | 日韩av在线不卡 | 精品国产伦一区二区三区观看说明 | 日本高清中文字幕有码在线 | 夜夜躁日日躁狠狠躁 | 日韩动态视频 | 五月婷婷中文 | 不卡的av在线播放 | 69欧美视频 | 国产午夜三级一区二区三桃花影视 | 美女网站色在线观看 | 五月色婷 | www.亚洲精品在线 | 国产精品久久久久婷婷二区次 | 人人看人人爱 | 欧美怡红院 | 欧美日韩a视频 | 亚洲天堂香蕉 | 99re中文字幕 | 免费在线观看污网站 | 久久精品免费观看 | 久久国产精品99久久人人澡 | 中文字幕 第二区 | 国产精品69久久久久 | 黄色av电影一级片 | 亚洲国产欧美一区二区三区丁香婷 | 日韩二区在线 | 亚洲精品中文字幕视频 | 涩涩成人在线 | 午夜狠狠干 | 区一区二在线 | 亚洲视频观看 | 久久久久国产免费免费 | 免费日韩 精品中文字幕视频在线 | 免费在线观看黄网站 | 国产精品丝袜久久久久久久不卡 | 久久婷亚洲五月一区天天躁 | 免费在线观看黄网站 | 久久精品视频5 | 久久免费视频1 | 久草在线观看视频免费 | 4438全国亚洲精品观看视频 | 男女啪啪视屏 | 天天摸天天操天天爽 | 欧美日韩一区二区三区免费视频 | 亚洲精品日韩一区二区电影 | 五月天丁香视频 | 免费午夜视频在线观看 | 久草视频在线资源站 | 成片免费观看视频大全 | 91麻豆福利 | 97在线视频免费 | 婷婷激情网站 | 亚洲美女免费精品视频在线观看 | 人人看人人草 | 成人久久久电影 | 欧美日韩一区二区在线观看 | 九九热视频在线免费观看 | 日韩精品久久久免费观看夜色 | 日韩免费视频一区二区 | 久久8精品| 久热国产视频 | 国产亚洲人成网站在线观看 | 亚洲国产精品电影 | 成人久久久久久久久久 | 亚洲天堂网站 | 国产高清精品在线观看 | 一区二区激情 | 国产精品入口麻豆www | 日韩在线看片 | 黄色影院在线观看 | 亚洲国产大片 | 色久网| 狠狠色狠狠色合久久伊人 | 日本高清dvd | 免费瑟瑟网站 | 园产精品久久久久久久7电影 | 色婷婷亚洲 | 99r国产精品 | 色婷婷综合久色 | 亚洲综合小说 | 国产精品久久久久久a | 99中文字幕在线观看 | 91精品欧美 | 亚洲激情一区二区三区 | 午夜精品一区二区三区免费 | 久久国产免费 | 91精品啪在线观看国产 | 日韩电影一区二区三区 | 国产精品久久久久久爽爽爽 | 曰本三级在线 | 亚洲国产精选 | 日韩毛片精品 | 久久国产精品99久久久久久丝袜 | 天天干天天操天天做 | 99久久99久久综合 | 午夜.dj高清免费观看视频 | 日韩二级毛片 | 亚洲精品在线一区二区三区 | 在线观看黄网站 | 久久久久久久久久毛片 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 97人人澡人人添人人爽超碰 | 亚洲天堂精品视频 | 91黄色在线观看 | www.天天草 | 特级a毛片 | 亚洲尺码电影av久久 | av高清一区二区三区 | 天天射天天干天天插 | 免费观看国产成人 | 波多野结衣视频一区二区三区 | 91在线小视频 | 婷婷综合视频 | 日韩在线理论 | 国产一区视频在线观看免费 | 日本中文字幕视频 | 免费日韩 精品中文字幕视频在线 | 日韩高清观看 | 黄色影院在线免费观看 | 精品国产区 | 亚洲综合情 | 欧美精品天堂 | 欧美国产日韩激情 | 成人免费视频免费观看 | 亚洲精品视频www | 亚洲 综合 国产 精品 | 久久欧美在线电影 | 亚洲国产精品一区二区久久hs | 91九色在线播放 | 久久ww | 国产亚洲午夜高清国产拍精品 | 亚洲国产视频a | 亚洲h视频在线 | 热精品 | 啪啪免费试看 | 色香天天 | 91成人精品一区在线播放 | 精品亚洲免费视频 | 日日夜夜中文字幕 | 91精品国产欧美一区二区 | 国产精品爽爽久久久久久蜜臀 | 波多野结衣一区 | 国产裸体视频bbbbb | 97在线免费观看视频 | 日本高清xxxx | 久久综合福利 | 国产片网站 | 最近中文字幕免费大全 | 日日夜夜精品 | 色视频网站免费观看 | 久久精品小视频 | 国产又粗又猛又爽又黄的视频先 | 五月天六月婷 | 黄色小说在线免费观看 | 正在播放五月婷婷狠狠干 | 91看成人| 在线观看亚洲视频 | 91久久久国产精品 | 色综合狠狠干 | 久久爱www. | 99久久久久免费精品国产 | 国产日韩中文字幕在线 | 国产丝袜美腿在线 | www.亚洲精品视频 | 四虎成人精品在永久免费 | www.在线观看av | 中文字幕文字幕一区二区 | 久久久久久久久影院 | 深夜免费福利在线 | 国产免费亚洲 | 一区二区视 | 久久久久久久99精品免费观看 | 人人爱在线视频 | 四川妇女搡bbbb搡bbbb搡 | 成人av高清| 五月综合激情网 | 日日夜日日干 | 女人18毛片90分钟 | 久久精品网站视频 | 丰满少妇一级 | 91人人人 | 欧美成a人片在线观看久 | 久久久久久久18 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国产精品av一区二区 | 色婷婷激情电影 | 国产精品九九九九九九 | 奇米四色影狠狠爱7777 | 亚洲国产成人久久综合 | 亚洲一级电影 | 亚洲精品乱码白浆高清久久久久久 | 日日干天天爽 | 欧美不卡视频在线 | 亚洲精品小区久久久久久 | 超碰99人人 | 天天色天| 五月天中文字幕mv在线 | 亚洲精品国产视频 | 视频一区二区视频 | 婷婷免费视频 | 人人添人人澡人人澡人人人爽 | 国产高清在线免费观看 | 在线观看国产永久免费视频 | 日本激情视频中文字幕 | 国产免费大片 | 99视频精品全国免费 | 狠狠天天 | 国产精品视频内 | 日韩欧美一区二区三区视频 | 黄色av电影在线观看 | 最新国产精品久久精品 | 成人av免费电影 | 国产精品久久久久久久久久ktv | 精品国产a | 国产午夜不卡 | 国产精品综合av一区二区国产馆 | 亚洲影院色 | 天天干天天搞天天射 | 精品一区二区三区久久久 | 久久看视频 | 国产精品videossex国产高清 | 精品国产一区二区三区男人吃奶 | 伊人天天干| 蜜臀av夜夜澡人人爽人人桃色 | 91中文字幕永久在线 | 国产亚洲精品久久久久久无几年桃 | 国产精品手机在线 | 久久99精品波多结衣一区 | 天天综合成人 | 9999亚洲 | 91原创在线观看 | 国产伦理久久精品久久久久_ | 婷婷久久国产 | 国产五月色婷婷六月丁香视频 | 午夜精品一区二区三区免费 | 精品一区二区在线播放 | 99在线视频精品 | 人人插人人做 | 免费在线观看污 | 国产精品国产三级国产aⅴ无密码 | 黄色免费大片 | 亚洲电影网站 | 国产亚洲精品成人 | 成人a视频 | 激情视频免费观看 | 超碰在线天天 | 欧美精品一区二区在线播放 | 91中文字幕一区 | 午夜精品福利一区二区三区蜜桃 | 免费高清无人区完整版 | 99九九热只有国产精品 | 香蕉国产91 | 国产精品一区二区久久精品 | 精品一二三区 | 亚洲综合在线视频 | 一级一片免费视频 | 韩国av不卡 | 黄色大片入口 | 欧美色图亚洲图片 | 91精品久久香蕉国产线看观看 | 在线观看视频你懂 | 日韩在线观看影院 | 亚洲国产免费 | 亚洲综合视频在线 | 一区二区三区免费 | 啪啪免费视频网站 | 国产精品久久久久久久久大全 | 一区二区中文字幕在线播放 | 999ZYZ玖玖资源站永久 | 欧美一区二区伦理片 | 国产一区二区久久精品 | 97在线看| 欧洲精品视频一区 | 亚洲精品综合欧美二区变态 | 在线观看www91 | 一级一片免费看 | 天天射天天艹 | 久久福利在线 | 国语自产偷拍精品视频偷 | 免费国产亚洲视频 | 中文国产在线观看 | 奇米7777狠狠狠琪琪视频 | 丝袜+亚洲+另类+欧美+变态 | 主播av在线 | 久久久亚洲国产精品麻豆综合天堂 | 久久久wwww| 亚洲高清视频在线播放 | 成人在线观看av | 一区二区三区在线电影 | 久久综合网色—综合色88 | 亚洲精品播放 | 国产精品资源在线 | 精品中文字幕在线观看 | 日韩有码在线播放 | 免费人成网 | 天天爽夜夜爽人人爽一区二区 | 国产成人av免费在线观看 | 天天操天天弄 | 色综合久久五月天 | 国产一二三四在线视频 | 最近中文字幕国语免费高清6 | 欧美精品九九99久久 | 久久精品国产精品亚洲精品 | 精品国产免费观看 | 日韩免费在线视频观看 | 天天操夜夜干 | 成年人免费在线观看 | 欧美精品国产综合久久 | 久热av | 成人午夜剧场在线观看 | 亚洲黄色精品 | 色天天综合久久久久综合片 | 国产一区精品在线 | 欧美日韩一区二区久久 | 国产精品一区二区久久 | 亚洲一区二区三区91 | 日韩二区在线 | 国产精品久久久久久久久久免费看 | 中文字幕亚洲情99在线 | 日韩极品视频在线观看 | 亚洲第一av在线 | 免费日韩一级片 | 久久久久国产精品厨房 | 精品一区 在线 | 激情九九 | 久久极品| 国产在线精 | 国产精品免费一区二区三区在线观看 | 日韩在线视频精品 | 国产在线一区二区 | 亚洲精品乱码久久久久久写真 | 国产伦精品一区二区三区在线 | 国产成人三级在线 | 香蕉蜜桃视频 | 精品国产美女 | 亚洲欧美日韩国产 | 在线免费观看国产精品 | 日本性动态图 | 一区二区三区在线免费观看视频 | 韩国一区二区三区视频 | 99精品视频免费观看视频 | 成人在线观看你懂的 | 亚洲欧美怡红院 | 成人国产精品久久久久久亚洲 | 精品黄色在线 | 狠狠色婷婷丁香六月 | 69亚洲乱| 日韩精品一区二区三区视频播放 | free. 性欧美.com | 99久久久国产精品免费99 | 这里只有精彩视频 | 五月天亚洲激情 | 免费a v视频 | 97色视频在线 | 日韩区欠美精品av视频 | 国内少妇自拍视频一区 | 91视频啊啊啊 | 国产精品视频久久久 | 免费福利视频网站 | 久久高清毛片 | 成年人免费电影在线观看 | 欧美激情视频一区 | 最近日本中文字幕 | 亚洲欧美国产精品18p | 国产精品女人网站 | 国产视频精品网 | 综合激情av | 色婷在线 | 日韩高清免费观看 | 免费在线观看av不卡 | 亚洲精品国产麻豆 | 国产精品高清免费在线观看 | 亚洲jizzjizz日本少妇 | 免费手机黄色网址 | 亚洲精品成人在线 | 中文字幕超清在线免费 | 在线小视频你懂得 | 国产精品一区久久久久 | 亚洲综合色丁香婷婷六月图片 | 久久久网页 | 色就是色综合 | 国产一级性生活 | 麻豆视频免费 | 国产中文自拍 | 免费麻豆 | 久久精彩免费视频 | 日韩成人xxxx | 九九在线免费视频 | 精品久久久久久久久久 | 99免费精品| 精品一区二区影视 | 国产黄a三级三级 | 午夜视频99 | 精品国产乱码一区二区三区在线 | 在线导航av | 成人av免费在线播放 | 日韩视频在线播放 | 中文字幕亚洲不卡 | 国产黄色在线看 | av免费观看在线 | 在线小视频国产 | 国产精品日韩高清 | 蜜臀久久99静品久久久久久 | 天天综合成人 | 香蕉视频色 | 国产欧美综合在线观看 | 免费在线视频一区二区 | 久久人人97超碰精品888 | 91你懂的 | 精品国产伦一区二区三区观看方式 | 激情五月婷婷综合网 | 国产黄色精品在线 | 久久精品国产免费 | 国产精品 视频 | 免费午夜视频在线观看 | 免费看色的网站 | 日本久久成人中文字幕电影 | 国产精品video爽爽爽爽 | 国产精品男女啪啪 | 中文字幕在线观看视频免费 | 毛片网站在线看 | 在线不卡视频 | 中文字幕网址 | 欧美夫妻生活视频 | a级成人毛片 | 亚洲精品黄 | 亚洲成人资源在线观看 | 日韩影视精品 | 中文字幕一区二区在线观看 | 蜜桃av久久久亚洲精品 | 丁香六月网 | 午夜精品久久久久久久久久 | www亚洲视频 | 狠狠的操| 日韩欧美一区二区三区免费观看 | 91成人精品国产刺激国语对白 | 在线国产日本 | 丝袜+亚洲+另类+欧美+变态 | 久久成人精品电影 | 国产在线观看网站 | 性色xxxxhd| 字幕网av | 久久久久久久精 | 日韩成人欧美 | 亚洲精品国产精品国自产观看浪潮 | 国产精品久久久久久久久久妇女 | 色婷婷亚洲婷婷 | 久久精品视频3 | 97国产在线播放 | 亚洲乱码中文字幕综合 | 国产黄色片久久 | av黄色免费看 | 天天玩天天干天天操 | 中文字幕免费在线 | 不卡的av | 国产精品一区二区av | 亚洲国产中文在线观看 | 在线观看视频一区二区三区 | 国产a高清 | 欧美伊人网 | 丝袜美女在线观看 | 欧美亚洲精品一区 | 91亚洲精品久久久 | 色综合中文字幕 | 精品亚洲网 | 成人va天堂| 国产999免费视频 | 欧美日韩三级在线观看 | 五月花丁香婷婷 | 精品资源在线 | 久久综合综合久久综合 | 日韩一片| 日韩在线 一区二区 | 亚洲免费在线观看视频 | 色丁香婷婷 | 日韩在线观看一区二区 | 91视频免费视频 | 久久成人综合 | 国产精品久久久久久久久久ktv | 久久免费一 | 欧美日韩国产页 | 又黄又爽的视频在线观看网站 | 九九免费在线看完整版 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲精品激情 | 亚洲三级性片 | 久久久久欠精品国产毛片国产毛生 | 久久久久一区二区三区 | 国产一区二区免费看 | 日日干,天天干 | 国产资源在线播放 | 日韩国产精品一区 | 一级理论片在线观看 | 九九热精 | 99视频免费 | 国产一区网址 | 国产精品一区二区久久精品爱微奶 | 色天天综合久久久久综合片 | 一级性生活片 | 成人av一级片 | av一区二区三区在线播放 | 99视频99 | 91久久久国产精品 | 国产乱对白刺激视频在线观看女王 | 九色一区二区 | 欧美一区二区三区免费看 | 在线免费观看av网站 | 欧美午夜a| 天天爽人人爽夜夜爽 | 精品久久久影院 | 国产精品第2页 | 亚洲国产精品成人av | 色视频在线免费观看 | 在线欧美小视频 | 美女免费黄网站 | 精品国产亚洲一区二区麻豆 | 爱情影院aqdy鲁丝片二区 | 中文字幕888 | 免费一级毛毛片 | 成人蜜桃 | 久久久久亚洲精品中文字幕 | japanesexxxhd奶水 国产一区二区在线免费观看 | 天天综合入口 | 免费观看国产精品视频 | 六月激情网 | 午夜精品视频一区 | 夜夜看av| 天天操天天操天天操 | 中文字幕在线观看完整版电影 | 久久久久久久久久久成人 | 欧美粗又大 | 激情网站网址 | 免费av观看 | 00av视频 | 国产亚洲精品久久久久久久久久 | 久久久国产精品久久久 | 久久伊人五月天 | 99视频一区二区 | 国产黄色播放 | 日日碰狠狠添天天爽超碰97久久 | 99日韩精品 | 精品久久国产一区 | 国产精品视频全国免费观看 | 激情网婷婷 | 久久视频在线观看免费 | 欧美一级片免费在线观看 | 激情丁香久久 | 国产精品五月天 | 成在人线av | 视频一区二区视频 | 亚洲电影影音先锋 | 五月开心激情网 | 欧美视屏一区二区 | 国产成人一级 | 亚洲国产日韩在线 | 国产成人精品久久二区二区 | 91久久影院| 91探花视频 | 国产97碰免费视频 | 国产午夜精品理论片在线 | 日韩av中文在线 | 国产综合香蕉五月婷在线 | 在线免费观看麻豆视频 | 黄色av网站在线免费观看 | 欧美日韩一区二区在线 | 特级毛片在线免费观看 | 最新色站 | 中文字幕资源在线观看 | 91专区在线观看 | 一区二区三区免费在线观看 | 色先锋av资源中文字幕 | 97国产情侣爱久久免费观看 | 亚洲一区二区三区毛片 | 免费日韩在线 | 久久人人爽人人爽人人 | 国产精品一区二区精品视频免费看 | 久久久综合 | 欧美精品久久久 | 精品主播网红福利资源观看 | 成年人毛片在线观看 | 在线观看亚洲电影 | 日韩一二区在线观看 | 国产成人精品午夜在线播放 | 丁香婷婷深情五月亚洲 | 日本99精品 | 久久综合精品国产一区二区三区 | 黄色福利网 | 国产色爽 | 欧美日韩国产高清视频 | 日韩在线网址 | 91免费国产在线观看 | 国产精品18久久久久久久 | 成人精品视频 | 精品美女久久久久 | 日韩高清一 | 国产精品久久久久久婷婷天堂 | 超碰在线观看97 | 韩国精品一区二区三区六区色诱 | 久久久国产一区二区三区 | 精品自拍av| 亚洲成人高清在线 | 在线观看日韩免费视频 | 91麻豆精品国产 | 中文字幕在 | 九九色在线观看 | 国产资源中文字幕 | av在线免费观看黄 | 日韩国产欧美在线视频 | 欧美-第1页-屁屁影院 | 国产成人精品久久久 | www在线免费观看 | 国产aaa免费视频 | 亚洲精品短视频 | 欧美午夜精品久久久久久孕妇 | 九九在线精品视频 | 综合婷婷丁香 | 国产精品video爽爽爽爽 | av三级在线免费观看 | 69视频在线播放 | 免费黄a| 黄色天堂在线观看 | 超碰国产在线播放 | 狠狠色狠狠色合久久伊人 | 日韩精品视频在线观看免费 | 这里只有精品视频在线观看 | 色婷婷九月| 日韩精品一区二区免费视频 | 日韩成片 | 日韩av区 | 黄色一集片 | 在线激情小视频 | 中文字幕在线观看视频一区 | 在线亚洲激情 | 免费av网站观看 | 黄色精品国产 | 亚洲精品国产第一综合99久久 | 久久久久久久久久久影院 | 国产精品美女视频 | 日韩在线播放av | 国内精品国产三级国产aⅴ久 | 日本三级全黄少妇三2023 | 最新中文字幕视频 | 日日干av | 性色av免费看 | 国产精品美女久久久免费 | 国精产品999国精产 久久久久 | 国产欧美在线一区二区三区 | 亚洲精品自拍 | 激情久久影院 | 亚洲一区二区三区在线看 | 一本一本久久aa综合精品 | 99亚洲精品视频 | 久久综合狠狠综合久久综合88 | 国产精品福利在线 | 免费h漫在线观看 | 久久99国产精品免费网站 | 一区二区三区精品久久久 | 中文字幕色婷婷在线视频 | 99r在线| 免费福利片2019潦草影视午夜 | 欧美日韩国产在线观看 | 久久国产片 | 午夜体验区 | 国产精选视频 | 青草视频免费观看 | 2019中文| 中文字幕免 | 久久久久国产精品免费网站 | 六月丁香综合 | 亚洲五月六月 | 成人免费看视频 | 99久久国产免费,99久久国产免费大片 | 日本中文字幕在线电影 | 精品日本视频 | 久久久一本精品99久久精品66 | 久久久久久久网 | 日本精品一区二区三区在线播放视频 | 中文字幕中文字幕在线中文字幕三区 | 97精品在线视频 | 99精品国产高清在线观看 | 国产男男gay做爰 | 国产精品一区二区av影院萌芽 | 日韩精品一区不卡 | 不卡的一区二区三区 | 激情久久综合网 | 91在线播 | 国产精品亚洲片在线播放 | 久久久午夜精品福利内容 | 啪嗒啪嗒免费观看完整版 | 日本xxxx裸体xxxx17| 亚洲综合色激情五月 | 久久精品a | 久久激情综合网 | 欧美日韩在线精品 | 亚洲特级毛片 | 欧美日韩高清 | 久久久久久久久久久久久久电影 | 伊人天堂久久 | 久久精品成人欧美大片古装 | 成片免费观看视频999 | 毛片视频电影 | 日本中文乱码卡一卡二新区 | a色视频 | 一区二区欧美在线观看 | 久久久国产99久久国产一 | 国产麻豆剧果冻传媒视频播放量 | 亚洲欧美日韩国产一区二区三区 | 中文字幕亚洲精品在线观看 | 国产精品久久久久永久免费 | 97影视| 国产综合91 | 亚洲 欧洲 国产 日本 综合 | 一级电影免费在线观看 | 日韩精品中文字幕av | 伊人久久精品久久亚洲一区 | 久久999久久 | 中文字幕欧美日韩va免费视频 | 中文字幕在线播放日韩 | 国产精品久久久久久久久久了 | 99 色 | 欧美一级片在线免费观看 | 免费色黄 | av一级片在线观看 | 日韩天天综合 | 久久综合精品国产一区二区三区 | 国产精品网红福利 | 97超碰免费在线 | av电影免费看 | 99操视频| 国产一区二区三区高清播放 | 欧美性色网站 | 色综合久久久网 | 久操视频在线 | 深爱激情五月综合 | 国产精品国产三级国产aⅴ9色 | 国内精品久久久久国产 | 国产色爽 | 国产网站av | 日韩成人精品 | 一区二区三区四区精品 | 亚洲美女免费精品视频在线观看 | 日日爽夜夜操 | 伊人影院av | 欧美日韩久久不卡 | 欧美色伊人 | 999精品视频 | 日韩国产精品久久久久久亚洲 | 中文字幕国产精品 | 国产福利91精品张津瑜 | 欧美另类xxxx | 97在线观看免费高清 | 国产精品女 | 亚洲无吗视频在线 | 国产99久久精品一区二区永久免费 | 免费观看黄色12片一级视频 | 欧美日本一二三 | 一区二区欧美在线观看 | 13日本xxxxxⅹxxx20 | 青青河边草免费视频 | 午夜精品久久久久久久99无限制 | 五月激情丁香图片 | 黄色午夜| 美女网站色| 精品中文字幕视频 | 国产色影院 | 午夜av不卡 | 日韩黄色大片在线观看 | 国产精品一区二区三区久久久 | 欧美日韩精品在线观看视频 | 国产精品九九久久久久久久 | 夜又临在线观看 | 在线小视频国产 | 国产精品一级视频 | 午夜在线看 | 国产一级黄色片免费看 | 久久久久久久国产精品影院 | 亚洲一区二区精品视频 | 草樱av | 久草在线免费播放 | 国产精品99久久久久久有的能看 | 人人爽人人爱 | 国产专区精品视频 | 在线免费视频一区 | 中文字幕第一页av | 狠狠操综合| 超碰97国产精品人人cao | 成人av地址 | 最近中文国产在线视频 | 天天综合天天做 | 久久久久久免费 | 五月婷婷久久丁香 | 91久久精品一区二区三区 | 黄色免费网站 | 欧美激情h | 久久影院一区 | 色橹橹欧美在线观看视频高清 | 久久草在线视频国产 | 国产99一区视频免费 | 欧美日韩国产精品爽爽 | 免费黄色av片 | 91成人免费在线 | 日本99热 | 成年人免费看 | 五月婷婷av| 又黄又爽的视频在线观看网站 | 国产美女免费观看 | 97精品国自产拍在线观看 | av中文在线| 免费看黄网站在线 | 色www免费视频 | 日韩视频图片 | 成人羞羞视频在线观看免费 | 日韩精品免费一区二区在线观看 | 在线看欧美 | 国产精品毛片一区二区 | 欧美人操人 |