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 استفاده می شود زیرا ممکن است بر روی سیستم چندین هوک نصب شده باشد
معماری ویندوز بر پایه پیغامها هست وقتی شما مثلا رو یه دکمه کلیک میکنین یه پیغام به WM_LBUTTONDOWN با استفاده از تابع sendmessage به برنامه مورد نظر فرستاده میشه در هر برنامه در حال اجرا یک تابع peekmessage برای گرفتن پیغامها و یک تابع WindowProc برای پردازش پیغامهای دریافتی وجود داره وقتی WindowProc پیغامی دریافت میکنه از رو پارامترهای sendmessage مثل handle میفهمه که این پیغام مربوط به کدام کنترل هست و از روی نوع پیغام هم میفهمه چه عملی انجام شده و کدام رویداد یا دستورات باید اجرا بشه
حالا مثلا ما به notepad یک منوی جدید اضافه کردیم یا مثلا میخواهیم کنترل کنیم که روی برنامه ما کلید prt-sc فشرده شده یا نه در اینجا ما از هوک استفاده میکنیم هوک میاد و واسط میشه بین سیستم عامل و برنامه ما و این پیغامها قبل از رسیدن به برنامه مقصد به هوک میرن و بعد از اون به برنامه میرسن اینجوری وقتی دقیقا روی برنامه شما دکمه printscreen فشار داده بشه قبل از ارسال این دکمه به برنامه مورد نظر هوک شما اونو دریافت میکنه و شما متوجه میشین یا میتونین این دستور رو از صف پیامها حذف کنین انگار هیچ اتفاقی نیفتاده یا میتونین کلیپبورد رو پاک کنین یا در مورد همون نوت پد وقتی شما اون منو رو انتخاب میکنین باید عمل مورد نظر شما انجام بشه پس باید متوجه کلیک شدن روی منویی که اضافه کردین بشین اینجا هم با یه هوک میشه متوجه شد که کدام item از منو کلیک شده و اگه منویی که شما اضافه کردین بود عمل مورد نظر شما اعمال بشه