7- Import Address Table Hook, 32-bit, 64-bit

1 التعليقات
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا ، انك انت السميع العليم 

   ==========> Import Address Table Hook, 32-bit, 64-bit <==========

الاخوة الاعزاء ، تكلمنا فيما سبق عن Trampoline Hook

واليوم سوف نتطرق الى IAT Hook
 وبالطبع يحتاج فهم هذه الـHook الي فهم ما هو اساسا PE File , وما هي PE Format، وذلك قبل الولوج الى IAT/EAT Hooks 

وبالطبع لن يتم شرح الـPE Format لان شرحه سوف يطول ويطول واشك اساسا في اننا سوف نوفيه حقه !

ويمكن القراءة عنه داخل MSDN - PE

==========> آلية عمل Import Address Table Hook <==========

كما نعلم بان الملف الـDll عبارة عن ...

كما نرى ان الملف عبارة عن 

6- Trampoline Hook, 32-bit, 64-bit

0 التعليقات
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا، وانفعنا بما علمتنا، وزدنا علماً

==========> Trampoline Hook, 32-bit, 64-bit <==========

لقد قمنا سابقا بشرح الـDetours Hook ، وقد قلنا بانه وفي حالة استدعاء الـAPI نفسها من الـFilterFun فإنه سوف يحدث Infinite LOOP ، طبعا لانه عند استدعاء الـAPI يقوم بالقفز الى FilterFun واذا تم استدعاء الـAPI من FilterFun مرة اخرى سوف يؤدي الى Infinite LOOP 

ولكن نحن بحاجة احيانا الى فلترة الـParameters مع اعادة استدعاء الـAPI نفسها وبذلك نلجأ الى الـTrampoline Hook
اي ان الفرق بين الـTrampoline و detours هو امكانية إعادة الاستدعاء من FilterFun

والتعليمات المستخدمة هي JMP  كما تلكمنا سابقا وبدون اي تغيير ، اي ان الفرق بسيط 

يمكن ان يتدابر للبعض ان يعمل Hook - UnHook باستخدام الـDetours
اي انه اذا اراد استدعاء الـAPI نفسها من داخل FilterFun قام بارجاع الـبايتات الاصلية ثم قام باستدعاء الـAPI ثم قام بكتابة قفزة الـJMP مرة اخرى  
صحيح بانها تنجح ، لكن هذا خطا ، يوجد احتمالية الفشل
في حال استدعاء الـAPI اكثر من مرة ، خاصة اذا كانت الـAPI تاخذ وقت لتنفيذها ، فيمكن بعد ارجاع البايتات الاصلية ، استدعائها اكثر من مرة من قبل البرنامج المنصب عليه الـHook ، وذلك يمكن ان يتم قبل كتابة الـJMP  وهذا ما لا نريده !

==========> الآلية والفرق Trampoline Hook <==========

لقد قمنا في الـDetours بالكتابة على العنوان مباشرة 
اي OverWritten ، ولكن الذي يحدث بالـTrampoline وكمثال على MessageBoxA كالتالي ...



5- Detours Hook, 32-bit, 64-bit

1 التعليقات


بسم الله الرحمن الرحيم 



السلام عليكم ورحمة الله وبركاته 



اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 



==========> Detours Hook <==========
الاخوة الاعزاء ، تكلمنا في الدرس السابق عن كيفية تعطيل عمل API
وفي الدرس الذي قبله عن DLL File Injector 

والان سوف نقوم باذن الله ببرمجة DLL File اي سوف نقوم ببرمجة مكتبة الهوك ، حتى نقوم بحقنها ، ومن بعد تشغيلها ، لتقوم بعمل Hook ، ومن ثم يتم تمرير الـParameters على Filter Function الخاصة بنا داخل المكتبة 


4- Disable API

1 التعليقات
بسم الله الرحمن الرحيم 

السلام عليكم ورحمة الله وبركاته 

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 

