作者:x0101 此贴贴于2011-11-11 10:25:36,已被阅读747次/回复1 
我在DLL中写的一个钩子怎么不起作用?
我写的一个简单的DLL,DLL安装的时候同时安装一个键盘钩子,然后监视一个窗口的键盘消息,
然后把键盘消息转换成字符输出在窗口上,问题是这个钩子的过程始终没有被调用,问题在那?
代码如下:
        .386
        .model    flat, stdcall
        option    casemap:none
include    windows.inc
include    user32.inc
include    kernel32.inc
includelib    user32.lib
includelib    kernel32.lib
    .data
    .data?
hInstance        dd    ?
hHook        dd    ?
hWnd        dd    ?
idThread        dd    ?
szAscii        db    4 dup (?)
    .const
szObjectApp        db    'ObjectApp',0
szSuccess            db    '安装成功!', 0
szUnInstall        db    '已经歇灾~',0
dwMessage        equ    WM_USER+100
WM_PROCADDR    equ    WM_USER+101
    .code
HookProc    proc    _dwCode, _wParam, _lParam
    local    @szKeyState[256] : byte
    
    invoke    MessageBeep, 0
    invoke    CallNextHookEx,hHook,_dwCode,_wParam,_lParam
    
    invoke    GetKeyboardState,addr @szKeyState
    invoke    GetKeyState,VK_SHIFT
    mov    @szKeyState + VK_SHIFT, al
    mov    ecx, _lParam
    shr    ecx, 16
    invoke    ToAscii,_wParam,ecx,addr @szKeyState, offset szAscii,0
    mov    BYTE ptr szAscii [eax], 0
    invoke    SendMessage, hWnd,dwMessage,DWORD ptr szAscii,NULL
    xor    eax, eax
    ret
    
HookProc    endp
HookInstall    proc    
        invoke    SetWindowsHookEx,WH_KEYBOARD,addr HookProc, 0,idThread
        mov    hHook, eax
        .if    hHook
            invoke    MessageBox,0,offset szSuccess,offset szSuccess,0
        .endif
        ret
HookInstall    endp
HookUninstall    proc
        invoke    UnhookWindowsHookEx, hHook
        invoke    MessageBox, 0, offset szUnInstall, offset szUnInstall, 0
        ret
HookUninstall    endp
HookDll    proc    _hInstance, _dwReason, _dwReserved
    mov    eax, _dwReason
    .if    eax==DLL_PROCESS_ATTACH
        push    _hInstance
        pop    hInstance
        invoke    FindWindow, offset szObjectApp, offset szObjectApp
        mov    hWnd,eax
        invoke    GetWindowThreadProcessId,hWnd,NULL
        mov    idThread, eax
        
    
        invoke    HookInstall
        invoke    SendMessage, hWnd,WM_PROCADDR,offset HookUninstall,0
        mov    eax, TRUE
    .elseif    eax==DLL_PROCESS_DETACH
        invoke    HookUninstall

    .elseif    eax==DLL_THREAD_ATTACH

    .elseif    eax==DLL_THREAD_DETACH
    .endif
    
    ret
HookDll    endp

    END    HookDll



klafje

此贴的回复贴(直接):
要添加一个BBS的段。在论坛搜索.BBS463 我爱汇编 2012-1-6 15:44:36 0 正常