繁体   English   中英

从Qt应用程序获取原始数据包数据

[英]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和标头,并更改它们或取消请求。

但是......您想要访问每个请求的请求和回复数据。

访问请求很简单,已经通过自定义QNetworkAccessManagercreateRequest()方法的覆盖来解释。 但是让我们谈谈另一部分:

  • 对于我所看到的,从请求中获得的回复是只读的,并且不能更改 ,因为它在QNetworkReply的源代码中是硬编码的。

  • 不能使用 QNetworkReplywriteData()函数,因为硬编码只需return -1

  • 您可以尝试子类化自己的QNetworkReply ,并在自定义QNetworkAccessManagercreateRequest()方法中返回它。 您必须覆盖函数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)并侦听本地主机上的连接的进程。

您必须通过以下方式实现代理协议:

  1. 分析GET和POST操作,
  2. 接收整个请求作为二进制传输,
  3. 篡改请求,
  4. 在连接中将获取的请求发送到目标IP,
  5. 然后你可以捕获回复,
  6. 篡改收到的回复,并且
  7. 将生成的响应发送到客户端webView。

在这里,我没有经验,但路径似乎很清楚。 这将是一个很多编码,但我认为这是一个很好的选择,如果不是唯一的选择

更重要的是: 它可以做到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM