绍兴建设图审网站,自媒体网站源码模板dede,动图制作网站,汝南网站建设目标#xff1a;制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能#xff0c;但是集成到自己的app内#xff0c;这样无需修改系统代理设置#xff0c;使用QWebengineview通过自建的代理服务器#xff0c;即可实现https包的实时监测、注入等自定义功能…目标制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能但是集成到自己的app内这样无需修改系统代理设置使用QWebengineview通过自建的代理服务器即可实现https包的实时监测、注入等自定义功能。
实现 一、https代理服务器
1.使用QSslSocket类收发https包使用多线程提升代理服务器的性能。
ProxyClientThread.h
#ifndef PROXYCLIENTTHREAD_H
#define PROXYCLIENTTHREAD_H#include QObject
#include QTcpSocket
#include QNetworkProxy
#include QThread
#include QDebug
#include QSslSocket
#include QSslConfiguration
#include QFile
#include QSslKey
#include QByteArray
#include QtZlib/zlib.h
#include QRegularExpressionstruct HTTPHDR{QString host;quint16 port;bool newReq;
};struct HTTPHDR2{quint8 CMD;QString CMDi;QString HOST;quint16 PORT;bool status;
};enum ClientConnectionState {InitialRequest,TlsHandshake,DataTransfer
};class ProxyClientThread : public QThread
{Q_OBJECTpublic:ProxyClientThread(qintptr sockDesc, QObject *parent 0);~ProxyClientThread();void run();QByteArray LastResquest;private:QSslSocket clientSocket;QSslSocket serverSocket;QSslConfiguration sslConfig;int m_client_state0;bool m_serverSocketConnectedfalse;QByteArray cNewReqData;QByteArray clientSockData;QByteArray serverSockData;void processClient();HTTPHDR2 processHeader(QByteArray hdr);bool loadCertificateAndKey();//HTTPHDR getHostInfo(QByteArray httpHeaderPartial);int pid;bool targetFoundfalse;//是否找到要注入的目标bool istargetHeadertrue;//是否头部bool finishInjectfalse;//已完成注入QString cachedStr;//缓存的内容private slots:void clientSockReadyRead();void serverSockConnected();void clientSockDisconnected();void serverSockDisconnected();void serverSockReadyRead();void clientTlsHandOk();void serverSockError(QAbstractSocket::SocketError errorMsg);void clientSockError(QAbstractSocket::SocketError errorMsg);signals:void complete();
};#endif // PROXYCLIENTTHREAD_HProxyClientThread.cpp部分代码
#include proxyclientthread.h//#define DEBUG 1
QString keyFile9291.0d30ab5b.js;
QString keyStr}else eawait V.ImSdk.sendMessage({text:r,textExtra:a,referenceMessage:eQ;
QString injectStr,window.MySendMsge;
ProxyClientThread::ProxyClientThread(qintptr sockDesc, QObject *parent) : QThread(parent)
{this-pid sockDesc;//服务端连接connect (this-serverSocket,SIGNAL(disconnected()),this,SLOT(serverSockDisconnected()));connect (this-serverSocket,SIGNAL(readyRead()),this,SLOT(serverSockReadyRead()));connect (this-serverSocket,SIGNAL(errorOccurred(QAbstractSocket::SocketError)),this,SLOT(serverSockError(QAbstractSocket::SocketError)));connect (this-serverSocket,SIGNAL(connected()),this,SLOT(serverSockConnected()));this-serverSocket.setProxy(QNetworkProxy::NoProxy);//客户端m_client_stateInitialRequest;//客户端状态为初始化状态this-clientSocket.setSocketDescriptor(sockDesc);connect(this-clientSocket, SIGNAL(disconnected()),this,SLOT(clientSockDisconnected()));connect(this-clientSocket, SIGNAL(readyRead()),this,SLOT(clientSockReadyRead()),Qt::DirectConnection);connect(this-clientSocket, SIGNAL(encrypted()), this, SLOT(clientTlsHandOk()));connect(this-clientSocket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(clientSockError(QAbstractSocket::SocketError)));
}void ProxyClientThread::clientSockReadyRead()
{this-processClient();return;
}
void ProxyClientThread::processClient()
{HTTPHDR2 pHead;//recieved incoming client packetthis-clientSockData.clear();this-clientSockData this-clientSocket.readAll();#ifdef DEBUGqDebug()this-pid**收到客户端数据this-clientSockData;#endif//查找匹配文件请求QString reqStrQString(clientSockData);if(reqStr.contains(GET) and reqStr.contains(keyFile)){targetFoundtrue;qDebug()找到要注入的文件--------------reqStr;//修改请求头不压缩reqStr.replace(Accept-Encoding: gzip, deflate, br,Accept-Encoding: identity);clientSockDatareqStr.toLocal8Bit();}if (this-serverSocket.state() QAbstractSocket::ConnectedState){#ifdef DEBUGqDebug() this-pid: 4.2.向服务器发送请求:;//this-clientSockData;#endifserverSocket.write(clientSockData);return;}//处理 headerpHead this-processHeader(clientSockData.mid(0,100));if (!pHead.status){this-LastResquest this-clientSockData;return;}//process SSL/TLS Connection;if (pHead.CMD 3){ //CONNECT类型if (serverSocket.state() QAbstractSocket::UnconnectedState){#ifdef DEBUGqDebug() this-pid: 1.收到客户发起CONNECT连接 pHead.CMD pHead.HOST pHead.PORT;#endifm_client_stateTlsHandshake;//握手状态serverSocket.connectToHostEncrypted(pHead.HOST, pHead.PORT);return;}}if (serverSocket.state() QAbstractSocket::UnconnectedState){#ifdef DEBUGqDebug()***连接服务器;#endifLastResquestclientSockData;serverSocket.connectToHostEncrypted(pHead.HOST,pHead.PORT);return;}return;
}void ProxyClientThread::clientTlsHandOk(){//clientSockData clientSocket.readAll();//读取客户端请求#ifdef DEBUGqDebug()this-pid: 4.-- 已经和客户端ssl握手成功:LastResquest;#endifserverSocket.write(LastResquest);}...}/** 加载自签名证书
*/
bool ProxyClientThread::loadCertificateAndKey() {QFile certFile(:/certs/server.crt);if (!certFile.open(QIODevice::ReadOnly)) {qWarning() Certificate file not found!;return false;}QSslCertificate cert(certFile);QFile keyFile(:/certs/server.key);if (!keyFile.open(QIODevice::ReadOnly)) {qWarning() Private key file not found!;return false;}QSslKey key(keyFile, QSsl::Rsa);sslConfig.setLocalCertificate(cert);sslConfig.setPrivateKey(key);sslConfig.setProtocol(QSsl::TlsV1_2);return true;
}
3.proxyserver.h
#ifndef PROXYSERVER_H
#define PROXYSERVER_H#include QObject
#include QTcpServer
#include QTcpSocket
#include QDebug
#include QTcpServer
//#include proxyclient.h
#include proxyclientthread.hclass proxyServer : public QTcpServer {Q_OBJECTpublic:explicit proxyServer(QObject* parent nullptr) : QTcpServer(parent) {}protected:void incomingConnection(qintptr socketDescriptor) override {// 创建子线程并传递 socket 描述符ProxyClientThread* workerThread new ProxyClientThread(socketDescriptor, this);// 启动子线程workerThread-run();}
};#endif // PROXYSERVER_H代码的逻辑其实不难按照代理服务器的连接过程补全相关代码就可以了。
二、QWebengineView部分
使用代理服务连接该设置仅在app内有效不影响其他应用。
设置QWebengineView的page忽略证书错误因为是自签名证书不处理的话无法访问https页面。
// 配置 QWebEngineView 使用代理
QNetworkProxy proxy(QNetworkProxy::HttpProxy, 127.0.0.1, 8787);
QNetworkProxy::setApplicationProxy(proxy);//忽略证书错误
connect(webPage,SIGNAL(certificateError(QWebEngineCertificateError)),this,SLOT(on_certerror(QWebEngineCertificateError)));void xxxx::on_certerror(QWebEngineCertificateError certerror){auto mutableError const_castQWebEngineCertificateError(certerror);mutableError.acceptCertificate();qDebug()忽略证书错误。;if(certerror.type()QWebEngineCertificateError::CertificateAuthorityInvalid){auto errorconst_castQWebEngineCertificateError(certerror);qDebug()忽略证书错误。;error.acceptCertificate();}
}
经过验证这个方案可行可以在代理服务器端修改客户端发起的请求也可以修改服务器端返回的任何数据已解密过的后再返回给客户端但是前提是要做好对应的处理工作比如Content-length记得要修改。 文章转载自: http://www.morning.ffmx.cn.gov.cn.ffmx.cn http://www.morning.rgxf.cn.gov.cn.rgxf.cn http://www.morning.qtzwh.cn.gov.cn.qtzwh.cn http://www.morning.bhpsz.cn.gov.cn.bhpsz.cn http://www.morning.fdrch.cn.gov.cn.fdrch.cn http://www.morning.wrtsm.cn.gov.cn.wrtsm.cn http://www.morning.wqbrg.cn.gov.cn.wqbrg.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.mpnff.cn.gov.cn.mpnff.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn http://www.morning.lcbnb.cn.gov.cn.lcbnb.cn http://www.morning.qbfkz.cn.gov.cn.qbfkz.cn http://www.morning.xbdrc.cn.gov.cn.xbdrc.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.fnlnp.cn.gov.cn.fnlnp.cn http://www.morning.ygqhd.cn.gov.cn.ygqhd.cn http://www.morning.sfwd.cn.gov.cn.sfwd.cn http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn http://www.morning.rwyd.cn.gov.cn.rwyd.cn http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.xkjqg.cn.gov.cn.xkjqg.cn http://www.morning.bxsgl.cn.gov.cn.bxsgl.cn http://www.morning.ghwtn.cn.gov.cn.ghwtn.cn http://www.morning.jpwkn.cn.gov.cn.jpwkn.cn http://www.morning.gfrtg.com.gov.cn.gfrtg.com http://www.morning.fkfyn.cn.gov.cn.fkfyn.cn http://www.morning.mlgsc.com.gov.cn.mlgsc.com http://www.morning.hrydl.cn.gov.cn.hrydl.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.hffjj.cn.gov.cn.hffjj.cn http://www.morning.llxyf.cn.gov.cn.llxyf.cn http://www.morning.qtwd.cn.gov.cn.qtwd.cn http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn http://www.morning.oumong.com.gov.cn.oumong.com http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.fxqjz.cn.gov.cn.fxqjz.cn http://www.morning.hlfnh.cn.gov.cn.hlfnh.cn http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn http://www.morning.fqpyj.cn.gov.cn.fqpyj.cn http://www.morning.gthgf.cn.gov.cn.gthgf.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.gwmny.cn.gov.cn.gwmny.cn http://www.morning.snrhg.cn.gov.cn.snrhg.cn http://www.morning.hcwlq.cn.gov.cn.hcwlq.cn http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.3jiax.cn.gov.cn.3jiax.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.fqqcn.cn.gov.cn.fqqcn.cn http://www.morning.ygkq.cn.gov.cn.ygkq.cn http://www.morning.fqljq.cn.gov.cn.fqljq.cn http://www.morning.stpkz.cn.gov.cn.stpkz.cn http://www.morning.mymz.cn.gov.cn.mymz.cn http://www.morning.aowuu.com.gov.cn.aowuu.com http://www.morning.dzqr.cn.gov.cn.dzqr.cn http://www.morning.gkmwx.cn.gov.cn.gkmwx.cn http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn http://www.morning.rmppf.cn.gov.cn.rmppf.cn http://www.morning.rfwkn.cn.gov.cn.rfwkn.cn http://www.morning.rggky.cn.gov.cn.rggky.cn http://www.morning.bkjhx.cn.gov.cn.bkjhx.cn http://www.morning.qxlgt.cn.gov.cn.qxlgt.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.qcztm.cn.gov.cn.qcztm.cn http://www.morning.zrnph.cn.gov.cn.zrnph.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.dlgjdg.cn.gov.cn.dlgjdg.cn http://www.morning.cthrb.cn.gov.cn.cthrb.cn http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.gqcd.cn.gov.cn.gqcd.cn http://www.morning.cjcry.cn.gov.cn.cjcry.cn http://www.morning.skbkq.cn.gov.cn.skbkq.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.qrwdg.cn.gov.cn.qrwdg.cn http://www.morning.nlrxh.cn.gov.cn.nlrxh.cn http://www.morning.bfcxf.cn.gov.cn.bfcxf.cn