Russian Qt Forum
Май 18, 2024, 01:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Http сниффер  (Прочитано 11879 раз)
vbi
Гость
« : Март 06, 2014, 01:04 »

Доброй ночи! Мне нужно написать перехватчик http: запросов в сети. Как это можно сделать средствами Qt?
« Последнее редактирование: Март 08, 2014, 11:17 от vbi » Записан
OKTA
Гость
« Ответ #1 : Март 06, 2014, 08:14 »

Для начала определить метод, каким будете пакеты перехватывать - тут Qt еще и не пахнет. Посмотрите, как существующие снифферы работают, а потом уже и до Qt доберетесь))
Записан
vbi
Гость
« Ответ #2 : Март 06, 2014, 10:44 »

а стандартными средствами QT нельзя?
Записан
OKTA
Гость
« Ответ #3 : Март 06, 2014, 10:55 »

http://habrahabr.ru/post/164901/
Записан
vbi
Гость
« Ответ #4 : Март 06, 2014, 11:23 »

Блиин.. у меня сроки горят. Пока я разберусь... Можете мне написать тестовую прожку до обеда на Qt4 с классом сниффера под Windows, чтоб я мог его:

создать
включить
выключить
и чтоб он сигналы посылал с http запросами.
Очень нужно до обеда - дедлайн!

Плачу 50$!!!

мой скайп: bovsunivsky
Записан
OKTA
Гость
« Ответ #5 : Март 06, 2014, 11:35 »

эх, кто бы мне помог  Смеющийся
Записан
vbi
Гость
« Ответ #6 : Март 06, 2014, 12:49 »

Сам переношу хабровский пример в класс.
Вот ошибка из-за того что переместил код в класс. Как исправить?:

Код:
beginthreadex(0, 0, AcceptConnections, (void*)RS_SSocket, 0, &ret);
Цитировать
D:\MyProjects\C++\habr\snif\mainwindow.cpp:61: ошибка: argument of type 'unsigned int (MainWindow:Улыбающийся(void*)' does not match 'unsigned int (*)(void*)'
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4730



Просмотр профиля WWW
« Ответ #7 : Март 06, 2014, 12:50 »

http://www.winpcap.org

по ошибке: это должна быть просто функция, а не метод класса. убери MainWindow::
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vbi
Гость
« Ответ #8 : Март 06, 2014, 12:58 »

Как убрать?

Вот я запихнул все в конструктор. Мне нужно чтобы все в классе создавалось:

Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    char console_out = 'y';
    char buf[64];

    FILE* f = NULL;
    DWORD packet_res = 0;
    u_long watch_host = 0;
    DWORD packets_count = 0;
    unsigned int ret;

#ifdef NET_SERVER_2000
    InitializeCriticalSection(&critsect);
#endif



    // инициализация
    RS_Init();

    // проверка на успешность создания сокета
    if (RS_SSocket != SOCKET_ERROR)
    {
        //SetConsoleTextColor(0x0A);
        //printf("%s> %d\n", STR_SOCKET, RS_SSocket);
        //SetConsoleTextColor(0x07);
    }
    else
    {
        qDebug() << STR_CANT_CREATE_SOCKET;
        return;
    }



    f = fopen(RS_Hostname, "wt");



    // Включение promiscuous mode
    RS_SetPromMode(1);



#ifndef ALPHA

    watch_host = inet_addr("8080");

#endif

#ifdef NET_SERVER_2000
    // запуск сервера - посылка трафика  любому клиенту
    _beginthreadex(0, 0, AcceptConnections, (void*)RS_SSocket, 0, &ret);

#endif



    RS_InitStat();

    while(true)
    {
        IPHeader* hdr = RS_Sniff();
        // обработка IP-пакета
        if (hdr)
        {
            char *packet_str = 0;
            packets_count++;
            // штамп времени
            time(&rawtime);
            timeinfo = localtime (&rawtime);
            // пакет в строку
            packet_str = RS_IPHeaderToStr(hdr);
qDebug() << packet_str;
            /* подсветка */
            SetConsoleTextColor(0x07);
            /*ColorPacket(hdr, RS_SocketAddress.sin_addr.s_addr, watch_host);*/
            // печать заголовка IP-пакета
// if (console_out == 'y')
// {
// SetConsoleTextColor(FOREGROUND_GREEN | FOREGROUND_BLUE /*| FOREGROUND_INTENSITY*/);
// printf("%.2d:%.2d:%.2d>", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
// ColorPacket(hdr, RS_SocketAddress.sin_addr.s_addr, watch_host);
// printf("%s", packet_str);
// //for(int i = 0; i < CONSOLE_WIDTH - strlen(packet_str)-9; i++) printf(" ");
// //printf("\n");
// }

            // для посылки строки заголовка в сеть
            sCurrPacket = packet_str;
            bNewPacket = true;

            free((void*)packet_str);
            free((void*)hdr);

            if (packet_res > 0)
                Sleep(packet_res);
        }



        if(!PauseAndContinue())
            break;
    }

//////////////////////////////////////////////////////////////////
    // Конец работы
    RS_Free();
    fclose(f);

}
Записан
vbi
Гость
« Ответ #9 : Март 06, 2014, 13:00 »

и на этом вылетает:
Код:
_beginthreadex(0, 0, AcceptConnections, (void*)RS_SSocket, 0, &ret);
Записан
vbi
Гость
« Ответ #10 : Март 06, 2014, 13:20 »

Понял, это ошибка в этой функции:
Код:
AcceptConnections
. Вынес ее из класса, теперь ее не видно, как ее вызвать теперь?...
Записан
vbi
Гость
« Ответ #11 : Март 06, 2014, 13:50 »

Вынес эти две процедуры за класс:

Код:
unsigned __stdcall Connection(void* a)
{
    Socket* s = (Socket*) a;
    if (a == NULL)
        return SOCKET_ERROR;
    while (1)
    {
        if (bNewPacket)
        {
            EnterCriticalSection(&critsect);

            s->SendLine(sCurrPacket+(char)13+(char)10);
            bNewPacket = false;

            LeaveCriticalSection(&critsect);
        }
    }

    delete s;
    return 0;
}

unsigned __stdcall AcceptConnections(void* a)
{
    SocketServer in(2000, 20);

    while (1)
    {
        Socket* s = in.Accept();

        unsigned ret;
        _beginthreadex(0, 0, Connection, (void*)s, 0, &ret);
    }
}

теперь вообще 119 ошибок и первая пишет multiple definition of `RS_InitStat()' и еще много multiple definition... (
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4730



Просмотр профиля WWW
« Ответ #12 : Март 06, 2014, 14:01 »

добавь в начало файла объявления функций, может в этом дело.

«вынести за класс» означает просто не писать функциям твое MainWindow::, находиться же они могут прямо в mainwindow.cpp
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vbi
Гость
« Ответ #13 : Март 06, 2014, 16:06 »

блин, ничего не выходит. За 100$ напишите класс без pcap на RAW сокетах?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4730



Просмотр профиля WWW
« Ответ #14 : Март 06, 2014, 16:16 »

я — нет, с сокетами никогда не работал
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 19.