Сниффер / перехват запросов

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mailbrush, 18 Jul 2010.

  1. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Здравствуйте.

    Каким образом / посредством чего можно написать такую программу:

    Софт перехватывает все HTTP-запросы, и если в одном из них найдено определенное ключевое слово (н.п. "GET /showprofile.php"), то часть ответа от сервера должна заменится. Что именно и на что указываю я.

    Если кто-то когда-то работал с такой программой, как Charles - нужно что-то наподобии функции Breakpoints.

    Тоесть при определенном запросе можно изменить ответ.

    ВАЖНО: без использования прокси-сервера, программа должна сама перехватывать и сама изменять ответ.

    Вобщем, как сделать подобное?
     
  2. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Попробуй с помощью winpcap или драйвер свой напиши или хукни соотв. функции в программе для которой подменять хочешь
     
  3. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Вот именно, хуки.
    На какие функции их ставить?
     
  4. karabas

    karabas New Member

    Joined:
    17 Jul 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    читай классику по хукам , send, WSASend
     
  5. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Допустим, поставлю хук на recv.
    В каком параметре будет буфер ответа?
     
  6. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    В смысле?
    Ты же знаешь прототип функции, тебе нужно сделать, чтобы целевая программа вызвала твою кастомную функцию, вместо оригинальной.
    Программа передаст тебе необходимые параметры, ты их обработаешь, вызовешь оригинальную функцию из своей, но отдашь в том виде в котором тебе нужно.
     
  7. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Нужно реализовывать не хуки, а перехват Winsock функций.
     
  8. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    А вот с этого места поподробнее...
    Хочу статью "Перехват Winsok-функций без хуков" by Chrome~ ;)
     
    1 person likes this.
  9. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    схема такая
    Code:
    int (__stdcall*uniq_addr)();
    
    void entry_point(void)
    {
        uniq_addr = set_hook_recv
        /*
         * set_hook_recv
         * может пропатчить IAT или JMP hook_recv
         * эта версия для патчинга IAT
         */
    }
    
    /* здесь просто вызываем оригинальную для JMP пришлось бы снять перехват */
    int __stdcall hook_recv(int sock, char *buff, int len, int flag)
    {
        char ent = "interes", *p;
        int ret = uniq_addr(sock, buff, len, flag);
        if (ret != ~0 && ret)
        {
            size_t len = strlen(ent);
            if (p = memstr(buff, ret, ent, len))
            {
                modify_answer(p);
            }
        }
        return ret;
    }
    
    void* memstr(char *buf, size_t buf_len, void *sub, size_t sub_len)
    {
        return_val_if_fail(buf_len, 0);
        return_val_if_fail(sub_len, 0);
    
        while (buf_len-- >= sub_len)
        {
            if (!memcmp(buf, sub, sub_len))
                return buf;
            buf++;
        }
        return 0;
    }
    
     
    #9 greki_hoy, 18 Jul 2010
    Last edited: 19 Jul 2010
  10. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Рихтер написал эту функцию для патчинга IAT
    комментарии в коде оригинальные сохранены
    Code:
    void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
    {
        ULONG ulSize;
        PIMAGE_THUNK_DATA pThunk;
        PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) 
        ImageDirectoryEntryToData(hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
    
        if (pImportDesc == NULL)
            return; // в этом модуле нет раздела импорта 
    
        // находим дескриптор раздела импорм со ссылками
        // на функции DLL (вызываемого модуля)
        for (; pImportDesc->Name; pImportDesc++)
        {
            PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);
    
            if (lstrcmpiA(pszModName, pszCalleeModName) == 0)
                break; 
    
        }
    
        if (pImportDesc->Name == 0)
            // этот модуль не импортирует никаких функций из данной DLL
            return;
    
        // получаем таблицу адресов импорта (IAT) для функций DLL
        pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hmodCaller + pImportDesc->FirstThunk);
    
        // заменяем адреса исходных функций адресами своих функций
        for (; pThunk->u1.Function; pThunk++)
        {
    
            // получаем адрес адреса функции
            PROC* ppfn = (PROC*) &pThunk->u1.Function;
    
            // та ли это функция, которая нас итересует?
            BOOL fFound = (*ppfn == pfnCurrent);
    
            // см. текст программы-примера, в котором
            // содержится трюковый код для Windows 98 
    
            if (fFound)
            {
                // адреса сходятся, изменяем адрес в разделе импорта
                WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL );
                    return; // получилось, выходим 
    
            }
    		
        }
        
        // если мы попали сюда, значит, в разделе импорта
        // нет ссылки на нужную функцию
    
    }
    
     
  11. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Прочитай эту статью для начала:
    http://wasm.ru/article.php?article=apihook_1

    Перехват API функций происходит с помощью сплайсинга, редактирования таблицы импорта и т. д.

    Очень интересно посмотреть, как ты сможешь реализовать перехват Winsock функций, используя SetWindowsHookEx. Поэтому хочу посмотреть на статью "Перехват Winsok-функций с помощью SetWindowsHookEx" by M_script.
     
    1 person likes this.
  12. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Так, кое-что нашёл, сейчас прочитаю, отпишусь о результатах.
     
    #12 mailbrush, 19 Jul 2010
    Last edited: 19 Jul 2010
  13. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    по мне перехват API функций юзать тупо ибо геморно и палевно
    для меня самый приемлемый вариант использовать winpcap... а там уж обрабатывать только пакеты идущие на 80 порт.

    P.S: SLESH давал наводку на еще одну технологию, но доков по ней оч мало
     
    _________________________
  14. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    winpcap не очень хорошо использовать если нужен перехват всего траффика, т.к. настраивать надо под каждую машину и всякие там мегафон модемы, телефонные модемы и т.д. перехватить не выйдет. Советую написать простейший TDI драйвер, в WinDDK есть пример, за дня 4 можно разобраться. Это лучще чем неделю ждать здесь ответа) Единственно плохо то что нужны права админа и загрузить его безпалевно будет сложно.
     
  15. Artorios

    Artorios New Member

    Joined:
    23 Feb 2012
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Вот у меня в ddk нет сорсов вообще.Может ты выложишь сюда этот сорс.
    Кстати,про перехват Send/Recv,то тут проблема очень большая есть - это ssl
     
  16. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    значит хукать нужно выше чем ssl, тобишь когда ссл будет декриптован.
     
  17. Artorios

    Artorios New Member

    Joined:
    23 Feb 2012
    Messages:
    15
    Likes Received:
    0
    Reputations:
    0
    Выходит,что по-любому нужно будет писать tdi-фильтр или ndis драйвер.Кто бы хотел заняться этим???