2017-05-15 14 views
0

私はpcapファイルを解析するためにcでlibpcapライブラリを使用しています。私は、TCPクライアントのhelloを抽出し、指定されたサーバと一致するようにサーバ名の表示をチェックしようとしています。それをしてもいいですか?はいの場合、誰かが私にどのように教えてくれますか?ありがとうlibpcapでHelloクライアントとSNIを抽出する

+0

libpcapはネットワークデータのみを取得します。ここから、IPとTCPプロトコルを解析してTLSレイヤーに到達する必要があります。このレイヤーを理解して、SNI拡張子を含むClientHelloを抽出する必要があります。したがって、libpcapを使用するだけで、あなたはこの問題を広すぎるほどの5%にしかなりません。 –

+0

私はTCPとIPプロトコルを解析しましたが、このパケットがClientHelloであることをどのように知っていますか? – sarah

+0

あなたはIPとTCPを扱っていることをどのように知っていましたか?おそらく、これらのプロトコルを理解し、それに応じて情報を抽出することであろう。また、ClientHelloを入手するためにTLSで行う必要があります。ClientHelloのフォーマットについても説明しているTLS 1.2の仕様については、[RFC 5246](https://tools.ietf.org/html/rfc5246)を参照してください。 –

答えて

1

PcapPlusPlusライブラリを使用してこれを行うことができるC++コードスニペットがあります。このコードは、あなたがpcapファイルからパケットを読み込んでいることを前提としていますが、ライブインターフェイスから読み取ったときにも同じことができます:

// create a pcap file reader instance 
pcpp::IFileReaderDevice* reader = pcpp::IFileReaderDevice::getReader("my_ssl_packets.pcap"); 

// open the reader for reading 
reader->open(); 

// read the first (and only) packet from the file 
pcpp::RawPacket rawPacket; 
while (reader->getNextPacket(rawPacket) != NULL) 
{ 
    // parse the packet 
    pcpp::Packet sslParsedPacket(&rawPacket); 

    // check if this is a SSL packet 
    if (!sslParsedPacket.isPacketOfType(pcpp::SSL)) 
     continue; 

    // check if this is a SSL handshake packet 
    pcpp::SSLHandshakeLayer* sslHandshakeLayer = sslPacket->getLayerOfType<pcpp::SSLHandshakeLayer>(); 
    if (sslHandshakeLayer == NULL) 
     continue; 

    // check if this is a client-hello message 
    pcpp::SSLClientHelloMessage* clientHelloMessage = sslHandshakeLayer->getHandshakeMessageOfType<pcpp::SSLClientHelloMessage>(); 
    if (clientHelloMessage == NULL) 
     continue; 

    // extract the Server Name Indication from the client-hello message 
    pcpp::SSLServerNameIndicationExtension* sniExtension = clientHelloMessage->getExtensionOfType<pcpp::SSLServerNameIndicationExtension>(); 
    if (sniExtension != NULL) 
     printf("Server Name Indication is: %s\n", sniExtension->getHostName().c_str()); 
} 

// close the file reader 
reader->close(); 
delete reader; 
関連する問題