خب من یه مقاله کامل در مورد هوک نوشته دارم بخشی از اون رو براتون میگزارم تا راحتر متوجه بشید
Hook چیست
Hook یک تابع callback میباشد که به برنامه ما این امکان را میدهد تا اطلاعات قبل از رسیدن به مقصد انها را دریافت کند و hook میتواند این اطلاعات را قبل از رسیدن به مقصد وارسی یا تغییر دهد ویندوز دارای هوک های مختلفی میباشد که هر نوع به منضور دسترسی به اطلاعات خاصی طراحی شده اند بطور مثال میتوان با استفاده از WH_MOUSE hook پیغامهای مربوط به موس را مانیتور کرد هنگامی که برنامه ما از یکی این تابع callback که انرا hook procedure می نامنداستفاده میکند هنگامی که پیغامی که وابسته به ان هوک باشد ارسال شود ویندوز ان پیغام را به hook مورد نظر که به ثبت رسیده باشد ارسال میکند
لیستی از hook procedure در زیر امده است
CallMsgFilter CallWndProc CallWndRetProc CBTProc DebugProc GetMsgProc
ForegroundIdleProc JournalPlaybackProc JournalRecordProc KeyboardProc MessageProc MouseProc ShellProc SysMsgProc
برای استفاده از یک هوک ابتدا باید انرا نصب نمود(انرا به ویندوز معرفی کرد مدیریت هوک ها را بخشی بنام chain hook بر عهده دارد)
2نوع هوک وجود دارد LocalHook و System Wide Hook
Local Hook بر روی یک برنامه یا یک thread نصب می شود و کدها درون برنامه قرار می گیرد اما System Wide Hook بر روی همه برنامه ها و Therad ها اجرا می شود و کدها باید درون dll قرار بگیرد
برای نصب هوک در hook chain ما از تابع SetWindowsHookEx استفاده میکنیم این تابع 3 پارامتر دارد و مقداری که بر میگرداند id هوک نصب شده در hook chain می باشد
Hook chain بخشی ار سیستم عامل می باشد که hook ها در انجا ثبت می شوند
کد:
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId )
پارامتر idHook نمایانگر نوع هوکی هست که میخواهیم نصب کنیم
WH_CALLWNDPROC:مانیتور کردن پیغامها قبل از رسیدن به پنجره هدف
WH_CALLWNDPROCRET:مانیتور کردن پیغامها بعد ار ارسال به پنجره هدف
WH_CBT:برای مانیتور کردن اعلانات برنامه های computer-based training
WH_DEBUG:برای اشکال زدایی هوک های دیگرمناسب میباشد
GetMsgProc:برای مانیتور کردن system calls هنگامی که یک message از برنامه ای دریافت میکند
ForegroundIdleProc:مانیتور کردن بیکار idle بودن thread ریسمان مورد نظر
WH_GETMESSAGE :برای مانیتور کردن پیغامهایی که به صف پیغامهای یک پنجره post می شود
WH_JOURNALPLAYBACK:ارسال پیغامی که قبلا توسط این هوک ذخیره شده است
WH_JOURNALRECORD :پیغامهایی را که به system message queueارسال می شود را ذخیره میکند
WH_KEYBOARD:مانیتور کردن کلیدهای فشرده شده
WH_MOUSE:مانیتور کردن فعالیت های موس
WH_MSGFILTER:مانیتور کردن پیغامهایی(event message) که توسط dialog box, message box, menu, یا scroll barایجاد می شود
WH_SHELL:برای مانیتور کردن اعلانات notification های برنامه های shell
WH_SYSMSGFILTER: مانیتور کردن پیغامهایی(event message) که توسط dialog box, message box, menu, یا scroll barایجاد می شود برای تمام برنامه ها
Lpfn یک مقدار از نوع اشاره گر که به ادرس تابع هوک اشاره میکند
hMod شناسه dll که تابع hook در ان قرار دارد
dwThreadId مشخص کننده thread ریسمانی میباشد که هوک بر روی ان نصب می شود
برای غیر فعال کردن hook از تابع UnhookWindowsHookEx استفاده می شود که دارای 1 پارامتر میباشد
کد:
BOOL UnhookWindowsHookEx( HHOOK hhk );
Hhk : هندل تابع هوک مورد نظر میباشد
برای ارسال اطلاعات به هوک بعدی درhook از تابع CallNextHookEx استفاده می شود زیرا ممکن است بر روی سیستم چندین هوک نصب شده باشد