Detours, Ws2_32, Recv.

Тема в разделе "LANGS.C", создана пользователем Holman, 6 окт 2008.

  1. Holman

    Holman New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2008
    Сообщения:
    5
    Задача: добавить в контент страницы отображаемой браузерами (Opera, Firefox, IE6-7) свои данные.
    Проблема: ловить контент я уже научился, но когда пытаюсь изменить buf и потом вызвать реальный recv (Real_recv) с модифицированым буфером браузер просто падает. Подскажите что не так?


    Код:


    #include <stdio.h>
    #include <windows.h>
    #include <detours.h>
    //#include <Winsock2.h>

    #pragma warning(disable:4100)
    #pragma comment(lib,"detours.lib")

    //#pragma comment(lib,"wsock32.lib")
    #pragma comment(lib,"Ws2_32.lib")





    DETOUR_TRAMPOLINE(int WINAPI Real_send(SOCKET a0, char* a1, int a2, int a3), send);
    //---------------------------------------------------------------------------
    DETOUR_TRAMPOLINE(int WINAPI Real_recv(SOCKET a0, char* a1, int a2, int a3), recv);

    //---------------------------------------------------------------------------
    int WINAPI custom_recv(SOCKET sock, char FAR* buf, int len, int flags)
    {
    if (strstr(buf, "</html>") != NULL)
    {
    //MessageBox(0, buf, "content", MB_OK);


    char* adddata="NEW DATA IN CONTENT";



    malloc(buf, sizeof(buf)+sizeof(adddata));
    strcat(buf, adddata);



    return Real_recv(sock, buf, sizeof(buf)+sizeof(adddata), flags);
    }
    else
    {
    return Real_recv(sock, buf, len, flags);
    }

    }
    //---------------------------------------------------------------------------
    int WINAPI custom_send(SOCKET sock, char* buf, int len, int flags)
    {
    return Real_send(sock, buf, len, flags);
    }
    //---------------------------------------------------------------------------
    void WINAPI HookInit()
    {
    DetourFunctionWithTrampoline((PBYTE)Real_send,(PBYTE)custom_send);
    DetourFunctionWithTrampoline((PBYTE)Real_recv,(PBYTE)custom_recv);
    }
    //---------------------------------------------------------------------------
    void WINAPI HookDone()
    {
    DetourRemove((PBYTE)Real_send,(PBYTE)custom_send);
    DetourRemove((PBYTE)Real_recv,(PBYTE)custom_recv);
    }
    //---------------------------------------------------------------------------

    BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
    {
    if ( reason == DLL_PROCESS_ATTACH )
    {
    HookInit();
    }

    return true;
    }
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Ну для начала твоя custom_recv() кривая: переменная buf используется как арг и как локальная, strcat() после malloc() вызывать нельзя... просто писец. Отладчиком пройди по коду.

    P.S. перехват recv() - этого мало. В прогах могут использоваться io completion ports и WSARecv() - ассинхронный.
     
  3. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Если пишешь для себя, то проще написать HTTP-proxy и пользовать браузер через нее
    Перехватывать и модифицировать данные таким макаром гораздо проще
     
  4. Holman

    Holman New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2008
    Сообщения:
    5
    s0larian
    Спасибо за ответ, про перехват recv() я знаю что не все юзают.

    scf
    Спасибо за ответ, тоесть лучше прехватывать конект и напрявлять его на нависной прокси?

    Ребята, что я пишу вы наверное догадались, есть еще какие то предложения по технологии реализации? (BHO, плагины FF не предлагать)

    Всем спасибо.
     
  5. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Зачем? У в любом браузере есть меню "Настройки", где и можно прописать проксю
    Если не малварь пишешь конечно :)
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    scf
    Гореть в аду (аминь †)
     
  7. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    тебе нужно СНАЧАЛА вызывать функцию recv, а уже ПОТОМ смотреть, что в буфере и пробовать это модифицировать
     
  8. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    + https ты так модифицировать не сможешь
     
  9. Holman

    Holman New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2008
    Сообщения:
    5
    Спасибо за ответ, сейчас перепишу.
     
  10. seocoder

    seocoder New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2008
    Сообщения:
    3
    получилось ли сделать рабочий код?!
     
  11. Holman

    Holman New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2008
    Сообщения:
    5
    Получилось на дельфях с либой от мс-рема.
     
  12. seocoder

    seocoder New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2008
    Сообщения:
    3
    а чего не получается при detours?!
    начал изучать как раз либу, хочется понять все подводные камни.
     
  13. Holman

    Holman New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2008
    Сообщения:
    5
    Не осилил просто, и как раз подвернулась статья на эту тему в журнале "Хакер"
     
  14. seocoder

    seocoder New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2008
    Сообщения:
    3
    сорри за оффтоп - ответь в личке. я так понимаю просто не приходит уведомление об ответах и о сообщениях в личке.