在PCap++中,我希望检测有效负载是否是HTTP请求。为此,我试图解析字符串,并期望库允许我检查是否成功地完成了该操作。
不幸的是,我未能做到这一点:
下面是一些例子:
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层不是一个选项)。
发布于 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
发布于 2020-11-26 08:43:36
pcpp::Packet有一种获取您需要的层的方法-- getLayerOfType。您可以使用它检测HTTP消息。示例:
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);
https://stackoverflow.com/questions/63249030
复制相似问题