==========>   Disable API <==========
بحمد الله وبفضله قد شرحنا سابقا الهوك ومفهومه واّليته
وتم شرح الـDll File Injector
وآليته 

الان نتطرق الى كيفية تعطيل الـAPI ليكون مقدمة 
للتطرق الى كيفية عمل Hook على API بالنوعين Detours + Trampoline

==========> How It's Work ! <==========

نعلم ، بان البرنامج عبارة عن مجموعة من التعليمات البرمجية ASM لذلك عند استدعاء API 
يكون الامر كالتالي


3- DLL File Injector

3 التعليقات
بسم الله الرحمن الرحيم 

السلام عليكم ورحمة الله وبركاته 

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 

==========>  Dll File Injector <==========




بحمد الله وبفضله قد شرحنا سابقا الهوك ومفهومه واّليته
وقد قلنا سابقا بان الـHook 
عملية فلترة وتنقية للـAPI والـFunctions 

نحن نريد تنقية API ، اي بمعنى اخر نريد بدل استدعاء WinAPI الاصلية يتم استدعاء الـFunction الخاص بنا ليتم الفلترة والتنقية كما نريد ، ولكن كيف سوف يتم المرور على الـFunction الخاص بنا ، وهو اصلا ليس جزئا من البرنامج نفسه ؟ وكيف سوف يتم تمرير الـParameters الخاصة بالاستدعاء الى الـFunction الخاص بنا والـFunction الخاص بنا للفلترة غير محمل بالذاكرة اصلا ؟

ومن هنا جائت الحاجة الى Dll File Injector 
اذ اننا سوف نقوم بتشغيل ملف Dll داخل Process اخر ، اي نحن بحاجة لحقن ملف Dll داخل Process
(وذلك الـDLL يحتوي على Function الفلترة وايضا يحتوي على اكواد عمل الـHook على الـAPI التي نريد ) ليتم عمل هوك على الـAPI المطلوبة ، وليتم تمرير الاجرائات المستخدمة على الـFunction الخاصة بنا داخل نفس البرنامج اي بدون الحاجة لبرامج خارجية او او ...


حسنا ! ، بالبداية حتى ننشئ هذا Dll File Injector 
نحتاج لنعرف قرابة 5 API's ، وربما لن نتطرق لشرح كافة الـParameters الخاصة بها شرحا وافيا الا ما نحتاجه

الان ، بالبرنامج العادي الذي تبرمجه كمبرمج ! كيف يتم تحميل DLL File داخله ؟
يتم ذلك عن طريق  LoadLibrary API (ادخل لتقرا عنها اذا كنت لا تعرفها)


==========>  LoadLibrary API <==========

HMODULE WINAPI LoadLibrary(
  _In_  LPCTSTR lpFileName );

هذه الـAPI تقوم بتحميل الـDLL File داخل البرنامج


 وتاخذ 1Parm  وهو مسار المكتبة او اسمها
 _In_  LPCTSTR lpFileName


وتقوم بارجاع Handle المكتبة 






طبعا هذا لو نحن برمجناه 
لكن المشكلة باننا لسنا من برمجه ونحتاج الى حقن هذه الـDLL من برنامج خارجي وبطريقة غير رسمية تقريبا ...


==========> CreateRemoteThread API <==========

HANDLE WINAPI CreateRemoteThread(
  _In_   HANDLE hProcess,
  _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_   SIZE_T dwStackSize,
  _In_   LPTHREAD_START_ROUTINE lpStartAddress,
  _In_   LPVOID lpParameter,
  _In_   DWORD dwCreationFlags,
  _Out_  LPDWORD lpThreadId );


