بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد
=========> مقدمة حول Window Messages Hooking <==========
نحن لا نريد شرح ارسال واستقبال Window Messages
بل نريد بيان بعض المعلومات عنها وفهم القليل عنها لدخول في Hook الخاص بها
وبما انك مبرمج دعني اطرح عليك سؤال : هل تسائلت يوميا عن events التي تستخدمها عند بناء مشروع ؟ مثلا
FormClosing
MouseDown
هل تسائلت كيف تحدث ؟ وكيف تجري ؟ إن المعروف بان الـevent ببساطة اجراء معين يتم عند حدوث شيئ معين ، لكن كيف يعلم البرنامج بحدوث هذا الشيئ ؟
وهذه يعطيك تماما فكرة عن الـWindow Messages ، فمثلا عندما يقوم شخص بالضغط على Alt + F4 حتى يخرج من النافذة ، فاذا اسخدمت حدث Form_Closing في C# ,,, VB.NET فانه سوف يتم استدعاء الاكواد التي قمت بوضعها داخل الـEvent ، فعند الضغط على المفتاحين Alt + F4 فانه يتم ارسال Window Message تعرف باسم WM_QUIT الى النافذة الفعالة حاليا ، ويتم معالجتها ، ومن ثم يتم اتخاذ الاجراء الخاص بها ، ونفس الشيئ اذا تم الضغط على زر الخروج في الاعلى "X"
ونفس الشيئ KeyDown ، اذا يتم ارسال رسالة اسمها WM_KEYDOWN ، وهذه الرسالة تفيد بانه تم الضغط على مفتاح معين، وتحمل الرسالة معلومات المفتاح الذي تم ضغطه ، ومن ثم تتم معالجة الحدث وما الى ذلك
والجدير بالذكر ، عند استخدام Task Manager في النظام الاعتيادي فانه لدينا تبويبان الاول Applications والثاني Processes
فالاول يقوم بجلب النوافذ وارسال WM_QUIT فتلاحظ انه يتم استدعاء FormClosing اذا قمت باستخدامه
اما Processes فاتع لا يتم ارسال اي رسالة لكن يتم استخدام API للقضاء على البروسس مباشرة
ملاحظة : WinMessages انواع
النوع الاول Window Messages ويختص بالنوافذ وهذا ما نتكلم عنه
والنوع الثاني Thread Messages ويختص بالThreads الخاصة بالـProcess
ملاحظة : بامكانك استخدام برنامج SPY++ لرؤية الرسائل التي تصل الى اي نافذة بشرط ان يكون التطبيق Native وليس .net
=========> كيف تحدث Window Messages <==========
Window Messages لها اعداد كبيرة ووظائف لا تحصى حتى Ctrl + C , Ctrl + A وما الى ذلك
عبارة عن ارسال Message ،لذلك وبشكل مفصل
.....
عند ارسال Window Message فانه يتم تخزينها في Message Queue بما يعني تخزينها داخل قائمة في الذاكرة ليتم معالجة الـWindow Messages واحدة تلو الاخرى
ولكن عند ارسال رسالة فانك تحتاج الى من يستقبلها ! ، لذلك يوجد بما يمسى Message Loop ، اذ انها Loop تقوم بالمرور على Message Queue وبمجرد ارسال رسالة وتخزينها في الـQueue تقوم بتمرير الرسالة الى Message Handler
والـMessage Handler ، عبارة عن Function صممت لتتم معالجة الرسالة المرسلة الى النافذة والتي يتم من خلالها تنفيذ الـEvent
والذي يحدث تلقائيا من قبل MS ! او ان تقوم بادراج Message Handler داخل البرنامج نفسه اي Event ليحدث هو بدلا عن الاجراء الافتراضي والتلقائي من قبل MS
ملاحظة : في C++ عليك استخدام GetMessage API التي تمثل Message Handler
ملاحظة : في C++ عليك استخدام GetMessage API التي تمثل Message Handler
.....
الرسائل يتم ارسالها مع 2 Parameters وكل Parameters يحمل قيمة 32bit - 4Byte , 64bit - 8Byte
باسم lParam ثم wParam
طبعا يتم تخزين القيم الضرورية لها على سبيل المثال
البارميتر الاول غير مستخدم
لكن البارميتر الثاني مستخدم وهو عبارة عن Pointer الى النص الجديد
وطبعا ولكل Message قيمة ترجع يمكن ان تكون 0,1 في حالة انجاح ويمكن ان تكون غير ذلك
ويمكن ان لا ترجع قيمة وترجع القيمة من خلال الـبارميترز نفسهم من خلال تمرير الـPointer
وطبعا لكل Message بارميترز خاصة فيه بامكانك ايجاد المعلومات عنه في MSDN
=========> ارسال Window Messages <==========
ولو انه خارج الموضوع قليلا ! ، الا اني سوف اتحدث عنه
ارسال الـWindow Message برمجيا يمكن اختصاره بثلاث طرق رئيسية
1-SendMessage API
2- PostMessage API
3- Another API's Are Using Send/PostMessage
اما بالنسبة لـSend/PostMessage
كلاهما لديه 4 Parameters
الاول - Hanlde
الثاني - اسم الـMessage او بمعنى اخر Message Value
الثالث - البراميتر الاول للـMessage
الرابع - البارميتر الثاني للـMessage
والفرق بينهما باختصار شديد يكمن في امكانية ارسال Messages الى Threads
او الانتظار حتى معالجة الرسالة ! اي مرورها في Queue كاملة ام لا
بالنسبة للطريقة الثالثة
يوجد بعض API's المختصة بارسال رسائل تلقائيا ! اذ انها تؤدي تلك الوظيفة بدون التعامل مع Messages
وتجد مرجعها هنا
MSDN
ملاحظة : سوف يتم انشاء بعض المواضيع عن ارسال Window Messages
وسوف اقوم بوضع الروابط هنا ان شاء الله
=========> كيف سوف نباشر بالـWindow Messages Hooking <==========
بالواقع يمكن عمل Hook بشكل رسمي على Window Messages
والمقصود من الـHook هنا فلترة الرسائل التي تصل الى النوافذ ، فمثلا يمكن عمل Keylogger لتسجيل اي مفتاح يتم الضغط عليه ويمكن عمل ClickLogger لتسجيل اي نقطة على الشاشة قمت بالضغط عليها
وهنالك API's مصرح بها من قبل MS
لعمل HOOK على الـMessages
وسوف يتم التطرق اليها ان شاء الله
ملاحظة : موضوع WinMessages موضوع كبير جدا ومهم
انصح برؤية هذا الرابط
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx
إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان
اترككم في امان الله ورعايته
اترككم في امان الله ورعايته
والسلام عليكم ورحمة الله وبركاته
عمل هوك ، صنع هوك ، فلترة دالة ، فلترة API ، القضاء على Function ، انشاء حماية ، منع استخدام Function ، كيفية عمل هوك ، كيفية عمل Hook ، هوك Detours ، هوك trampoline ، هوكات IAT , EAT ، Kernel32.dll , System32 , User32.dll , هوك Ring3 ، User Mode Hook, Kernel Mode Hook , الكتابة على الذاكرة
بارك الله بك اخي لما تقدمه
ردحذف