在浏览器中呈现HTTP请求之前,是否有可能拦截HTTP请求并修改数据(例如,使用正则表达式替换内容)?如果是这样,怎么办?

Kus*_*ush 5 c c++ network-programming

今天,我偶然发现了能够拦截您PC上所有网络流量的Wireshark。我想知道是否可以在请求后修改数据(因此将数据发送回PC)并使用正则表达式进行修改?像在浏览器中呈现数据之前替换数据中的单词和图案吗?(例如:将mad替换为happy或将整个网站替换为“停止拖延”)

如果可能的话:

  • 我应该如何实施?哪些功能必不可少?
  • 是否有任何开源库可以帮助我实现这一目标?
  • 在执行此操作之前,我应该做任何事先阅读吗?

请注意,该平台将是Windows,我将尝试使用C ++进行。

Bas*_*sil 5

为此,可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

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


smo*_*fra 2

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