gpt4 book ai didi

c - 如何劫持所有本地http请求并使用c提取url?

转载 作者:太空狗 更新时间:2023-10-29 17:16:17 26 4
gpt4 key购买 nike

我应该往哪个方向发展(图书馆文档)?

更新

有人可以说明如何使用 winpcap 来完成这项工作吗?

更新 2

如何验证数据包是否为 HTTP 数据包?

最佳答案

如果您所说的“劫持”是指嗅探数据包,那么您应该使用 WinPcap 执行以下操作:

  1. 找到您要使用的设备 - See WinPcap tutorial .

  2. 使用pcap_open打开一个设备

    // Open the device
    char errorBuffer[PCAP_ERRBUF_SIZE];
    pcap_t *pcapDescriptor = pcap_open(source, // name of the device
    snapshotLength, // portion of the packet to capture
    // 65536 guarantees that the whole packet will be captured on all the link layers
    attributes, // 0 for no flags, 1 for promiscuous
    readTimeout, // read timeout
    NULL, // authentication on the remote machine
    errorBuffer); // error buffer
  3. 使用从描述符中读取数据包的函数,如 pcap_loop

    int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);

    这将循环直到发生错误或使用特殊方法调用中断循环。它将为每个数据包调用函数指针。

  4. 在函数指向的实现中解析数据包,它应该看起来像一个pcap_handler:

    typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
    const u_char *);
  5. 现在你所要做的就是解析它们的缓冲区在 const u_char* 中并且它们的长度在 pcap_pkthdr 结构中的数据包 caplen 字段。

    假设您有 HTTP GET over TCP over IPv4 over Ethernet 数据包,您可以:

    • 跳过以太网 header 的 14 个字节。
    • 跳过 IPv4 header 的 20 个字节(假设没有 IPv4 选项,如果您怀疑 IPv4 选项是可能的,您可以读取 IPv4 header 的 5-8 位,将其乘以 4,这就是数字IPv4 header 占用的字节数)。
    • 跳过 TCP header 的 20 个字节(假设没有 TCP 选项,如果您怀疑 TCP 选项是可能的,您可以读取 TCP header 的 96-99 位,将其乘以 4,这就是数字TCP header 占用的字节数)。
    • 数据包的其余部分应该是 HTTP 文本。第一个和第二个空格之间的文本应该是 URI。如果它太长,您可能需要进行一些 TCP 重建,但大多数 URI 都足够小以适合一个数据包。

      更新:在代码中看起来像这样(我写的时候没有测试):

      int tcp_len, url_length;
      uchar *url, *end_url, *final_url, *tcp_payload;

      ... /* code in http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html */

      /* retireve the position of the tcp header */
      ip_len = (ih->ver_ihl & 0xf) * 4;

      /* retireve the position of the tcp payload */
      tcp_len = (((uchar*)ih)[ip_len + 12] >> 4) * 4;
      tcpPayload = (uchar*)ih + ip_len + tcp_len;

      /* start of url - skip "GET " */
      url = tcpPayload + 4;

      /* length of url - lookfor space */
      end_url = strchr((char*)url, ' ');
      url_length = end_url - url;

      /* copy the url to a null terminated c string */
      final_url = (uchar*)malloc(url_length + 1);
      strncpy((char*)final_url, (char*)url, url_length);
      final_url[url_length] = '\0';

您还可以通过创建和设置 BPF 来仅过滤 HTTP 流量。 See WinPcap tutorial .您可能应该使用过滤器 "tcp and dst port 80",它只会给您计算机发送到服务器的请求。

如果您不介意使用 C#,可以尝试使用 Pcap.Net ,这会为您更轻松地完成所有这些工作,包括解析数据包的以太网、IPv4 和 TCP 部分。

关于c - 如何劫持所有本地http请求并使用c提取url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2703238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com