6

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

如果这是可能的:

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

请注意,此平台将是 Windows,我将尝试在 C++ 中执行此操作

4

3 回答 3

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);
}

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

于 2012-10-24T16:02:43.713 回答
2

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

于 2012-08-24T19:01:02.753 回答
1

对于 windows 7/vista,您可以使用 Windows Filtering Platform (WFP),它允许您在不同的层插入挂钩,访问这些数据包,修改它们,并将它们重新注入 tcp/ip 堆栈。对于 Mac OS,您可以将转移套接字与 ipfw 一起使用。因此,您在 ipfw 上设置了一条规则,将某些数据包转移到“转移套接字”,进行修改,然后重新注入。

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

于 2012-08-26T00:09:39.850 回答