Кэширование пакетов, захваченных из pcap - PullRequest
3 голосов
/ 20 ноября 2011

Это дополнительный вопрос к этому: Восстановление пакета для инъекции через pcap

Что я хочу сделать:

  1. functionA: захват пакетов с помощью pcap.Изменить адреса источника / назначения.Пересчитать контрольные суммы.Введите с pcap.

  2. functionB: создать две темы.Поток 1 отправляет волшебный пакет, чтобы разбудить спящего клиента.Поток 2 захватывает пакеты с помощью pcap и кэширует их в массиве u_char *, поскольку pcap последовательно помещает данные пакета в «пакет u_char *».Когда оба потока завершаются, я изменяю заголовки, а затем внедряю каждый из кэшированных пакетов.

Что мне нужно помочь с:

  1. functionA:Я могу делать все, но вычислять контрольные суммы.Я пытался проверить исходную контрольную сумму, рассчитав ее самостоятельно с помощью функции, но они никогда не совпадали.Тем не менее, эта проблема не так важна, потому что она мне не нужна для демонстрации моего финального проекта.Я понимаю, что если контрольные суммы IP неверны, принимающий компьютер отбросит пакет.Но когда я показываю, пока мой клиентский компьютер получил этот неверный пакет, я доказал свою общую концепцию и не потерплю неудачу.:)

  2. functionB: Я думаю, это более важная проблема.Я не знаю простого способа кэшировать мои захваченные пакеты.Сейчас я работаю над следующим:

functionB создает указатель на массив, который хранит u_char * с именем cachedPackets.Таким образом, cachedPackets в основном указывает на массив, который хранит «строки».

Это будет что-то вроде этого?u_char ** cachedPackets[100], достаточно элементов массива для 100 пакетов.

После этого я запускаю два потока.Thread1, чтобы разбудить моего спящего клиента.Thread2, чтобы открыть другой сеанс pcap, чтобы данные не терялись во время пробуждения клиента.Thread1 - это просто, я уже самостоятельно проверил свою функцию отправки магических пакетов.Thread2 - вот где я облажался.

Thread2 в конечном итоге вызывает int pcap_loop(pcap_t *p, int cut, pcap_handler callback, u_char *user).

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

обратный вызов принимает параметры ( u_char* user, const struct pcap_pkthdr* packet_header, const u_char* packet_data )

user - та же самая строка в 4-м аргументе pcap_loop.

ТакЯ думал, что мог бы незаметно дать моей функции обратного вызова указатель на массив строк, приведя его тип.

pcap_loop(asdf, asdf, callback, (u_char *)cachedPackets);

Поскольку я не знаю, насколько большими будут входящие пакеты, я буду динамически выделять достаточно места в функции обратного вызова.Я также буду отслеживать свою позицию в массиве с помощью статического int.

Вот как выглядит обратный вызов:

void cacheCall(u_char * user, const struct pcap_pkthdr * header, const u_char * packet)

    static int cacheindex = 0;

    u_char ** cachethis = (u_char **)user; 

    //u_char * cachething = *cachethis;
    (*cachethis)[cacheindex] = (u_char *) malloc(header->len); <--- 497


    int i = 0;

    for(i = 0; i < header->len; i++)
    {
        (*cachethis)[cacheindex][i] = packet[i]; <-------------------503
    }

    //memcpy(cachething[cacheindex], packet, header->len);
    cacheindex++;

, но когда я компилирую, я получаю

497: warning: assignment makes integer from pointer without a cast
503: error: subscripted value is neither array nor pointer

Это было довольно долго, надеюсь, мои знания о том, что яделаю не совсем дезинформирован.Любая помощь будет потрясающей!:)

1 Ответ

1 голос
/ 20 ноября 2011
u_char ** cachethis;

cachethis является указателем на указатель на u_char.

Итак:

*cachethis

является указателем на u_char и:

(*cachethis)[i]

равнина u_char.

Таким образом, строка 497 пытается сохранить указатель в u_char, а строка 503 пытается подписать u_char, оба из которых недопустимы.

Похоже, что вы просто хотите:

cachethis[i]

и

cachethis[i][j]
...