Почему SetWindowsHookEx с типом хука WH_JOURNALRECORD всегда возвращает 0? - PullRequest
0 голосов
/ 20 октября 2019
_ProcDlgMain PROC uses ebx edi esi hWnd,wMsg,wParam,lParam

    mov eax,wMsg
    .if eax ==  WM_CLOSE
        invoke  UnhookWindowsHookEx,hHook
        invoke  EndDialog,hWnd,NULL
    .elseif eax ==  WM_INITDIALOG
        push    hWnd
        pop hWinMain
        invoke AddDebugPrivilege
        invoke  SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
        .if eax
            mov hHook,eax
        .else
            invoke  EndDialog,hWnd,NULL
        .endif
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret
_ProcDlgMain ENDP

start:  
    invoke  GetModuleHandle,NULL
    mov hInstance,eax
    invoke  DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
    invoke  ExitProcess,NULL
end start

Кто-нибудь знает, почему функция SetWindowsHookEx возвращает 0?

1 Ответ

0 голосов
/ 20 октября 2019

В соответствии с документацией SetWindowsHookEx :

В случае сбоя функции возвращаемое значение равно NULL. Чтобы получить расширенную информацию об ошибке, позвоните GetLastError .

Что вы не делаете.

Однако, скорее всего, он сообщит ERROR_ACCESS_DENIED, поскольку в Vista + с включенным UAC для перехвата журнала требуется, чтобы приложение имело манифест UAC, в котором указано разрешение «uiaccess = true»:

Сбой SetWindowsHookEx для WH_JOURNALRECORD в Vista / Windows 7

Тем не менее, видение «uiaccess = true» несет в себе дополнительные ограничения, которые ваше приложение, вероятно, не удовлетворяет:

  • Исполняемый файл должен иметь цифровую подпись.

  • Исполняемый файл должен находиться в одной из следующих «безопасных» системных папок (это можно отключить в Windows 10+ с помощью параметра политики ):

    • \Program Files\, включая подкаталоги

    • \Windows\system32\

    • \Program Files (x86)\, включая подкаталоги для 64-разрядных версий Windows

...