адрес WndProc

Тема в разделе "WASM.WIN32", создана пользователем cresta, 8 ноя 2004.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Пытаюсь получить адрес WndProc другого приложения, и на

    invoke SetWindowLong,hSub,GWL_WNDPROC,ADDR HookProc

    возвращается ноль, на вызов GetLastError: описание ошибки - "Отказано в доступе"

    A SPY++ показывает адрес WndProc, без проблем. Как можно получить доступ к этой процедуре, чтобы самому обработать одно из сообщений, которое в ней не обрабатывается?

    Заранее спасибо
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    внедриться в процесс
     
  3. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Мне кажется, можно обойтись без доступа к WndProc, достаточно поставить хук на сообщение
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    vinnie_pooh



    Я вот ставлю его (хук), а он падает, иногда вместе с Виндой на пару :dntknw: Сначала процедура обработки HookProc была в ехе, затем перенёс в dll, но что-то танцы с бубном не помогают :dntknw:( Где тут может быть засада?


    Код (Text):
    1. ;тут получение адресов 2-х процедур из dll
    2. ;адреса получаю корректно
    3. .elseif eax==WM_CREATE
    4.     invoke LoadLibrary,ADDR LibName
    5.     .if eax!=0
    6.         mov hLib,eax
    7.         invoke GetProcAddress,hLib,ADDR ProcName1
    8.         mov hProc1,eax
    9.         invoke GetProcAddress,hLib,ADDR ProcName2
    10.         mov hProc2,eax
    11.     .endif
    12.  
    13. ;тут ставлю хук на сообщения
    14.     invoke GetWindowRect,hWin,ADDR Rct
    15.     dec Rct.left
    16.     invoke WindowFromPoint,Rct.left,Rct.top
    17.     mov hSub,eax
    18. ; установка хука на сообщения, hProc2 - адрес процедуры обработки в dll.
    19.     invoke SetWindowsHookEx,WH_GETMESSAGE,hProc2,hInstance,0
    20.     mov hScrHook,eax
    21.     push hScrHook        ;хэндл хука
    22.     push WM_MOUSEWHEEL       ;интересующее сообщение
    23.     push hSub                ;хэндл окна, для которого сообщение
    24.     Call hProc1                  ;процедура установки 3-х значений^^
    25.  
    26. ;а здесь две процедуры в dll: первая - её адрес в ехе hProc1
    27. SetHookData proc hWin:DWORD, HookMessage:DWORD, hHook:DWORD    
    28. .data
    29.     HookWnd     dd ?
    30.     HookMsg     dd ?
    31.     hScrHook    dd ?
    32. .code
    33.     push hHook
    34.     pop  hScrHook
    35.     push hWin
    36.     pop  HookWnd
    37.     push HookMessage
    38.     pop  HookMsg
    39.     PrintHex HookWnd      ;хендл хука, хэндл окна и код интересующего сообщения приходят нормально
    40.     PrintDec HookMsg
    41.     PrintDec hScrHook
    42.     ret
    43. SetHookData endp
    44.  
    45. ;вторая процедура - её адрес в ехе - hProc2
    46. HookProc proc hCode:DWORD, wParam:DWORD, lParam:DWORD    
    47.     invoke Beep,1000,100    ;это как индикатор :)
    48.     mov eax,hCode
    49.     .if eax<0
    50.         invoke CallNextHookEx,hScrHook,hCode,wParam,lParam
    51.         ret
    52.     .else
    53.         mov eax,lParam
    54.         cmp eax,HookMsg
    55.         jne @F
    56.             ret
    57.         @@:
    58.         invoke CallNextHookEx,hScrHook,hCode,wParam,lParam
    59.         ret
    60.     .endif
    61.     xor eax,eax
    62.     ret
    63. HookProc endp




    и ни хрена не бикает вторая процедура. Не вызывается вообще :dntknw:



    Пробовал WH_CALLWNDPROCRET поставить - Винда падает...



    masquer



    А может у тебя какой пример найдётся, а то поиск мне только предложил внедриться в процесс производства каких-то макарон :) (через ya.ru)
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Помоему ICEZLION предупреждал что хук должен находиться в библиотеке.. которая должна меппироваться в процесс нужный (ID процесса указываешь про установке хука)

    Так что читай внимательно !
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Почитал IsZelion: в нём указано, что секция неинициализированных данных должна быть разделяемая между процессами, якобы это реализуется через опции линкера /SECTION:.bss,S

    Пытаюсь указать эту опцию в RadASM'e - он все что после .bss воспринимает как имя файла и на такую строку

    7,O,$B\LINK.EXE /SECTION:.bss,S /SUBSYSTEM:WINDOWS /RELEASE /DLL /DEF:$6 /LIBPATH:"$L" /OUT:"$7",3

    выдаёт ошибку, что не найден файл

    S /SUBSYSTEM:WINDOWS /RELEASE /DLL /DEF:$6 /LIBPATH:"$L" /OUT:"$7",3

    А как указать RadASM'у, что секция разделяемая (S) - не знаю.

    Пробовал использовать makefile из туториала (из примера) - он тоже не работает. DLL не создаётся. Такой вот капкан :dntknw:((

    А сама dll работает, но выдаёт сообщения только адресуемые моему окну, а мне они нахрен не нужны, нужны чужие.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Радасм не слинкует ее вот я создал *.BAT файлик все отлично линкуеться ...

    сам проверял (причем недавно)...



    @echo off



    E:\ASM\masm32\bin\ml /c /coff /Cp Splash_dll.asm



    E:\ASM\masm32\bin\Link /SECTION:.bss,S /DLL /DEF:Splash_dll.def /SUBSYSTEM:WINDOWS /LIBPATH:E:\ASM\masm32\lib Splash_dll.obj



    pause



    и еще в своем исходнике пропиши пути к инклюдам иначе нихера не закомпилиться
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    TermoSINteZ







    Да, я тут шёл сказать, что пришлось все пути к инклюдам указать полностью, а не относительные. Как и в .bat'e



    Усё работает :) Спасибо всем