4- Disable API

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

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

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

==========>   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 وقد تم شرحها في الموضوع السابق
4- ارجاع الحماية كما كانت عن طريق  VirtualProtectEx 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

==========> 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 , الكتابة على الذاكرة 


هناك تعليق واحد:

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