从使用代理服务器截获的二进制数据中解码MongoDB有线协议数据包

2024-05-16 18:56:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用代理服务器截获mongo数据包。我能够截获二进制数据,但无法将它们解码为Mongo-Wire协议消息,这些消息在https://docs.mongodb.com/manual/reference/mongodb-wire-protocol中描述

我得到的二进制数据是这样的

\xe0\x00\x00\x00i\x98<d\x00\x00\x00\x00\xdd\x07\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x02insert\x00\x06\x00\x00\x00dummy\x00\x08ordered\x00\x01\x03writeConcern\x00\x0c\x00\x00\x00\x10w\x00\x01\x00\x00\x00\x00\x03lsid\x00\x1e\x00\x00\x00\x05id\x00\x10\x00\x00\x00\x04\xc4*\xceT\x02,@\xe7\x98\xc4\xe7a\\\x03\xd4\x87\x00\x02$db\x00\x05\x00\x00\x00test\x00\x03$readPreference\x00\x17\x00\x00\x00\x02mode\x00\x08\x00\x00\x00primary\x00\x00\x00\x015\x00\x00\x00documents\x00'\x00\x00\x00\x07_id\x00\\\xac?\xd0\x8eB.?[\xbd\xf9\xec\x02string\x00\x05\x00\x00\x00test\x00\x00

这是我在文档“Dummy”的“string”字段中存储字符串“test”时的数据

根据MongoDB Wire协议,OP\ U INSERT消息的格式为

struct {
    MsgHeader header;             // standard message header
    int32     flags;              // bit vector - see below
    cstring   fullCollectionName; // "dbname.collectionname"
    document* documents;          // one or more documents to insert into the collection
}

消息头的格式为

struct MsgHeader {
    int32   messageLength; // total message size, including this
    int32   requestID;     // identifier for this message
    int32   responseTo;    // requestID from the original request
                           //   (used in responses from db)
    int32   opCode;        // request type - see table below for details
}

从上面的二进制数据中,我想提取Mongo-Wire协议消息。是否有任何包/库可以实现这一点?你知道吗


Tags: 数据消息协议messagemongomongodb二进制x00