И снова про Хуки

Тема в разделе "Общие вопросы по С и С++", создана пользователем solova, 13 апр 2011.

  1. solova

    solova Гость

    Ну собсна вот и вопросы:
    Что будет с хуком(DLL) если программу за каторой он следил выключили?
    На сколько я понимаю DLL должна выгрузится из памяти или нет?
    Можно ли тогда в DllMain в одном из(каком точно не знаю) case MessageBox вывести например?<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Для наглядности</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID /*lpReserved*/)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:hDll = hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Как ты устанавливаешь Hook и как выглядит HOOKPROC ?
     
  3. solova

    solova Гость

    Думаю сам хук тут значения не имеет но ладно вот коды<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Hook.cpp</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    #include "stdafx.h"
    #include "hook.h"

    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID /*lpReserved*/)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:hDll = hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }
    HOOK_API BOOL RemoveHook(void){
    UnhookWindowsHookEx(hHook);
    return TRUE;}
    HOOK_API BOOL InstallHook(DWORD dwThrd){
    hHook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,(HINSTANCE)hDll,dwThrd);
    return TRUE;}
    //////////////////////////////////////////////////////////////////////////////
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wP,LPARAM lP)
    {
    if(nCode >= 0) //HC_ACTION
    {
    LPMSG msg = (LPMSG)lP;
    if(wP==PM_REMOVE)
    {
    if((msg->message==WM_SYSCOMMAND)&&(LOWORD(msg->wParam)==57665))
    {
    MessageBox(hPwnd,L"WM_SYSCOMMAND",L"От Хука",MB_OK);
    }
    }
    if((msg->message==WM_COMMAND)&&(LOWORD(msg->wParam)==57665))
    {
    MessageBox(hPwnd,L"WM_BUTTON",L"От Хука",MB_OK);
    }
    }
    return CallNextHookEx(hHook,nCode,wP,lP);
    }
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">hook.h</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    #ifdef HOOK_EXPORTS     //Определяем, функция импортируется или экспортируется
    #define HOOK_API __declspec(dllexport) //Если экспортируется
    #else
    #define HOOK_API __declspec(dllimport)//Если импортируется
    #endif
    static HHOOK hHook = NULL;              //Дескриптор ловушки, глобальный
    static HANDLE hDll = NULL;              //Дескриптор DLL
    static DWORD dwThread = NULL;           //ID потока, к которому привязывается ловушка
    HOOK_API BOOL InstallHook(DWORD dwThrd);
    HOOK_API BOOL RemoveHook(void);
    LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
    если не ошибаюсь как то с Thread-ами можно по издеваться
     
  4. solova

    solova Гость

    кстати я делал так<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID /*lpReserved*/)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:hDll = hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:MessageBox(NULL,L"THREAD_DETACH",L"Target close");
    case DLL_PROCESS_DETACH:MessageBox(NULL,L"PROCESS_DETACH",L"Target close");
    break;
    }
    return TRUE;
    }
    и Мессадж выводился при выключении программы на которую хук(значит длл освобождается, первые два вопроса решены),но DllMain цыклился и постоянно слал эти месаджи.
    Я не пробовал ,но если послать sendmessage, цыклится будет?
     
  5. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Так, погоди, давай по порядку. У тебя switch не верно организован. Меняй на этот:
    Код (C++):
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID /*lpReserved*/ )
    {
    switch ( ul_reason_for_call ) {
    case DLL_PROCESS_ATTACH:
    hDll = hModule;
    break;

    case DLL_THREAD_ATTACH:
    break;

    case DLL_THREAD_DETACH:
    MessageBox( NULL, L"THREAD_DETACH", L"Target close" );
    break;

    case DLL_PROCESS_DETACH:
    MessageBox( NULL, L"PROCESS_DETACH", L"Target close" );
    break;
    }
    return TRUE;
    }
    Что теперь выводится при выключении программы? "THREAD_DETACH" или "PROCESS_DETACH" ?

    Какие именно он сейчас шлет если циклится?

    В общем суть в том что если Hook повешен глобально, то при завершении программы ничего не произойдет, если же Hook повешен на Thread то в свитче Dll сработает DLL_THREAD_DETACH.
    Я себе это так представляю.
     
  6. solova

    solova Гость

    THREAD_DETACH - срабатывает с каким то интервалом сам по себе при этом Target виснет(но хук работает)
    После нажатия ОК всё приходит в норму, но потом снова выскакивает окно.
    При выключении THREAD_DETACH запускается где то 20 раз(по очереди) , при этом Target долго висит в процессах.
    Потом всё таки Target вырубается и вылетает PROCESS_DETACH один раз.
    Как я понял THREAD_DETACH не катит чтоб узнать о выключении.
    Я убрал мессадж и теперь работает только PROCESS_DETACH (один раз).

    попробую в место MessageBox наладить отправку sendmessage окну каторый запустил хук.
    (что то sendmessage не работает но работал)
     
Загрузка...

Поделиться этой страницей