هذه الـAPI تقوم بانشاء Thread ، وهذه الـThread سوف يتم تحديد موضوعه ومحتواه ، اي ماذا يفعل وماذا سوف يستدعي من API ، فنحن نريد انشاء Thread داخل الـProcess المستهدف يستدعي LoadLibrary ببارميتر مسار مكتبة الـHOOK التي سوف نبرمجها لاحقا ليقوم الثرد بتحميل المكتبة الى الـProcess ومن ثم تشغيلها 

وتاخذ 7 Parameters 
ما يهمنا الاول ، والرابع والخامس


الاول - وهو Process Handle مقبض العملية التي تريد الحقن فيها
_In_   HANDLE hProcess
..........
الرابع - هو عنوان الـFunction التي نريد تشغيلها وهي LoadLibrary API لكن نحتاج لجلب عنوانها 
  _In_   LPTHREAD_START_ROUTINE lpStartAddress
..........
الخامس - وهو الـParamter الذي نريد ارفاقه للـFunction التي نريد استدعائها في الParameter الرابع 
_In_   LPVOID lpParameter


تقوم بارجاع Handle الـThread الذي تم انشائه اذا نجحت العملية ، واذا فشلت ترجع NULL






نلاحظ في  CreateRemoteThread API
 الـParameters المستخدمة ! نحتاج الى تجهيزها 
الان نلاحظ ! الـParameter الاول نوع Handle اي اننا نحتاج مقبض
وسوف نحصل عليه من OpenProcess API


==========> OpenProcess API <==========

HANDLE WINAPI OpenProcess(
  _In_  DWORD dwDesiredAccess,
  _In_  BOOL bInheritHandle,
  _In_  DWORD dwProcessId );

ببساطة تاخذ 3 Parameters 


 نلاحظ الـParameter الاول  ، وهو الصلاحيات التي نريدها وللاطلاع على الصلاحيات

طبعا اذا قمنا بالدخول على  CreateRemoteThread API
نلاحظ باننا نحتاج صلاحيات هذه كافة

PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION,
 PROCESS_VM_OPERATION, PROCESS_VM_WRITE, and PROCESS_VM_READ

او سوف نستخدم PROCESS_ALL_ACCESS ، لكن احذر عند استخدامها ، يمكن ان يفشل ولا سمح لك الـProcess بالحصول على كافة الصلاحيات 
_In_  DWORD dwDesiredAccess
..........
اما الـParameter الثاني  ، لن نتطرق لشرحه كثيرا ولا يعنينا ، لكن ! اذا كان هذا الـParameter قيمته TRUE
 فان العمليات التي انشئت تحت هذا Process سوف يتم وراثتها من قبل الهاندل والعكس صحيح
 _In_  BOOL bInheritHandle
..........
اما الـParameter الثالث ، فهو PID اي Process ID 
_In_  DWORD dwProcessId


بعد ذلك اما ان تقوم الـAPI بارجاع الـHandle ويعني نجاحها او ان تقوم بارجاع NULL ويعني فشلها




نلاحظ في  CreateRemoteThread API الـParameter الرابع
وهو البارميتر الذي نريد تمرير له عنوان الـAPI التي نريد استدعائها 
ولنحصل على ذلك العنوان نستخدم ...


==========> GetProcAddress API <==========

FARPROC WINAPI GetProcAddress(
  _In_  HMODULE hModule,
  _In_  LPCSTR lpProcName
);

تاخذ 2 Parameters


الاول - هو Handle المكتبة التي نريد استدعاء منها الـAPI
وقد سبق الكلام عن استدعاء Handle للمكتبة عن طريق  LoadLibrary API
ومن خلال هذه الـParameter سوف نقوم بجلب هاندل عن طريق   LoadLibrary API للمكتبة التي تحتوي
لاننا نريد ان نستخدم   LoadLibrary API داخل الـProcess المستهدف
_In_  HMODULE hModule
..........
الثاني - وهو اسم المكتبة والذي سوف يكون "LoadLibraryA"
لماذا LoadLibraryA
تدل على ANSI ، ونحن نريد تمرير عنوان المكتبة ، ANSI وليس UNICODE
_In_  LPCSTR lpProcName


