![](/img/trans.png)
[英]Is there a library that can get the ip addresses and ports from the winpcap raw data of a packet?
[英]Get raw packet data from Qt application
我正在寻找一种方法来访问和篡改Qt应用程序发送和接收的原始数据包数据,但找不到任何东西。 有什么方法吗? 或者如果不是应用程序至少是从QWebView访问分组数据的方法。
有没有办法实现上述两种方法?
篡改在网络连接中发送/接收数据的正确方法是通过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(QString html)
直接设置新的HTML内容。
您还可以通过QWebFrame
类的方法直接访问HTML。
要获得此类对象,您必须:
QWebFrame *wb = webView->page()->currentFrame();
方法是:
void QWebFrame::setContent ( const QByteArray & data, const QString & mimeType = QString(), const QUrl & baseUrl = QUrl() )
用于在字节数组中设置新文档。
void QWebFrame::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() )
也是这样,但考虑到HTML文档的内容。
QString QWebFrame::toHtml () const
将内容作为HTML文档获取。
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);
// ...
从现在开始,所有请求都将使用该对象进行。
此方法允许完全控制导航器发出的请求:过滤和访问请求数据(标头,获取和发布值等)。 您可以记录请求,分析请求及其POST / GET字段等。
希望终于有所帮助!
对不起,山姆,我做不到。 我一直在尝试我能想象到的一切,但没有任何事情可以实现。
让我们列出一个简短的选项列表,以及可以做什么和不可以做什么:
您可以通过使用webView->page()->currentFrame()
获取QWebFrame
,然后访问setContents()
, setHtml()
, toHtml()
或toPlainText()
等方法来访问检索到的网页。 您可以通过这些功能动态更改窗口小部件中显示的网页。
您可以通过replyFinished()
槽中的replyFinished()
reply->readAll()
方法访问为每个请求接收的原始响应(作为一个字节数组replyFinished()
。
通过覆盖您自己的网络访问管理器中的QNetworkAccessManager::createRequest()
方法,可以拦截请求。 在那里,您可以访问请求中发送的URL和标头,并更改它们或取消请求。
但是......您想要访问每个请求的请求和回复数据。
访问请求很简单,已经通过自定义QNetworkAccessManager
的createRequest()
方法的覆盖来解释。 但是让我们谈谈另一部分:
对于我所看到的,从请求中获得的回复是只读的,并且不能更改 ,因为它在QNetworkReply
的源代码中是硬编码的。
你不能使用 QNetworkReply
的writeData()
函数,因为硬编码只需return -1
!
您可以尝试子类化自己的QNetworkReply
,并在自定义QNetworkAccessManager
的createRequest()
方法中返回它。 您必须覆盖函数readAll()
, bytesAvailable()
和abort()
。 奇怪的是, 只有在向非HTTP目标发出请求时 , 此方法才有效 。 我想的内部QNetworkAccessManager
调用的不同实现QNetworkReply
取决于所使用的协议(HTTP,FTP,...)的。 所以这在某种意义上起作用,但不是我们想要的方式。 例如,该方法可用于在某些条件下返回预定义的网页。
考虑到QNetworkAccessManager::createRequest()
必须返回QNetworkReply
对象这一事实,我看不到任何允许在回复的字节数组中进行篡改的子类组合。 它确实受到很好的保护,你必须重新实现这些课程上的所有内容才能实现你的目标。 几乎复制粘贴所有QtNetwork
部分的源类并进行自己的实现。
所以我认为答案是:“ 不,似乎不能完全按照你的要求完成;只是部分地 ”。
抱歉。
看起来你想要Wireshark http://www.wireshark.org/或Fiddler http://www.fiddler2.com/fiddler2/ ,或者甚至是Charles http://www.charlesproxy.com/ 。
这些工具与Qt无关,可用于检查和拦截各种程序的Web流量。
......那么代理服务器呢? 一夜好眠让我想到了这种可能性。
您可以在环回示例和torrent客户端示例之后制作一个。 因此,您可以捕获并篡改请求和回复。
您可以使用webView->page()->networkAccessManager()->setProxy()
在客户端QWebView
上配置代理。
这涉及构建一个侦听所需端口(例如8080)并侦听本地主机上的连接的进程。
您必须通过以下方式实现代理协议:
在这里,我没有经验,但路径似乎很清楚。 这将是一个很多编码,但我认为这是一个很好的选择,如果不是唯一的选择 。
更重要的是: 它可以做到 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.