首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PCapPlusPlus中解析/检查HTTP消息?

如何在PCapPlusPlus中解析/检查HTTP消息?
EN

Stack Overflow用户
提问于 2020-08-04 14:27:00
回答 2查看 436关注 0票数 1

在PCap++中,我希望检测有效负载是否是HTTP请求。为此,我试图解析字符串,并期望库允许我检查是否成功地完成了该操作。

不幸的是,我未能做到这一点:

  • I可以用消息
  • 创建一个RawPacket,我可以用消息创建一个数据包,但是它不包含任何HttpRequestLayer,因此,解析对于检测消息的有效性是无用的。
  • I不能直接从消息创建HttpRequestLayer。

下面是一些例子:

代码语言:javascript
复制
std::string msg= "GET /index.html HTTP/1.1\nHost: example.com\n\n";

// Try to get a RawPacket: works, but does not helps a lot
struct timeval tp; // requires <time.h>
gettimeofday(&tp, nullptr);
RawPacket rp(static_cast<const uint8_t*>(msg.data()), static_cast<int>(msg.size()), tp, false);

// Trying to parse it: works but detect generic Newtork layer only, no HTTP
Packet p(&rp, false, HTTP);

// Trying to create an HttpRequestLayer directly: crash
HttpRequestLayer http(static_cast<const uint8_t*>(msg.data()), static_cast<int>(msg.size()), nullptr, nullptr);

我的问题是:

如何用PCap++?检测消息是否是有效的HTTP消息

注意:我正在寻找一个有效的解决方案(非常次优的解决方案,比如生成TCP层不是一个选项)。

EN

回答 2

Stack Overflow用户

发布于 2020-09-22 07:25:29

PcapPlusPlus可以解析数据包,而不能解析消息。RawPacket对象需要表示网络数据包的字节流,通常具有数据链路层(例如以太网)、网络层(例如IP)、传输层(例如TCP)和应用层(在本例中为HTTP)。PcapPlusPlus将把这个字节流解析为可以查看的层/协议列表。

HTTP是一种应用程序协议,因此任何HTTP数据包都将包含上述其他层。因此,仅仅提供HTTP消息是不够的,而且PcapPlusPlus无法将其解析为数据包。

您可以从教程: PcapPlusPlus了解更多关于https://pcapplusplus.github.io/docs/tutorials的信息。

具体来说,您可以查看数据包解析教程:https://pcapplusplus.github.io/docs/tutorials/packet-parsing

票数 0
EN

Stack Overflow用户

发布于 2020-11-26 08:43:36

pcpp::Packet有一种获取您需要的层的方法-- getLayerOfType。您可以使用它检测HTTP消息。示例:

代码语言:javascript
复制
timeval tm;
gettimeofday(&tm, NULL);
pcpp::RawPacket rawPacket((uint8_t*)rawPacketFromNet.data(), rawPacketFromNet.size(), tm, false, pcpp::LinkLayerType::LINKTYPE_RAW);
    
pcpp::Packet parsedPacket(&rawPacket);

pcpp::HttpRequestLayer* httpLayer = parsedPacket.getLayerOfType<pcpp::HttpRequestLayer>();

if (httpLayer)
{
// you have this layer in your packet
 uint8_t* dataPtr = httpLayer->getData();
 size_t size = httpLayer->getDataLen(); 
}

我认为,如果您从pcpp::Packet开始,然后添加http层,您的示例可能会奏效。要在您的情况下构造http层,请尝试使用HttpRequestLayer(HttpMethod method, std::string uri, HttpVersion version);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63249030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档