2016-10-08 8 views
2

wiresharkのソースコードを少し変更しています。一つの特定の時点で、私は構造がSSLDecoderCで構造体を印刷する

FILE *f; 
f=fopen("file.txt","a+"); 
size_decoder=sizeof(SslDecoder); 
for(i=0; i < size_decoder; i++){ 
    fprintf(f,"%02x",*(ssl_session->client_new+i)); 
} 
fprintf(f,"\n"); 

このよう

ssl_session呼ばれるプリントアウトする

typedef struct _SslDecryptSession { 
    guchar _master_secret[SSL_MASTER_SECRET_LENGTH]; 
    guchar _session_id[256]; 
    guchar _client_random[32]; 
    guchar _server_random[32]; 
    StringInfo session_id; 
    StringInfo session_ticket; 
    StringInfo server_random; 
    StringInfo client_random; 
    StringInfo master_secret; 
    StringInfo handshake_data; 
    /* the data store for this StringInfo must be allocated explicitly with a capture lifetime scope */ 
    StringInfo pre_master_secret; 
    guchar _server_data_for_iv[24]; 
    StringInfo server_data_for_iv; 
    guchar _client_data_for_iv[24]; 
    StringInfo client_data_for_iv; 

    gint state; 
    SslCipherSuite cipher_suite; 
    SslDecoder *server; 
    SslDecoder *client; 
    SslDecoder *server_new; 
    SslDecoder *client_new; 
    gcry_sexp_t private_key; 
    StringInfo psk; 
    guint16 version_netorder; 
    StringInfo app_data_segment; 
    SslSession session; 
} SslDecryptSession; 

SslDecoderと定義されるタイプstruct SslDecryptSessionである、しかしタイプの

typedef struct _SslDecoder { 
    SslCipherSuite* cipher_suite; 
    gint compression; 
    guchar _mac_key_or_write_iv[48]; 
    StringInfo mac_key; /* for block and stream ciphers */ 
    StringInfo write_iv; /* for AEAD ciphers (at least GCM, CCM) */ 
    SSL_CIPHER_CTX evp; 
    SslDecompress *decomp; 
    guint32 seq; 
    guint16 epoch; 
    SslFlow *flow; 
} SslDecoder; 

ありますファイルに出力される出力は不規則です。 サンプル出力はこちらpastebin

私が間違っていることを教えてもらえますか?

私は後でこのような別のデコーダを移入するファイルで、この出力を使用します(今はそのまま、私はので、ファイルへの不規則な印刷のワンセグ障害に直面している)

SslDecoder *temp_decoder; 
c = malloc(sizeof(SslDecoder)); 

for (i=0; i<sizeof(SslDecoder); i++){ 
    fscanf(f,"%02x",&c[i]); 
} 
memcpy(temp_decoder,c, sizeof(SslDecoder)); 

答えて

1

あなたはポインタを実行するとポインタは指し示された型のサイズの倍数だけオフセットされます。 ではないポインタを指定された番号のバイトでオフセットします。 T* pがある場合、*(p + i)p[i]に相当します。あなたのコードで

、あなたが実行します。

size_decoder=sizeof(SslDecoder); 
for(i=0; i < size_decoder; i++){ 
    fprintf(f,"%02x",*(ssl_session->client_new+i)); 
} 

*(ssl_session->client_new+i)は、各反復でi * sizeof (SslDecoder)バイトでclient_newポインタをオフセットします。

あなたが代わりにあなたの代わりにcharへのポインタにポインタ演算を実行する必要がありますので、各反復で1バイトだけでポインタを進めていき:

size_decoder=sizeof(SslDecoder); 
const unsigned char* p = (unsigned char*) ssl_session->client_new; 
for(i=0; i < size_decoder; i++){ 
    fprintf(f,"%02x", p[i]); 
} 

をそして、あなたは同様に似た何かをする必要があります。ファイルを読み戻します。私はまた、あなたの読書コードであることを指摘すべきである:

SslDecoder *temp_decoder; 
c = malloc(sizeof(SslDecoder)); 

for (i=0; i<sizeof(SslDecoder); i++){ 
    fscanf(f,"%02x",&c[i]); 
} 
memcpy(temp_decoder,c, sizeof(SslDecoder)); 

memcpyコールが正しくないこと。 temp_decoderのメモリを割り当てていません。

SslDecoder *temp_decoder = malloc(sizeof *temp_decoder); 
unsigned char* p = (unsigned char*) temp_decoder; 
for (i=0; i<sizeof(SslDecoder); i++){ 
    int temp; // "%x" corresponds to an int type 
    fscanf(f, "%02x", &temp); 
    p[i] = (unsigned char) temp; 
} 
+0

執筆のセクションでは、このコードの後に​​memcpyコールを行う必要があります。 'memcpy(temp_decoder、p、sizeof(temp_decoder));' –

+0

@AbhimanyuKhannaいいえ、私が示した例では 'memcpy'コールは必要ありません。 'p'は' temp_decoder'と同じアドレスを指しています(ポインタ算術の型が異なります)ので、 'temp_decoder'に割り当てられたメモリに直接書き込みます。 – jamesdlin