0
_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

4

1 回答 1

0

根据SetWindowsHookEx文档

如果函数失败,则返回值为 NULL。要获取扩展的错误信息,请调用 GetLastError

你没有做什么。

但是,它可能会报告ERROR_ACCESS_DENIED,因为在启用 UAC 的 Vista+ 上,日志挂钩要求应用程序具有指定“uiaccess=true”权限的 UAC 清单:

WH_JOURNALRECORD 的 SetWindowsHookEx 在 Vista/Windows 7 下失败

但是,看到“uiaccess=true”会带来额外的限制,您的应用可能无法满足这些限制:

  • 可执行文件必须经过数字签名。

  • 可执行文件必须位于以下“安全”系统文件夹之一中(这可以在 Windows 10+ 上通过策略设置禁用):

    • \Program Files\, 包括子目录

    • \Windows\system32\

    • \Program Files (x86)\,包括 64 位版本 Windows 的子目录

于 2019-10-20T06:22:04.157 回答