今天我偶然发现Wireshark能够拦截PC上的所有网络流量。我想知道是否有可能在请求后修改数据(所以发送回PC的数据)并使用正则表达式修改它?就像在之前替换中的单词和模式一样,它会在浏览器中呈现吗? (示例:用happy替换mad这个词或用“停止拖延”替换整个网站)
如果可能的话:
请注意,此平台将是Windows,我将尝试在C ++中执行此操作
答案 0 :(得分: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流可能会被分割为多个数据包,这可能会使事情变得复杂。
答案 1 :(得分:2)
您所描述的内容称为“透明代理”。 (假设您没有修改浏览器)。您通常需要操作系统的一些帮助才能进入浏览器和网络,或者您需要在单独的路由器中实现代理。在linux中,这可以通过iptables完成。我想windows有类似的功能。
答案 2 :(得分:1)
对于Windows 7 / vista,您可以使用Windows过滤平台(WFP),它允许您在不同的层插入挂钩,访问这些数据包,修改它们,并将它们重新注入tcp / ip堆栈。 对于Mac OS,您可以使用ipfw转移套接字。因此,您在ipfw上设置规则,将某些数据包转移到"转移套接字",进行修改,然后重新注入。
顺便说一句,wireshark并没有真正拦截流量,它只会转发流量〜