【问题标题】:Why did SetWindowsHookEx with the WH_JOURNALRECORD hook type always return 0?为什么带有 WH_JOURRNALRECORD 钩子类型的 SetWindowsHookEx 总是返回 0?
【发布时间】:2020-02-16 13:31:43
【问题描述】:
_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吗?

【问题讨论】:

    标签: winapi assembly x86 hook setwindowshookex


    【解决方案1】:

    根据SetWindowsHookEx documentation

    如果函数失败,则返回值为 NULL。 要获取更多错误信息,请致电GetLastError

    你没有做什么。

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

    SetWindowsHookEx for WH_JOURNALRECORD fails under Vista/Windows 7

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

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

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

      • \Program Files\,包括子目录

      • \Windows\system32\

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

    【讨论】:

    • 非常感谢您的回答。我曾尝试使用makecert.exe和signcode.exe对“hook.exe”进行签名,然后将“hook.exe”文件移动到windows\system32,但失败了。我想也许我还没有找到正确的唱法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2016-09-16
    • 2020-05-25
    • 2013-02-26
    • 2013-06-25
    相关资源
    最近更新 更多