在浏览器中呈现数据之前,是否可以拦截http请求并修改数据(例如使用regex替换内容)?如果是,如何

Is it possible to intercept http requests and modify the data (eg replace content using regex) before it renders in the browser? If so, how?

本文关键字:数据 regex 替换 如果 如何 修改 请求 浏览器 是否 http      更新时间:2023-10-16

今天我偶然发现了Wireshark,它能够拦截你电脑上的所有网络流量。我想知道是否可以在请求后修改数据(因此是发送回电脑的数据)并使用regex进行修改?就像在浏览器中呈现之前替换数据中的单词和模式一样?(例如:将单词mad替换为happy,或者将整个网站替换为"停止拖延")

如果可能:

  • 我应该如何实施它?哪些功能是必不可少的
  • 有什么开源库可以帮助我完成这项工作吗
  • 在实施之前,我是否应该先阅读一些内容

请注意,这个平台将是Windows,我将尝试在C++中这样做

您可以为此目的使用WinDivert(LGPL)(免责声明:WinDivert是我的项目)。WinDivert是一个用户模式API,它将一些内核模式WFP调用驱动程序功能提升到用户空间。

伪代码看起来像这样:

HANDLE handle = DivertOpen(
    "inbound && "                // Inbound packets
    "tcp.SrcPort == 80 && "      // HTTP
    "tcp.PayloadLength > 0",     // Data
    0, 0, 0);
while (TRUE)
{
    // Capture a packet.
    DivertRecv(handle, buf, size, &addr, &len);
    // Modify the packet.
    ...
    // Re-inject modified packet.
    DivertSend(handle, buf, len, &addr, NULL);
}

请注意,WinDivert是数据包级别的,因此HTTP流可能会被拆分为多个数据包,这可能会使事情变得复杂。

您所描述的被称为"透明代理"。(假设您没有修改浏览器)。您通常需要操作系统的一些帮助才能进入浏览器和网络,或者您需要在单独的路由器中实现代理。在linux中,这可以通过iptables来实现。我想窗户也有类似的功能。

对于windows 7/vista,您可以使用windows筛选平台(WFP),它允许您在不同层插入挂钩,访问这些数据包,修改它们,并将它们重新注入tcp/ip堆栈。对于Mac操作系统,您可以使用带有ipfw的转接插座。所以你在ipfw上设置了一个规则,将某些数据包转移到"divert socket",进行修改,然后重新注入。

顺便说一句,wireshark并没有真正拦截流量,它只是转储流量~