C++ 从Qt应用程序获取原始数据包数据
我正在寻找一种方法来访问和篡改Qt应用程序发送和接收的原始数据包数据,但找不到任何东西。有什么办法吗? 或者,如果不是应用程序,则至少提供一种从QWebView访问数据包数据的方法C++ 从Qt应用程序获取原始数据包数据,c++,qt,packet,C++,Qt,Packet,我正在寻找一种方法来访问和篡改Qt应用程序发送和接收的原始数据包数据,但找不到任何东西。有什么办法吗? 或者,如果不是应用程序,则至少提供一种从QWebView访问数据包数据的方法 有什么方法可以实现上述两个目标吗?看起来你想要Wireshark或Fiddler,甚至Charles 这些工具与Qt无关,可用于检查和拦截各种程序的web流量。篡改网络连接中服务器发送/接收的数据的正确方法是通过QNetworkAccessManager 该类允许您向服务器发送请求(可能带有标题)并获取响应(也带有标
有什么方法可以实现上述两个目标吗?看起来你想要Wireshark或Fiddler,甚至Charles
这些工具与Qt无关,可用于检查和拦截各种程序的web流量。篡改网络连接中服务器发送/接收的数据的正确方法是通过
QNetworkAccessManager
该类允许您向服务器发送请求(可能带有标题)并获取响应(也带有标题)
您可以访问相应的QNetworkReply
对象上接收的数据。还有响应的标题:
{
...
QNetworkAccessManager *qnam = new QNetworkAccessManager(this);
connect(qnam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
QNetworkRequest request;
request.setUrl(QUrl("http://stackoverflow.com"));
request.setRawHeader("User-Agent", "Foo browser");
qnam->get(QNetworkRequest(request));
...
}
然后定义插槽:
void MyWidget::replyFinished(QNetworkReply *reply)
{
QByteArray response = reply->readAll();
QString mime = reply->header(QNetworkRequest::ContentTypeHeader).toString();
...
}
请看一下文档和文档
实际上,QWebView
有一个QNetworkAccessManager
对象来执行请求和管理回复。您可以通过QWebPage::networkAccessManager()
方法获得该对象。您可以通过QWebView::page()
从QWebView
获取QWebPage
编辑 要操作由
QWebView
显示的网页,您可以通过webView->setHtml(qstringhtml)
直接设置新的HTML内容
您还可以通过QWebFrame
类的方法直接访问HTML
要获取此类对象,您必须执行以下操作:
QWebFrame *wb = webView->page()->currentFrame();
这些方法是:
用于在字节数组中设置新文档void QWebFrame::setContent(const QByteArray&data,const QString&mimeType=QString(),const QUrl&baseUrl=QUrl())
也这么做,但考虑到html文档的内容void QWebFrame::setHtml(const QString&html,const QUrl&baseUrl=QUrl())
以HTML文档的形式获取内容QString QWebFrame::toHtml()const
与上面相同,为纯文本QString QWebFrame::toPlainText()const
编辑2: 最后,如果您想访问或过滤
QWebView
本身发出的请求,我只能看到一种方法:从QNetworkAccessManager
派生一个类,并重写用于发出请求和接收答案的方法
然后,创建该类的实例并将其设置为QWebView使用的QNetworkAccessManager
让我用一个框架来澄清:
class MyNAM : public QNetworkAccessManager
{
// ...
MyNAM(QObject *parent = 0) : QNetworkAccessManager(parent) { }
// ...
virtual QNetworkReply * createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0) {
// e.g. logging of the request
// e.g. decide if the request must be made
if (some_bool_deciding) {
QNetworkAccessManager::createRequest(op, req, outgoingData);
}
else {
// or faked...
}
// etc.
}
// ...
};
在主应用程序中,您必须:
// ...
MyNAM *nam = new MyNAM();
webview->page()->setNetworkAccessManager(nam);
// ...
从现在起,所有请求都将使用该对象进行
此方法允许完全控制导航器发出的请求:过滤和访问请求数据(标题、get和post值等)。您可以记录请求、分析请求及其POST/GET字段等
希望最终能有所帮助 对不起,山姆,我不能让它工作。我一直在尝试我能想象到的一切,但没有一件事情会像我所希望的那样 让我们列出一个简短的选项列表,以及可以做什么和不能做什么:
- 通过使用
获取webView->page()->currentFrame()
,然后访问QWebFrame
,setContents()
,setHtml()
或toHtml()
等方法,可以访问检索到的网页。通过这些函数,您可以动态更改小部件中显示的网页toPlainText()
- 您可以通过
插槽中的方法replyFinished()
访问针对每个请求接收的原始响应(作为字节数组)reply->readAll()
- 通过在您自己的网络访问管理器中重写
方法,可以拦截请求。在那里,您可以访问请求中发送的URL和标题,并更改它们或取消请求QNetworkAccessManager::createRequest()
QNetworkAccessManager
中重写createRequest()
方法进行了解释。但让我们谈谈另一部分:
- 就我所见,从请求获得的回复是只读的,无法更改,因为它在
的源代码中是硬编码的QNetworkReply
- 您不能使用
的QNetworkReply
函数,因为它被硬编码为只执行writeData()
返回-1
- 您可以尝试将自己的
子类化,并在自定义QNetworkReply
的QNetworkAccessManager
方法中返回它。必须重写函数createRequest()
,readAll()
,以及bytesavable()
。奇怪的是,此方法仅在向非HTTP目的地发出请求时有效。我认为abort()
的内部调用了QNetworkAccessManager
的不同实现,具体取决于所使用的协议(HTTP、FTP等)。所以这在某种意义上是有效的,但不是我们想要的方式。例如,在某些条件下,此方法可用于返回预定义的网页QNetworkReply
- 考虑到
必须返回QNetworkAccessManager::createRequest()
对象,我看不到允许篡改回复字节数组的任何子类组合。它保护得很好,你必须去雷姆QNetworkReply