윈도우즈 전역 훅

1613 단어 hook전역 훅
최근에 전역 훅에 사용되었는데 사실은 윈도우즈 핵심 프로그래밍을 참고할 수 있고 전역 훅도 Dll 주입의 한 방식이다.
먼저 Dll이어야 하며 WH 유형의 글로벌 훅을 설정하는 인터페이스를 내보낼 수 있습니다.GETMESSAGE (이렇게 하면 모든 프로세스가 훅에 도착할 것이다). 이렇게 성공하면 시스템은 이 Dll을 getmessage가 있는 모든 프로세스에 주입합니다. 즉, 모든 프로세스에 loadlibrary를 은밀하게 호출합니다.
그리고 getmessage가 있을 때마다 리셋 함수에 리셋을 해서 처리할 수 있습니다.
훅이 필요하지 않을 때, unhook을 통해, 시스템은 훅의 프로세스를 은밀하게 freelibrary로 호출하고 dll를 마운트 해제합니다.
우리는 훅을 P로 설정하고 훅 Dll을 D로 설정하였으나 시험을 통해
P가 종료되기 전에 D의 unhook을 호출하지 않거나 P가 강제로 죽거나 끊겨도 시스템은 그 hook의 프로세스를 위한freelibrary, 즉 D에 들어갈 proc 를 호출하는 데 도움을 줄 것이다detach 중.
그러나 의외의 경우도 있다. 때때로 어떤 프로세스는 D, 예를 들어 크롬, svncache, 또는 시간이 좀 걸려야 다른 프로세스를 제거할 수 있다. (그러나 64비트 시스템은 괜찮을 것 같다.)
static HHOOK _myHook = NULL; 

LRESULT CALLBACK MyHookProc(
                             _In_  int nCode,
                             _In_  WPARAM wParam,
                             _In_  LPARAM lParam
                             )
{
    return CallNextHookEx(NULL, nCode, wParam, lParam);// HHOOK parameter is optional and ignored
}

bool hookStart()
{
    if (_myHook)
        return true;

    _myHook = SetWindowsHookEx(
        WH_GETMESSAGE,
        (HOOKPROC)&MyHookProc,
        GetMainDll(),
        0);

    if (NULL == _myHook)
    {
        assert(false && "[hookStart]hook false!");
        return false;
    }

    return true;
}

bool hookEnd()
{
    if (NULL == _myHook)
        return true;

    if (FALSE == UnhookWindowsHookEx(_myHook))
    {
        assert(false && "[hookEnd]unhook false!");
        return false;
    }

    _myHook = NULL;
    return true;
}

좋은 웹페이지 즐겨찾기