اذا نجحت سوف تقوم بارجاع العنوان داخل المكتبة للـFunction المطلوبة وان لم تنجح سوف تقوم بارجاع NULL



نلاحظ في  CreateRemoteThread API الـParameter الخامس
نلاحظ انه LPVOID اي انه Pointer وليس LPCSTR
لذلك يستحيل ان نمرر البارميتر الذي نريده مباشرة ، كـLPCSTR او String عادي ، لذلك نحتاج الى كتابته على الذاكرة الخاصة بالـProcess لتمريره ، والذاكرة الخاصة بالبروسس لا نريد الكتابة عليها عشوائيا ، حتى لا يحدث خلل ، وحتى لو اردنا الكتابة عليها عشوائيا نحتاج الى صلاحيات معينة ايضا 
ولنقوم بذلك نحتاج الى 2 API's 

بالبداية دعنا نتعرف على

==========> WriteProcessMemory API <==========

BOOL WINAPI WriteProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPVOID lpBaseAddress,
  _In_   LPCVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesWritten );


وهي API تستخدم للكتابة على الذاكرة نلاحظ انها تاخذ 5 Parameters


الاول - Process Handle وقد سبق شرح جلبه عن طريق  OpenProcess API
مع العلم باننا نحتاج الى الصلاحيات
 PROCESS_VM_WRITE and PROCESS_VM_OPERATION

ولا داعي لإعادة جلب Handle بهذه الصلاحيات لاننا استخدمنا الصلاحيات نفسها ضمن جلب صلاحيات لانشاء الـThread في  CreateRemoteThread API 
_In_   HANDLE hProcess
..........
الثاني - ويتم تمرير له العنوان الذي نريد الكتابة عليه 
 _In_   LPVOID lpBaseAddress
وسوف يتم الشرح عنه بالاسفل وكيف سوف نجلبه عن طريق API اخرى
..........
الثالث - وهو الـString الذي نريد كتابته 
نلاحظ
LPCVOID
Long Pointer Char 

وهو المتغير الذي سوف نحفظ فيه مسار مكتبة الـHook
 _In_   LPCVOID lpBuffer
..........
الرابع - وهو طول عنوان المكتبة التي تم تمريرها في الـParamter الثالث
_In_   SIZE_T nSize
..........
الخامس - لا يهمنا ، ويتم تمرير له Pointer من نوع SIZE_T
ليتم تخزين فيه عدد البايتات الفعلية التي تمت كتابتها كما ترون _Out_
  _Out_  SIZE_T *lpNumberOfBytesWritten

اذا تمت العملية بنجاح ترجع TRUE ، اذا فشلت NULL





الان  WriteProcessMemory API سبق وقلنا بان الـParameter الثاني نريد تمرير له العنوان الذي نريد الكتابة عليه ، اي اننا نريد حجز جزء من الذاكرة بمقدار ما نريد كتابتة ( الـParameter الرابع ) ولفعل ذلك نحتاج الى


==========> VirtualAllocEx API  <==========

LPVOID WINAPI VirtualAllocEx(
  _In_      HANDLE hProcess,
  _In_opt_  LPVOID lpAddress,
  _In_      SIZE_T dwSize,
  _In_      DWORD flAllocationType,
  _In_      DWORD flProtect );


طبعا هي تقوم بحجز جزء من الذاكرة بالصلاحيات التي تريدها ونلاحظ ان لها 5 Parameters


الاول - Process Handle وقد تم شرح جلب Handle عن طريق OpenProcess API
وهذه الـAPI تحتاج الى صلاحية
PROCESS_VM_OPERATION 

