在浏览器中呈现数据之前,是否可以拦截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?
今天我偶然发现了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并没有真正拦截流量,它只是转储流量~
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 使用 boost::regex 更改文件中数据的格式
- 在浏览器中呈现数据之前,是否可以拦截http请求并修改数据(例如使用regex替换内容)?如果是,如何