1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Помогите с HOOK'ами

Тема в разделе "WASM.BEGINNERS", создана пользователем DrSex, 1 апр 2005.

  1. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Привет всем. HELP! ;-0

    Пишу DLL для работы с хуками (VC++ v6). DLL должна создавать хук (в задумке любой из SetWindowsHookEx), причем в EXE-шнике нужно только знать адреса нескольких функций из DLL. Есть 2 (позже, возможно, будут еще) варианта обработки хука:

    Первый - как обычно, создается процедура обработки, вызываем DSInstallHook (в смысле, мою функцию) и усе. Вот только процедура обработки может находится где угодно (не обязательно в DLL)! Реализуется так: в моей DLL лежит реальная процедура, которая и вызывает ...

    Второй - хук обрабатывается оконной процедурой. (:derisive:) ;-\ Т.е., реально,хук обрабатывается в моей DLL, и через SendMessage играем ...



    Столкнулся с алгоритмической проблемой. Хотелось бы узнать, можно ли ее решить (ессно, как тоже хотелось бы узнать :=)).

    Суть вот в чем: есть DLL, при загрузке инициализируется общая память (через CreateFileMapping), каждая следующая DLL получает доступ ко всей памяти (read-write). В DLL никакой информации о хуках не хранится - все в общей памяти. В этой памяти:

    - заголовок: ;-|

    struct MEMFILEHEADER{

    WORD bVersion; //version of DSLib that created this file

    DWORD dwFileSize;//memory file size

    DWORD dwLoadedProcessCount;//links to this file

    DWORD dwHooksCount;//hooks count

    //reserved to future

    ...

    };//MEMFILEHEADER

    - массив из структур, описывающих конкретный хук: ;-|

    struct DSHOOKINFO{

    BOOL fUsed;//is this record used ??

    DWORD dwDSHookId;//DSLib hook ID. It's not equal dwHookId!

    /*!!!!!*/ HHOOK dwHookId;//hook id. This value returns the SetWindowsHookEx

    DWORD dwDSLibraryID;//DS Library Id that was install the hook

    DWORD dwHookType;//what we're hooking

    BYTE bHookMethod;//hook method

    DWORD dwThreadId;//thread ID to install hook for

    HWND hWnd;//window handle that receive the message

    UINT uMsg;//message to be send to hWnd

    HOOKPROC dwHookProc;//user hook procedure

    };//HOOKINFO

    dwHookId нужен для вызова внутри моих обработчиков (для CallNextHookEx). Дело в том, что сохраняться то он сохраняется в общей памяти, но DLL подгружается ко всем процессам в системе (т.е. у них разное адресное пространство!) и нельзя (или можно ??) узнать какой процесс какой хук установил! Могу сделать так, чтобы DLL видела все свои хуки, но как из них выбрать нужный??



    КАК ВНУТРИ ОБРАБОТЧИКА ХУКА УЗНАТЬ ЕГО HHOOK???????



    ВОПРОС: Есть ли решение (и какое) моей проблемы?:derisive:)

    ВОПРОС: Может есть другие методы? ;\



    PS: Не ругайте сильно (то что я дурак - это я и сам знаю ж-)), но помните, что "чем меньше прыщь, тем больше пыжится!" ;)), ну очень хочется, например, подгрузить DLL, вызвать функцию и обрабатывать событие перемещения мышки по экрану (!) в оконной процедуре ... ;-\



    PPS: Сгодится любая критика, советы и т.д. ;/
     
  2. sploid

    sploid New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2004
    Сообщения:
    2
    нихренаськи не понятна проблема.

    если хочется:

    >например, подгрузить DLL, вызвать функцию и обрабатывать >событие перемещения мышки по экрану (!) в оконной >процедуре ... ;-\

    то можно подгрузить длл, найти окно, чьи сообщения нужно перехватывать. Далее этому окну сделать SetWindowLongPtr Указать свою функцию. В ней уже обрабатывать все сообщения.
     
  3. DrSex

    DrSex Юрий

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    98
    Адрес:
    Россия
    Да не ... ;\



    Энто я уже сделал.



    Дело в том, что я хочу чтобы хук можно было обрабатывать не в отдельной процедуре, а В ОКОННОЙ ПРОЦЕДУРЕ ! И все это благодаря моей DLL. ;p

    Проблема вот теперь в чем. Оконной процедуре посылается сообщение через SendMessage(). Как из оконной процедуры вернуть значение, чтобы его вернула SendMessage()??? ;-/
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Чтобы узнать HHOOK внутри обработчика надо его передвать в процесс куда внедряется длл. Это можно сделать через маппинги. Если юзать хуки в НТ, то можно ничего не передавать, а просто ставить 0 вместо HHOOK.