今天我偶然发现了 Wireshark,它能够拦截您 PC 上的所有网络流量。我想知道是否可以在请求后修改数据(因此发送回PC的数据)并使用正则表达式修改它?就像在浏览器中呈现数据之前替换数据中的单词和模式?(例如:用快乐替换 mad 或用“停止拖延”替换整个网站)
如果这是可能的:
- 我应该如何实施?哪些功能是必不可少的?
- 是否有任何开源库可以帮助我完成此任务?
- 在执行此操作之前,我应该做任何事先阅读吗?
请注意,此平台将是 Windows,我将尝试在 C++ 中执行此操作
今天我偶然发现了 Wireshark,它能够拦截您 PC 上的所有网络流量。我想知道是否可以在请求后修改数据(因此发送回PC的数据)并使用正则表达式修改它?就像在浏览器中呈现数据之前替换数据中的单词和模式?(例如:用快乐替换 mad 或用“停止拖延”替换整个网站)
如果这是可能的:
请注意,此平台将是 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也有类似的功能。
对于 windows 7/vista,您可以使用 Windows Filtering Platform (WFP),它允许您在不同的层插入挂钩,访问这些数据包,修改它们,并将它们重新注入 tcp/ip 堆栈。对于 Mac OS,您可以将转移套接字与 ipfw 一起使用。因此,您在 ipfw 上设置了一条规则,将某些数据包转移到“转移套接字”,进行修改,然后重新注入。
顺便说一句,wireshark 并没有真正拦截流量,它只是转储流量~