Сообщить дубликаты в массиве структур, используя qsort? - PullRequest
0 голосов
/ 05 марта 2010

Что я пытаюсь выполнить:

Я делаю 3000 запросов и захватываю 8 байтов этого запроса.Я вставляю ответ в:

struct negs
{
    int neg_num;
    char neg_key[9];
};

, где neg_num == i (номер запроса) и memcpy(nego[neg_count].neg_key, recv_data+73,8);

Мне нужно найти любые дубликаты neg_keys в структуре nego.Я пытаюсь использовать qsort для выполнения этого ... это моя функция сравнения:

int compare( const void* a, const void* b ){
    negs *ia = *(negs **)a;
    negs *ib = *(negs **)b;
    return memcmp(ia->neg_key, ia->neg_key, 8);
}

и мой вызов qsort:

    printf("Sizeof = %d"), sizeof(*nego);
    qsort(nego,4,sizeof(*nego),compare);
    printf("Sizeof2 = %d"), sizeof(*nego);

Я планировал просто посмотреть, есть лиэто разность в размерах после вызова, но это всегда возвращает:

Sizeof = 159218900
Sizeof2 = 4

Я неправильно подхожу к этому?какие-либо предложения?


Вот соответствующий код segfaulting:

char current_key[9];
int key_index = 0;
int dupe_count = 0;

typedef struct {
    int neg_num;
    char neg_key[9];
} negs;

struct negs
{
    int neg_num;
    char neg_key[9];
};



...

int compare( const void* a, const void* b ){
    negs *ia = *(negs **)a;
    negs *ib = *(negs **)b;
    return memcmp(ia->neg_key, ia->neg_key, 8);
}


...


main(int argc, char **argv) {
    char send_smbNego[] = {
0x00,0x00,0x00,0x54,0xFf,0x53
        };

    int neg_count = 0;
    int neg_max = 3000;

    struct negs *nego;



    nego = malloc(neg_max * sizeof(struct negs));
    for (neg_count = 0 ; neg_count < neg_max ; neg_count++){
                if ((sock = open_socket(target, TCP, 445))>=0) {
                        send(sock, send_smbNego, sizeof(send_smbNego), 0);
                        len = recv(sock, recv_data, OUTBUF_LEN, 0);
            if (len > 81) { // This should be changed to look for SMB header: ff534d42 followed by 72 which is SMB Command Negotiate Protocol, followed by 00000000 which indicates success.  The encryption key or challenge token is at offset 73 and is 8 bytes long;
                nego[neg_count].neg_num = neg_count;
                memcpy(current_key, recv_data+73,8);                   
                memcpy(nego[neg_count].neg_key, recv_data+73,8);
                //print_hex("Key 1 = ",nego[neg_count].neg_key,8);
                //printf("\n");
            }

    close(sock);

    }
    print_hex("Key number 0",nego[0].neg_key,8);
    printf("Sizeof = %d"), sizeof(*nego);
    qsort(nego,4,sizeof(*nego),compare);
    printf("Sizeof2 = %d"), sizeof(*nego);



}
}

Ответы [ 2 ]

1 голос
/ 05 марта 2010

Для начала это выглядит так: -

return memcmp(ia->neg_key, ia->neg_key, 8);

должно быть: -

return memcmp(ia->neg_key, ib->neg_key, 8);

Вы также говорите qsort, что в массиве есть 4 элемента для сортировки, а у вас 3000: -

qsort(nego,4,sizeof(*nego),compare);

Но больше всего qsort не удалит дубликаты в массиве, поэтому даже если sizeof () сделает то, что вы хотите, массивы все равно будут одинакового размера как до, так и после сортировки. *

Однако для того, что вы хотите выполнить, сортировка является хорошим первым шагом, но вам нужно будет пройти через массив после сортировки и искать дубликаты, записывая каждый элемент в memcmp.

0 голосов
/ 05 марта 2010

Вы поместили sizeof за пределы паратезов printf.Это должно быть:

printf("Sizeof = %d\n", sizeof(*nego));

Однако я не вижу, чего вы пытаетесь достичь, так как sizeof никогда не изменится - он рассчитывается во время компиляции в соответствии с типом nego.


Что касается функции сравнения, если nego является массивом struct negs (а не массивом указателей), то вам необходимо привести параметры к negs *, а не к negs**.Кроме того, вы в настоящее время сравниваете первый ключ с самим собой в вызове с memcmp.


Редактировать: ваш segfaulting вызван неправильным использованием двойных указателей, как я уже упоминал.Ваша функция сравнения должна выглядеть следующим образом:

int compare( const void* a, const void* b ){
    negs *ia = (negs *)a;
    negs *ib = (negs *)b;
    return memcmp(ia->neg_key, ib->neg_key, 8);
}
...