Russian Qt Forum

Qt => Работа с сетью => Тема начата: vbi от Март 06, 2014, 01:04



Название: Http сниффер
Отправлено: vbi от Март 06, 2014, 01:04
Доброй ночи! Мне нужно написать перехватчик http: запросов в сети. Как это можно сделать средствами Qt?


Название: Re: Http сниффер
Отправлено: OKTA от Март 06, 2014, 08:14
Для начала определить метод, каким будете пакеты перехватывать - тут Qt еще и не пахнет. Посмотрите, как существующие снифферы работают, а потом уже и до Qt доберетесь))


Название: Re: Http сниффер
Отправлено: vbi от Март 06, 2014, 10:44
а стандартными средствами QT нельзя?


Название: Re: Http сниффер
Отправлено: OKTA от Март 06, 2014, 10:55
http://habrahabr.ru/post/164901/


Название: Re: Http сниффер
Отправлено: vbi от Март 06, 2014, 11:23
Блиин.. у меня сроки горят. Пока я разберусь... Можете мне написать тестовую прожку до обеда на Qt4 с классом сниффера под Windows, чтоб я мог его:

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

Плачу 50$!!!

мой скайп: bovsunivsky


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: OKTA от Март 06, 2014, 11:35
эх, кто бы мне помог  ;D


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: vbi от Март 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*)'


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: kambala от Март 06, 2014, 12:50
http://www.winpcap.org

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


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: vbi от Март 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);

}


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: vbi от Март 06, 2014, 13:00
и на этом вылетает:
Код:
_beginthreadex(0, 0, AcceptConnections, (void*)RS_SSocket, 0, &ret);


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: vbi от Март 06, 2014, 13:20
Понял, это ошибка в этой функции:
Код:
AcceptConnections
. Вынес ее из класса, теперь ее не видно, как ее вызвать теперь?...


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: vbi от Март 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... (


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: kambala от Март 06, 2014, 14:01
добавь в начало файла объявления функций, может в этом дело.

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


Название: Re: Http сниффер (плачу 50$ за помощь!)
Отправлено: vbi от Март 06, 2014, 16:06
блин, ничего не выходит. За 100$ напишите класс без pcap на RAW сокетах?


Название: Re: Http сниффер (плачу 100$ за помощь!)
Отправлено: kambala от Март 06, 2014, 16:16
я — нет, с сокетами никогда не работал


Название: Re: Http сниффер (плачу 100$ за помощь!)
Отправлено: OKTA от Март 06, 2014, 17:36
Ты видимо забыл прописать либы виндовые в файл проекта..


Название: Re: Http сниффер (плачу 100$ за помощь!)
Отправлено: OKTA от Март 06, 2014, 17:45
http://rghost.ru/52862910

Видимо придется тебе самому все делать)))
Вот, если что, работающий на Qt этот же сниффер, правда в main.cpp перенес все из sniffer.cpp.
По умолчанию в винде у тебя не будет библиотеки для работы с сокетами - посмотри в файле проекта, так что придется закачать Windows SDK.


Название: Re: Http сниффер (плачу 100$ за помощь!)
Отправлено: vbi от Март 08, 2014, 00:13
Спасибо! Но сам уже перенес хабровский пример не QT - работает


Название: Re: Http сниффер (плачу 100$ за помощь!)
Отправлено: OKTA от Март 08, 2014, 00:40
Вот видишь, а хотел деньгами швыряться  ;D


Название: Re: Http сниффер
Отправлено: vbi от Март 08, 2014, 11:17
Разобрался не доконца. Не могу дальше разобратся, после того как вынес несколько функций за пределы класса, выдает ошибку на эти функции:

Цитировать
D:\MyProjects\C++\QT4\build-MyProj-Qt_4_8_5_mingw-Отладка\debug\MyProjMain.o:-1: In function `Z10ConnectionPv@4':
c:\Qt\4.8.5\src\corelib\arch\qatomic_i386.h:125: ошибка: multiple definition of `Connection(void*)@4'
D:\MyProjects\C++\QT4\MyProj\MyProjEngine.h:56: first defined here

D:\MyProjects\C++\QT4\build-MyProj-Qt_4_8_5_mingw-Отладка\debug\MyProjMain.o:-1: In function `Z17AcceptConnectionsPv@4':
D:\MyProjects\C++\QT4\MyProj\MyProjEngine.h:78: ошибка: multiple definition of `AcceptConnections(void*)@4'
D:\MyProjects\C++\QT4\MyProj\MyProjEngine.h:78: first defined here


Название: Re: Http сниффер
Отправлено: vbi от Март 08, 2014, 11:30
разобрался, просто я функции сами описал в h файле, а нужно в заголовочном обявить а в сорсе описать


Название: Re: Http сниффер
Отправлено: vbi от Март 09, 2014, 03:27
Вообщем кому нужно, это  (http://forum.antichat.net/printthread.php?t=361794)помогло)