перехват GetMessage in Vista

Тема в разделе "WASM.WIN32", создана пользователем coocky, 8 сен 2009.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет..Перехватываю GetMessageW под вистой с помощью detours библиотеки.
    Свою хукдлл внедряю с помощью глобального хука WH_GETMESSAGE.
    код прдельно прост..Тестирую на блокноте
    Код (Text):
    1. BOOL (WINAPI *pGetMessageW)( LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)=GetMessageW;
    2.                
    3. BOOL APIENTRY DllMain( HINSTANCE hinst, DWORD dwReason, LPVOID reserved/*HANDLE hModule,DWORD  ul_reason_for_call, LPVOID lpReserved*/)
    4.  
    5.            
    6. {
    7.                 if (dwReason == DLL_PROCESS_ATTACH)
    8.                 {
    9.            
    10.                 DisableThreadLibraryCalls(hinst);
    11.                 DetourTransactionBegin();
    12.                 DetourUpdateThread(GetCurrentThread());
    13.  
    14.                                 DetourAttach(&(PVOID&)pGetMessageW,pUnrealGetMessageW);
    15.                 DetourTransactionCommit();
    16.                                  
    17.  
    18.                 }
    19.                                  
    20.    
    21.                 else if (dwReason == DLL_PROCESS_DETACH)
    22.                 {
    23.                      DetourTransactionBegin();
    24.                      DetourUpdateThread(GetCurrentThread());
    25.                      DetourDetach(&(PVOID&)pGetMessageW,pUnrealGetMessageW);
    26.                      DetourTransactionCommit();
    27.                    
    28.  
    29.                 }
    30.                 return TRUE;
    31.             }
    32.  
    33. BOOL WINAPI pUnrealGetMessageW( LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
    34.            
    35. {
    36.     return pGetMessageW( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
    37. }
    Все работает..Однако если закрыть мое приложение,которое ставит хук,то происходит выгрузка lkk из блокнота, и после выгрузки приложение падает по адресу выполнения return pGetMessageW( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
    Если закрыть прото бокнот,без закрытия моего приложения,т.е. когда хук жив-все завершается нормально.
    По ХР все работает.Происходит только при перехвате GetMessageW,другие функции -нормально все отрабатывает при разных ситуациях.
    адрес pGetMessageW в фунции DetourDetach(&(PVOID&)pGetMessageW,pUnrealGetMessageW); восстанавливается нормальный.Потоки суспендятся.
    Немогу понять-откуда берется обращение по старому адресу.
    Вроде все расписал-может сталкивался кто?
    Могу кинуть исходники длл,если надо кому.... Я ничего не понимаю.
     
  2. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Я что-то не доганяю.... Ты при выгрузке ДЛЛ хуки ф-й снимаешь или нет? Если нет, то само собой падения будут!
     
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    зачем хукать getmessage если на неё уже хук стоит?
     
  4. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    :) Ну хочется так человеку! Не мешай!
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    coocky
    Исходный код "detours" в студию.