Загвоздочка в перехвате интернет функций API...

Тема в разделе "WASM.BEGINNERS", создана пользователем AllHaveMan, 7 мар 2007.

  1. AllHaveMan

    AllHaveMan New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    3
    После PHP и C#, пытаясь работать с Win API на С++, понял что я полный ламер)

    Я перелопатил много статей и форумных тематик, но все же так и не смог решить проблему. раскривите мои руки.

    Мне нужно перехватывать запросы браузеров которые они отправляют в инет и то что они получили. Подправлять заголовки в запросах и html текст в ответе. На сколько я понял, как самый простой вариант и вроде как везде работащий, в использоввнии хуков. Но только никак не могу их заставить работать((. если не сложно помогите.
    Как я понял надо перехватить функции send и WSASend, recv и WSARecv. Вроде все стандартные браузеры их используют.
    1. Так ли это?
    Вот что я делаю(пишу на MS Visual studio 6 c++):
    Создаю lib.dll:
    Код (Text):
    1. #include "stdafx.h"
    2. #include <winuser.h>
    3. #include <stdio.h>
    4. extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam);
    5.  
    6. BOOL APIENTRY DllMain( HANDLE hModule,
    7.                        DWORD  ul_reason_for_call,
    8.                        LPVOID lpReserved
    9.                      )
    10. {//На сколько я понял здесь можно ничего не делать
    11.     return TRUE;
    12. }
    13. LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
    14. {
    15. //Здесь надо как то выловить необходимую API функцию и здесь же взять ее аргументы.
    16. //2.Но как это сделать?
    17.  
    18. //Но сюда почему то никогда ничего не заходит.
    19. //даже если я здесь просто напишу код записи чего нибудь в файл что бы проверить выполнение функции, ниче не пишется, значит она не выполняется. 3. Почему?
    20.  
    21. return CallNextHookEx(NULL, code, wParam, lParam);
    22. //Надо ее вернуть дальше так как я хочу по ходу дела, но какие параметры менять, я не понял.
    23. }
    Вот мой исполняемый файл .exe
    Код (Text):
    1. #include "stdafx.h"
    2.  
    3. int APIENTRY WinMain(HINSTANCE hInstance,
    4.                      HINSTANCE hPrevInstance,
    5.                      LPSTR     lpCmdLine,
    6.                      int       nCmdShow)
    7. {
    8.  
    9.  
    10. HMODULE dllhook = LoadLibrary("lib.dll");
    11. HOOKPROC hook = (HOOKPROC)GetProcAddress(dllhook, "HookProc");
    12. //исследуя чужие исходники понял что надо ставить тип хука WH_CBT,
    13. // 4. так ли это?
    14. //5.И как получить только те функции которые мне нужны? это надо делать уже в хуковской функции?
    15. HHOOK hhook = SetWindowsHookEx(WH_CBT,hook,dllhook,0);
    16. //И похоже надо не выходить из проги
    17. Sleep(INFINITE);
    18.  
    19.  
    20. FreeLibrary(dllhook);
    21.  
    22. return 0;
    23. }
    Вот что у меня получилось.
    И еще собрал программу по статье "Перехват API-функций в Windows NT/2000/XP" с этого сайта. по первому способу. Но когда запускаю, и подключаюсь к какому нибудь процессу, тот процесс закрывается, показывая сообщение о критической ошибке. 6.Почему так, тож непонятно. вроде собрал все как надо.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А при чем тут SetWindowsHookEx? ....
     
  3. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    AllHaveMan то что ты тут привел - это способ заставить дллку подгружаться во все процессы которые юзают оконные или иные (какие укажешь) сообщения... Дальше тебе необходимо написать код, который и будет хукать апи (сплайсенг)...
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Грузить лишнюю длл - такое палево, что хлеще придумать трудно
     
  5. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Грузить лишнюю длл - такое палево, что хлеще придумать трудно
    если в dllmain патчить список загруженых модулей процесса (который в PEB) то не такое уж и палево... а если библиотека подгружается для вполне легальных целей то вообще побарабану
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Cr4sh
    от EnumProcessModules не спасет
     
  7. AllHaveMan

    AllHaveMan New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    3
    Спасибо а ответы.
    ток пока чет все равно не очень получается.
    GreatА что вместо него надо?
    agent007Так что бы перехватываеть сообщения которые уходят в сеть нужно использовать WH_CBT? А без сплайсинга не как? на сколько я понял там надо очень хитро подменять адреса функции из приложения на мои функуции... Разве в мою функцию HookProc не поступит то сообщение которое Хук отловил?
    GreatГде то я читал что если не грузить длл а хукать из .exe то нельзя ставить глобальные хуки

    И собственно главный вопрос почему он не хукает? почему при посылке каким либо приложений сообщений, он не вываливается в мою функцию HookProc?
    Даже если я ставлю вместо WH_CBT ставлю перехват сообщений клавиатуры, он все равно их не ловит. может я как то не правильно подключил длл? или не правильно вызвал SetWindowsHookEx?
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Да? Мне почему то всегда казалось, что он берет информацию из таргетного PEB'a
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    AllHaveMan
    Ты всё с ног на голову перевернул.
    Прочитай сначала про хуки.
    Для перехвата API хуки используются как загрузка твоего кода в адресное пространство таргетного процесса.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проще аккуратно перенести свое тело в адресное пространство процесса чужого по тем же виртуальным адресам и не париться по этому поводу. Палевность одинаковая.
     
  11. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    Great ничего проще не вижу, это надо будет заморачиваться с базовонезависимостью инжектируемого кода...
    Все же просто как 2 пальца:
    дллка в адресном пространстве процесса, получаем адрес нужной апи, делаем виртуал протект ридврайт, записываем переходник на нашу процедуру в дллке, в ней делаем все вещи... и все
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не надо будет.
    ну а если переносить свою тушу в чужое пространство, то все тоже самое, только лишней длл не надо. Чем не проще?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вот тебе функция кстати
    Код (Text):
    1. //
    2. // Переносим свою тушу в чужое адресное пространство
    3. //
    4. // частично взято у gorl'а, который тоже откуда-то спер ;)
    5. //
    6.  
    7. bool TransferProgramEx(HANDLE hProcess)
    8. {
    9.     // получаем свою базу загрузки и освобождаем память в чужом адресном пространстве по этому виртуальному адресу
    10.     HMODULE g_module = GetModuleHandle(0);
    11.     VirtualFreeEx(hProcess, g_module, 0, MEM_RELEASE);
    12.    
    13.     // получаем свой размер EXE
    14.     DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE *)(g_module) + ((PIMAGE_DOS_HEADER)(g_module))->e_lfanew +
    15.         sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    16.  
    17.     // выделяем память под свое тело
    18.     char *pMem = (char *)VirtualAllocEx(hProcess, g_module, dwSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    19.     if(pMem == NULL) return FALSE;
    20.        
    21.     DWORD dwOldProt, dwNumBytes, i;
    22.     MEMORY_BASIC_INFORMATION mbi;
    23.      
    24.     // постранично копируем себя в выделенную память по тем же виртуальным адресам, что и здесь
    25.     VirtualQueryEx(hProcess, pMem, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
    26.     while (mbi.Protect!=PAGE_NOACCESS && mbi.RegionSize!=0)
    27.     {
    28.         if (!(mbi.Protect & PAGE_GUARD))
    29.         {
    30.             for (i = 0; i < mbi.RegionSize; i += 0x1000)
    31.             {
    32.                 VirtualProtectEx(hProcess, pMem + i, 0x1000,PAGE_EXECUTE_READWRITE, &dwOldProt);
    33.                 WriteProcessMemory(hProcess, pMem + i, pMem + i, 0x1000, &dwNumBytes);
    34.             }
    35.         }
    36.         pMem += mbi.RegionSize;
    37.         VirtualQueryEx(hProcess, pMem, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
    38.     }
    39.  
    40.     // все ок ;)
    41.     return true;
    42. }
     
  14. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    Great ну так фишка в том, что через SetWindowsHook автоматически во все приложения будет дллка подгружаться, в т.ч. и в новые процессы.... А так придется самим грузить во все процессы, и отслеживать новые...
    Да и чувствую любая проактивка сразу пропалить запись в чужой процесс...
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    agent007
    а SetWindowsHookEx она не пропалит? :)))
    У меня касперыч матерился на установку хуков таким образом..

    всего-то перехватить CreateProcessA/W
     
  16. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    Great странно что он матерился... Вообще на этот способ не должны ругаться, это вполне документированный и "законный" способ) куча приложений ставить так хуки.... и на каждое ругаться - врятле
    А его как перехватывать будешь?:))
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    agent007
    ну да, а сплайсить потом тоже законно?)
    кстати, к системным процессам вида lsass он вроде подключен не будет, насколько я помню..
     
  18. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    ну мы пока говорим о внедрении в чужой процесс.... сплайсить и так и так придется, это другой вопрос
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да я шучу)
    Я вспомнил, это не касперский палил, а фаер какой-то. Кажется, у меня тогда стоял аутпост. И установка хука ему не сильно нравилась.
     
  20. AllHaveMan

    AllHaveMan New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    3
    я видел код на http://forum.antichat.ru/thread32176.html написаный Greatом, ( может тем же Greatом что и на этом форуме а может и нет).
    так вот я копировал все как есть.
    так вот почему то когда создаешь процесс из самой программы, то при освобождении памяти в этом процессе происходит ошибка и все слетает(в VirtualFreeEx)
    а когда подключаешься вообще к другому процессу, то он даже ReadProcessMemory не выполнят выдавая ошибку о том что доступ запрещен.
    почему это может быть?