HTTP 代理服务器的 C++ 实现与分析:客户端通过代理访问 HTTP 站点的主页劫持流程(软件实现+流程演示+原理讲解)

发布于:2025-08-18 ⋅ 阅读:(11) ⋅ 点赞:(0)

知识点

这里先简单说明3个知识点,了解后,能够让大家更好的理解演示流程。

HTTP(超文本传输协议)是互联网核心应用层协议,基于 TCP/IP,用于客户端与服务器间传输数据。采用请求 - 响应模式:客户端发起请求。

HTTP 代理程序是客户端与目标服务器间的中间服务,接收客户端 HTTP 请求后转发至目标服务器,再将服务器响应回传给客户端。可实现隐藏客户端 IP、缓存数据提速、过滤内容、突破访问限制等功能,是网络请求转发与管控的常用工具。

HTTP 劫持是利用 HTTP 明文传输特性,在数据传输路径中,由中间节点(如代理、路由器等)对 HTTP 数据进行非法拦截、篡改或注入的行为,常见表现为插入广告、强制跳转、窃取信息等,因 HTTP 无加密机制,易被中间节点干预,危害用户体验与安全。

下面将演示下HTTP劫持流程,和关键逻辑。

演示流程

这里我使用C++ Qt框架,创建了一个HTTP代理服务器,程序运行截图如下:

程序结构如下:

HttpProxy/
├── HttpProxy.pro          # 项目工程文件(qmake/makefile配置)
├── Headers/               # 头文件目录
│   └── http_proxy_server.h  # 代理服务器类头文件
└── Sources/               # 源文件目录
    ├── http_proxy_server.cpp # 代理服务器类实现文件
    └── main.cpp           # 程序入口文件

此文章不涉及完整的代码,但在最后会说明关键逻辑。有兴趣的小伙伴可以直接留言等交流。整体流程如下:

详细过程:

① chrome浏览器正常访问站点

② 运行代理程序

② Chrome浏览器配置代理信息

③ 重新访问站点后,发现主页被劫持

此时也看下C++后台打印信息

从中可以看到数据从代理服务器中被流过时,被修改了。

关键逻辑

此代码为示例代码,逻辑简单,关键就是在数据转发时回修改后的数据即可。

具体代码如下。

转发逻辑:

void HttpProxyWorker::onServerReadyRead()
{
    if (m_clientSocket->state() == QAbstractSocket::ConnectedState) {

        //转发的关键
        if(!m_isHack){

            m_isHack = true;
            hackIndex();
        }
//        QByteArray data = m_serverSocket->readAll();
//        m_clientSocket->write(data);
    }
}

正常发送目标站点逻辑:

void HttpProxyWorker::onServerConnected()
{
    qDebug() << "Connected to" << m_targetHost << ":" << m_targetPort;

    // HTTP隧道
    m_serverSocket->write(m_requestData);
}

在此,有小伙伴就会问了,那HTTPS呢?会不会也被劫持。

答案是会的,但存在一定的条件,才能被劫持。这些条件在一般情况下比较难达成。总结起来就是需要破坏证书信任链。要想达到这一步比较难。关键在于“证书信任”, Charles、Fiddler这些知名软件都是这么干的。后面将出个文章详细说明。


网站公告

今日签到

点亮在社区的每一天
去签到