ولا داعي لإعادة جلب Handle لان الصلاحيات المطلوبة تم استخدامها نفسها في CreateRemoteThread API  
_In_      HANDLE hProcess
..........
الثاني - طبعا كما تلاحظون هو optional اختياري _In_opt_  ، وسوف نستخدم قيمة NULL له 
لكن ببساطة هذه الـParameter يتم وضع فيه العنوان الذي نريد البدء منه في حجز الذاكرة 
_In_opt_  LPVOID lpAddress 

واذا قمنا باختيار عنوان محدد ، يمكن ان يفشل في الحجز فيه لذلك
 سوف نستخدم NULL 
ليختار المكان المناسب لحجز الذاكرة داخل الذاكرة
..........
الثالث - وهو مقدار المساحة التي نريد حجزها وسوف يكون طول مسار مكتبة الـHook
_In_      SIZE_T dwSize
..........
الرابع - وهو نوع المساحة التي نريد حجزها
وله اربع انواع بشكل رئيسي ! ولا نريد التكلم عنها جميعا لانها ليست موضوعنا 
ويمكنك رؤيتها في المرجع الخاصة بالـAPI اعلاه 

الا اننا سوف نقوم باستخدام نوع MEM_COMMIT
اذ ان هذه النوع يستخدم لتخزين المعلومات وهذا ما نريده 
..........
الخامس - وهو صلاحيات الحماية التي نريد استخدامها 
ويمكن رؤية جميع الصلاحيات من هنا

الان بما اننا نريد ان نكتب على الذاكرة ومن ثم سوف يتم قرائتها من قبل 
يعني ذلك باننا نحتاج الى صلاحيات للكتابة والقرائة لذلك سوف نستخدم
PAGE_READWRITE
  _In_      DWORD flProtect


سوف يتم ارجاع العنوان الذي تم فيه حجز الذاكرة ويعني ذلك نجاحها  ، في حالة ارجاع NULL يعني ذلك 
فشلها في حجز الذاكرة




 ==========> الان الخطوات البرمجية <==========
1- تعريف متغير ووضع فيه مسار المكتبة المطلوبة حقنها
2- جلب مقبض HANDLE للـProcess المراد حقنها
3- حجز ذاكرة بمقدار طول مسار المكتبة
4- كتابة المسار على الذاكرة المحجوزة
5- انشاء Thread ليقوم بتشغيل LoadLibraryA على المكتبة
6- اغلاق الـHANDLE



C++ CODE 

#include <Windows.h>
#include <iostream>
void main() {
 int ProcessID = 1760; // Process identifier
 char* LibPath = "C:\\ProgrammingTest\\DllFile.dll"; // Dll File Path
 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);  // Get Process Handle
 LPVOID BufferAddress;
 BufferAddress = VirtualAllocEx(hProc, NULL, strlen(LibPath) + 1, MEM_COMMIT, PAGE_READWRITE); // Allocate A Buffer And Get The Address
 WriteProcessMemory(hProc, BufferAddress, LibPath, strlen(LibPath), NULL); // Write the LoadLibraryA API Parameter(DLL Path) On Memory Buffer(BufferAddress) .
 // Create A Thread That Runs In The Virtual Address Space In The Process With LoadLibraryA With Our Parameter
 HANDLE x = CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibraryA("Kernel32"), "LoadLibraryA"), BufferAddress, NULL, NULL);
 CloseHandle(hProc);
 if (x == 0) std::cout << "Injection Failed.\n";
 else std::cout << "Injected Successfully.\n";
 system("pause");
}



ملاحظات : 
1- يمكنك تجربة الـInjector اعلاه ، قم ببرمجة ملف dll ليكون كتجربة كالتالي

