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

C++ 从Qt应用程序获取原始数据包数据,c++,qt,packet,C++,Qt,Packet,我正在寻找一种方法来访问和篡改Qt应用程序发送和接收的原始数据包数据,但找不到任何东西。有什么办法吗? 或者,如果不是应用程序,则至少提供一种从QWebView访问数据包数据的方法 有什么方法可以实现上述两个目标吗?看起来你想要Wireshark或Fiddler,甚至Charles 这些工具与Qt无关,可用于检查和拦截各种程序的web流量。篡改网络连接中服务器发送/接收的数据的正确方法是通过QNetworkAccessManager 该类允许您向服务器发送请求(可能带有标题)并获取响应(也带有标

我正在寻找一种方法来访问和篡改Qt应用程序发送和接收的原始数据包数据,但找不到任何东西。有什么办法吗? 或者,如果不是应用程序,则至少提供一种从QWebView访问数据包数据的方法


有什么方法可以实现上述两个目标吗?

看起来你想要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())
    用于在字节数组中设置新文档

  • 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);
// ...
从现在起,所有请求都将使用该对象进行

此方法允许完全控制导航器发出的请求:过滤和访问请求数据(标题、get和post值等)。您可以记录请求、分析请求及其POST/GET字段等


希望最终能有所帮助

对不起,山姆,我不能让它工作。我一直在尝试我能想象到的一切,但没有一件事情会像我所希望的那样

让我们列出一个简短的选项列表,以及可以做什么和不能做什么:

  • 通过使用
    webView->page()->currentFrame()
    获取
    QWebFrame
    ,然后访问
    setContents()
    setHtml()
    toHtml()
    toPlainText()
    等方法,可以访问检索到的网页。通过这些函数,您可以动态更改小部件中显示的网页

  • 您可以通过
    replyFinished()
    插槽中的方法
    reply->readAll()
    访问针对每个请求接收的原始响应(作为字节数组)

  • 通过在您自己的网络访问管理器中重写
    QNetworkAccessManager::createRequest()
    方法,可以拦截请求。在那里,您可以访问请求中发送的URL和标题,并更改它们或取消请求

但是。。。您希望访问每个请求的请求和回复数据

访问请求很容易,这已经通过在自定义
QNetworkAccessManager
中重写
createRequest()
方法进行了解释。但让我们谈谈另一部分:

  • 就我所见,从请求获得的回复是只读的无法更改,因为它在
    QNetworkReply
    的源代码中是硬编码的

  • 不能使用
    QNetworkReply
    writeData()
    函数,因为它被硬编码为只执行
    返回-1

  • 您可以尝试将自己的
    QNetworkReply
    子类化,并在自定义
    QNetworkAccessManager
    createRequest()
    方法中返回它。必须重写函数
    readAll()
    bytesavable()
    ,以及
    abort()
    。奇怪的是,此方法仅在向非HTTP目的地发出请求时有效。我认为
    QNetworkAccessManager
    的内部调用了
    QNetworkReply
    的不同实现,具体取决于所使用的协议(HTTP、FTP等)。所以这在某种意义上是有效的,但不是我们想要的方式。例如,在某些条件下,此方法可用于返回预定义的网页

  • 考虑到
    QNetworkAccessManager::createRequest()
    必须返回
    QNetworkReply
    对象,我看不到允许篡改回复字节数组的任何子类组合。它保护得很好,你必须去雷姆