1

コード スニペットはより大きなプロジェクトの一部であるため、この質問を説明するのは少し難しいです。私はできる限り問題を説明しようとします。

私は2つのファイルを持っています

    FILE *f,*m;
    f=fopen("/home/machine/decoder.txt","a+");
    m=fopen("/home/machine/offset.txt","a+");

関数では、次のコードを実行します。

    char *c;
    int i=0;
    c = malloc(sizeof(SslDecoder));

    //Pick a value from "decoder" file and compare it to a variable in the function

    while (fgets(c, sizeof(SslDecoder), f) != NULL) {

    //Print its value to offset file         
    fprintf(m,"%s\n",c);

    // Print value of another variable to offset file. 

    for(i=0;i<32;i++){
    fprintf(m,"%02x",ssl->client_random.data[i]);
    }
    fprintf(m,"\n");

    //Compare the memory in the pointers. 
    int check = memcmp(c,ssl->client_random.data,32);
    fprintf(m,"MEMCMP value: %d\n",check);
    }

offset.txt に出力される値は次のとおりです。

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3

625b70a9659b2fe9ba76ea26d3cfb6126bae4a48b4997548b26d9a101e682bc3
MEMCMP value: -44

client_random と ssl の定義は次のとおりです -

        typedef struct _StringInfo {
        guchar  *data;      /* Backing storage which may be larger than data_len */
        guint    data_len;  /* Length of the meaningful part of data */
         } StringInfo;


        typedef struct _SslDecryptSession {
        StringInfo server_random;
        StringInfo client_random;
        StringInfo master_secret;
        guchar _client_data_for_iv[24];
        StringInfo client_data_for_iv;  
        gint state;
        SslCipherSuite cipher_suite;
        SslDecoder *server;
        SslDecoder *client;
        SslSession session;

    } SslDecryptSession;

memcmp の値がゼロでない理由がわかりません。ポインターに格納されているデータのエンコードが異なっているのではないかと思いますが、その場合はどうすれば値を比較できますか。いずれかのポインターで、データが 16 進タイプなのか生/ASCII データなのかわかりません。

4

2 に答える 2

1

読み込んでいるデータ/home/machine/decoder.txtは ASCII 文字列です。

ASCIIとして印刷しています(を使用%s)。

比較しているデータはバイナリデータです(印刷している is using %02x、使用して印刷する%sと、データがASCIIであるかどうかに応じてゴミが印刷されます)

もちろん、それらは等しくありません。

それらを比較するには、バイナリ値を ASCII に、または ASCII をバイナリに変換する必要があります。あなたの選択をしてください。両方の文字列を比較するには:

char sslstr[65];
for(i=0;i<32;i++){
  sprintf(sslstr+i*2,"%02x",ssl->client_random.data[i]);
}

int check = memcmp(c,sslstr,64);

余談ですが、テキスト ファイルを読み込んでいるバッファーが小さすぎるため、ゼロで終了する必要があります。そうしないと、印刷時に文字列の末尾にゴミが残ります。

于 2016-11-07T21:16:00.537 に答える