#include <Windows.h>
void WINAPI DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) {
        switch (Reason) {
        case DLL_PROCESS_ATTACH: // Beginning
                MessageBoxA(0, "Injected Successfully." , "M" , 0); break;
        case DLL_PROCESS_DETACH: // At End
                MessageBoxA(0, "End ...", "M", 0);
        }

2- اغلق الـAnti-Virus 
3- اذا كان البرنامج الذي تريد حقنه لديه صلاحيات Admin يجب ان يكون لديك ايضا نفس الصلاحيات
4- اذا كان البرنامج المراد حقنه x64 يجب ان تعمل Compile على x64 للـDll File وايضا Dll File Injector



إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان
اترككم في امان الله ورعايته 

والسلام عليكم ورحمة الله وبركاته


DoneByM

عمل هوك ، صنع هوك ، فلترة دالة ، فلترة API ، القضاء على Function ، انشاء حماية ، منع استخدام Function ، كيفية عمل هوك ، كيفية عمل Hook ، هوك Detours ، هوك trampoline ، هوكات IAT , EAT ، Kernel32.dll , System32 , User32.dll , هوك Ring3 ، User Mode Hook, Kernel Mode Hook , الكتابة على الذاكرة 


2- مقدمة حول الـWinMesssages Hooking

1 التعليقات
بسم الله الرحمن الرحيم 

السلام عليكم ورحمة الله وبركاته 

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 

=========> مقدمة حول Window Messages Hooking <==========

نحن لا نريد شرح ارسال واستقبال Window Messages
بل نريد بيان بعض المعلومات عنها وفهم القليل عنها لدخول في Hook الخاص بها

بالبداية دعنا نتلكم حول Window Messages قليلا ! ، اذ انها تعد مهمة جدا جدا بل والاهم في الترابط والاتصال والتفاعل بين النظام والنوافذ والاجهزة المرئية الـHardware وغيرها

وبما انك مبرمج دعني اطرح عليك سؤال : هل تسائلت يوميا عن 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 
.....

الرسائل يتم ارسالها مع 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



إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان 
اترككم في امان الله ورعايته 

والسلام عليكم ورحمة الله وبركاته

DoneByM

عمل هوك ، صنع هوك ، فلترة دالة ، فلترة API ، القضاء على Function ، انشاء حماية ، منع استخدام Function ، كيفية عمل هوك ، كيفية عمل Hook ، هوك Detours ، هوك trampoline ، هوكات IAT , EAT ، Kernel32.dll , System32 , User32.dll , هوك Ring3 ، User Mode Hook, Kernel Mode Hook , الكتابة على الذاكرة 

1- مقدمة حول الـWinAPI Hooking

1 التعليقات
بسم الله الرحمن الرحيم 

السلام عليكم ورحمة الله وبركاته 

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 

=========> مقدمة حول الـWinAPI Hooking <==========

الهوك ومن اسمه هو خطاف ، يستخدم لمراقبة او فلترة او تعديل الاستدعاءات الخاصة بالـFunctions او WinAPI 

وحتى اوضح الفكرة اكثر ، فعلى سبيل المثال الـAnti-Virus ،هل تسائلت يوميا كيف وانه عندما تفتح برنامجا واذا كان ذلك البرنامج مصاب بفايروس فانه يتم التقاطه ومسحه ، لكن كيف ؟ وكيف عرف الـAnti-Virus بانك قمت بتشغيل ذلك الملف اصلا ؟ او حتى انك تريد تشغيله !!!
بالطبع إن الـAnti-Virus لم ينتظر حتى تشغيل البرنامج المصاب ومن ثم قام بايقافه ، فماذا لو تم تشغيل اكثر من Process في آن واحد ؟ فكيف سوف يتعامل المستخدم مع ذلك الامر اساسا ؟ 

بالواقع ذلك عمل الـHook تحديداً فانه عندما يقوم المستخدم او اي عملية اخرى بتشغيل ملف معين ، فانه يستخدم API اسمها CreateProcess ( اضغط لتدخل مرجعها من قبل MS )  ، وهذه الـAPI هي المسؤولة عن تشغيل البرامج ، فوظيفة الـHook هي مراقبة هذه الـAPI عند استدعائها وعمل فلترة لها واتخاذ الاجراءات المناسبة لما يترتب على ذلك الامر   

اذا اي استدعاء للـProcess عن طريق CreateProcess فانه بالواقع يمر ببرنامج الـAnti-Virus ليقوم بفلترته ومن ثم تنفيذه ، وبذلك يتم حماية المستخدم

وايضا هنالك الكثير من API المسؤولة عن نقل الملفات ونسخها وحذفها او قتل الـProcess او إنشائها او اخذ Handle لها ، ولذلك فهل يستطيع احد قتل الـAnti-Virus باستخدام Task Manager ، بالطبع لا ، وبنفس الوقت انا لا اقول انه لا يمكن قتله 

=========> انواع الـWinAPI Hooking <==========

ينقسم الهوك الى عدة انواع
Ring -1
Ring 0
Ring 1
Ring 2
Ring 3

ما يهمنا حاليا Ring 3

Ring-1: بالواقع نوع من انواع الهوك يتم على مستوى CPU ولم يتم التصريح عنده بعد او اتخاذه بشكل رسمي او استخدامه 
Ring0: او ما يطلق عليه Kernel-Mode Hook، اذ انه يتم على مستوى النواة وعلى كافة البرامج وهو ما تستخدمه برامج الحماية 
Ring1 & Ring2: هوكات تحدث داخل النظام ولا يتم التعامل معها


Ring3: ويطلق عليه User-Mode Hook ، وبالواقع هو الذي يهمنا حاليا ويتم على Process معين ! ويمكن جعله Global Hook ولكل ذلك عيوب ومميزات ، ويقسم الى 4 انواع معروفة :-

Detours 
Trampoline
IAT - Import Address Table 
EAT - Export Address Table 

=========> اّلية WinAPI Hook Type Ring3 <==========

إذا قمنا بالدخول الى CreateProcess مرة اخرى ، فنجد بان هذه الـAPI موجودة داخل DLL باسم Kernel32.dll
وهذه الملف يوجد داخل مجلد system32  --- C:\Windows\system32
وبما ان هذه الـAPI توجد داخل الـDLL File اذا بالتاكيد فان لها عنوانا داخل هذه الملف 

ومن المعروف بانه عند تشغيل برنامج معين فانه يتم تحميله على الذاكرة لمعالجته ، وبالتالي وبما ان البرنامج يتم تحميله على الذاكرة سوف يقوم بتحميل المكتبات التي يستخدمها ايضا معه في الذاكرة ليقوم باستدعاء منها ما يشاء

ومن المعروف ايضا بانه يمكننا الكتابة على الذاكرة والتلاعب بها كيف ما نشاء 
..... 

ومن هنا جائت الفكرة ! اذ ان عنوان الـAPI معروف ويمكننا التلاعب بالذاكرة، فالبطبع يمكننا كتابة تعليمات ASM على ذلك العنوان كيف ما نشاء ، ويمكننا تغيير ذلك العنوان اساسا الى عنوان الFunction الخاص بنا ، وبالتالي تم تحقيق الهوك على الـAPI المراد الحماية منها ، مع العلم بان لكل هوك نوع وطريقة خاصة به لتادية ذلك الامر وسوف يتم شرح ذلك في مواضيع قادمة ان شاء الله لانظمة 64bit ,,, 86bit 


إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان 
اترككم في امان الله ورعايته 

والسلام عليكم ورحمة الله وبركاته

DoneByM

عمل هوك ، صنع هوك ، فلترة دالة ، فلترة API ، القضاء على Function ، انشاء حماية ، منع استخدام Function ، كيفية عمل هوك ، كيفية عمل Hook ، هوك Detours ، هوك trampoline ، هوكات IAT , EAT ، Kernel32.dll , System32 , User32.dll , هوك Ring3 ، User Mode Hook, Kernel Mode Hook , الكتابة على الذاكرة 

يمكنك النقل من المدونة كيف ما تشاء وبدون ذكر المصدر