بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد
==========> Disable API <==========
بحمد الله وبفضله قد شرحنا سابقا الهوك ومفهومه واّليته
وتم شرح الـDll File Injector
وآليته
الان نتطرق الى كيفية تعطيل الـAPI ليكون مقدمة
للتطرق الى كيفية عمل Hook على API بالنوعين Detours + Trampoline
==========> How It's Work ! <==========
نعلم ، بان البرنامج عبارة عن مجموعة من التعليمات البرمجية ASM لذلك عند استدعاء API
يكون الامر كالتالي
الوضع الطبيعي في حالة استدعاء API |
كما نلاحظ ان هناك
MainFunction تقوم باستدعاء MessageBoxA في User32.dll ، وعند الانتهاء من الاستدعاء يتم الرجوع الى التعليمة التي بعد التعليمة التي استدعت الـMessageBoxA
الان ، بلغة الاسمبل ، كيف يمكن ان نقوم بتعطيل عملها
يمكن ذلك عن طريق كتابة RTN ، وكما نعلم ببساطة هي تعليمة عندما يصادفها المعالج يقوم بالعودة الى ما بعد التعليمة التي استدعيَ منها الاجراء ، وبذلك سوف يتم الرجوع الى مكان الاستدعاء وتعطيل الـAPI
الان وقبل التطبيق العملي ، اذا نظرت الى الصورة تجد بجانب العنوان مجموعة من القيم ، كل قيمة او كل مجموعة من القيم تمثل تعليمة معينة في لغة الاسمبل ، نحتاج معرفة ان RTN قيمتها بالذاكرة 0xC3
اذن ، الامر ببساطة كتابة هذه البايت0xC3 على عنوان الـUser32.MessageBoxA
وقلنا سابقا وشرحنا عن Dll File Injector وذلك بسبب اننا نريد تمرير الـParameters على الـFunction الخاص بنا ، ولكن هنا نريد فقط تعطيل الـAPI ولا نريد تمرير شيئ على اي Function خاص بنا ، لذلك سوف نقوم ببرمجة برنامج عادي يقوم بتعطيل الـAPI مباشرة بدون حقن
==========> الخطوات البرمجية <==========
نحتاج الى تعريف متغير من نوع BYTE يحمل قيمة الـRTN
و تحديد المكتبة واسم الـAPI الدقيق
1- جلب HANDLE للـProcess المراد تعطيل الـAPI فيها وبالصلاحيات التي تتناسب مع الـAPI's الاخرى المستخدمة وهي صلاحيات تغيير الحماية وصلاحيات الكتابة عن طريق OpenProcess API وقد تم شرحها في الموضوع السابق
2- تغيير حماية البايت الذي نريد الكتابة عليه ليتناسب مع صلاحيات الكتابة عليه وقرائته وتنفيذه عن طريق VirtualProtectEx API وسوف اقوم بشرحها بعد قليل
3- كتابة البايت RTN على عنوان الـAPI المراد تعطيلها عن طريق WriteProcessMemory API وقد تم شرحها في الموضوع السابق
C++ Code
#include <Windows.h>
#include <iostream>
void main() {
int ProcID = 0;
BYTE RTN[3] = { 0xC3 };
char API_Name[] = "MessageBoxA";
char Lib_Name[] = "User32.dll";
SIZE_T Written = 0;
HANDLE hProc = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, ProcID);
LPVOID API_Address = GetProcAddress(LoadLibraryA(Lib_Name), API_Name);
DWORD OldPro = 0;
VirtualProtectEx(hProc, API_Address, sizeof(RTN), PAGE_EXECUTE_READWRITE, &OldPro);
WriteProcessMemory(hProc, API_Address, RTN, sizeof(RTN), &Written);
if (Written == 0) std::cout << "Field ...\n";
else std::cout << "Done Successfully ...\n";
VirtualProtectEx(hProc, API_Address, sizeof(RTN), OldPro, &OldPro);
system("Pause");
}
كما نرى اعلاه ، تم استخدام صلاحيات PROCESS_VM_WRITE and PROCESS_VM_OPERATION لـWriteProcessMemory API وصلاحيات PROCESS_VM_OPERATION لـVirtualProtectEx API
BOOL WINAPI VirtualProtectEx(
_In_ HANDLE hProcess,
_In_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flNewProtect,
_Out_ PDWORD lpflOldProtect
);
لديها 5 Parameters
الاول - مقبض العملية Process Handle وتم جلبه عن طريق OpenProcess API
_In_ HANDLE hProcess
..........
الثاني : وهو بداية العنوان في الذاكرة الذي نريد تغيير حمايته ، وهو عنوان الـAPI وجلبناه عن طريق GetProcAddress API و LoadLibraryA API
_In_ LPVOID lpAddress
..........
الثالث : وهو المساحة التي نريد تغيير الحماية لها ، اي من بدء الـParameter الثاني حتى الـParameter2 + Parameter3
واعني من بدء الـParameter الثاني والى طول 10 بايتات مثلا !وفي حالتنا هو 1 Byte
_In_ SIZE_T dwSize
..........
الرابع - وهو الحماية الجديدة التي نريدها - وبما اننا نريد الكتابة عليه فنحن نحتاج صلاحيات الكتاب
وبما ان هذه البايت سوف يتم قرائته وتنفيذه فاننا نحتاج صلاحيات Read + Execute
وبالتالي فالمطلوب PAGE_EXECUTE_READWRITE
ويمكن رؤية جميع الصلاحيات
Memory Protection Constants
_In_ DWORD flNewProtect
..........
الخامس - يتم تمرير له Pointer من نوع DWORD ليتم تخزين الحماية القديمة فيه ، حتى نرجعها بعد الكتابة
والجدير بالذكر ، انه اذا كان هذه الـParameter الممرر له NULL
فان هذه الـAPI لن تعمل !!!
_Out_ PDWORD lpflOldProtect
تقوم هذه الـAPI بارجاع TRUE في حالة نجاحها في تغيير الحماية و NULL في حالة فشلها
إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان
اترككم في امان الله ورعايته
والسلام عليكم ورحمة الله وبركاته
DoneByM
عمل هوك ، صنع هوك ، فلترة دالة ، فلترة API ، القضاء على Function ، انشاء حماية ، منع استخدام Function ، كيفية عمل هوك ، كيفية عمل Hook ، هوك Detours ، هوك trampoline ، هوكات IAT , EAT ، Kernel32.dll , System32 , User32.dll , هوك Ring3 ، User Mode Hook, Kernel Mode Hook , الكتابة على الذاكرة
جزاك الله خيرا شرح سلس ومفهوم
ردحذفبوركت اخي