Advertisement
Guest User

unCoder - Api Hooking

a guest
Oct 27th, 2012
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1.     /*
  2.      
  3.     By : unCoder
  4.     WebSite www.dev-point.com
  5.      
  6.     */
  7.      
  8.     #include <Windows.h>
  9.     #define SIZE 6  
  10.      
  11.     typedef BOOL (WINAPI *pTerminateProcess)(HANDLE, UINT);  
  12.     BOOL WINAPI MyTerminateProcess(HANDLE, UINT);
  13.      
  14.     void BeginRedirect(LPVOID);
  15.      
  16.     pTerminateProces pOrigMBAddress = NULL;
  17.     BYTE oldBytes[SIZE] = {0}; // بايت يحمل البآيتات الاصلية لكي نتمكن من عمل unHook
  18.     BYTE JMP[SIZE] = {0}; // متغير يحمل بتات القفزة
  19.     DWORD oldProtect; // دي ورد ليحمل حماية ادرس الدالة بعد تغييره للقفزة
  20.     DWORD myProtect = PAGE_EXECUTE_READWRITE;  
  21.      
  22.     INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
  23.     {
  24.         switch(Reason)
  25.         {
  26.      
  27.         case DLL_PROCESS_ATTACH:
  28.             pOrigMBAddress = (pTerminateProcess)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "TerminateProcess"); // جلب ادرس الدالة وإسناده للبوينتر
  29.      
  30.             if(pOrigMBAddress != NULL)
  31.                 BeginRedirect(MyTerminateProcess); بدأ تغيير ادرس الدالة إلى الفنكشن الخآص بنا  
  32.             break;
  33.      
  34.         case DLL_PROCESS_DETACH: // if library unload
  35.             memcpy(pOrigMBAddress, oldBytes, SIZE); // إرجآع ادرس الدالة الأصلي
  36.         case DLL_THREAD_ATTACH:
  37.         case DLL_THREAD_DETACH:
  38.             break;
  39.         }
  40.         return TRUE;
  41.     }
  42.      
  43.     void BeginRedirect(LPVOID newFunction)
  44.     {
  45.             ///// القفزة     JMP     x     x    x     x    RET
  46.         BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
  47.      
  48.             /////  نسخ البايتات للمتغير الجديد
  49.         memcpy(JMP, tempJMP, SIZE);
  50.      
  51.             // حساب حجم القفزة = ادرس الفنكشن الجديد - ادرس الدالة - 5
  52.          
  53.         DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5);
  54.      
  55.             // تغيير حماية ادرس الدالة لنتمكن من الكتابة والقرآءة منه
  56.         VirtualProtect((LPVOID)pOrigMBAddress, SIZE,  PAGE_EXECUTE_READWRITE, &oldProtect);
  57.      
  58.             // حفظ ادرس الدالة في متغير لنتمكن من عمل unHook
  59.         memcpy(oldBytes, pOrigMBAddress, SIZE);
  60.      
  61.             // وضع الادرس اللذي سنقفز اليه وتم حسابه في الأعلى JMP [ x   x   x   x ] RET
  62.         memcpy(&JMP[1], &JMPSize, 4);
  63.      
  64.             // تغيير ادرس الدالة لأدرس القفزة اللتي ستؤدي للفنكشن الخىص بنا
  65.         memcpy(pOrigMBAddress, JMP, SIZE);
  66.      
  67.             // إرجاع الحماية القديمة
  68.         VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
  69.     }
  70.      
  71.     BOOL  WINAPI MyTerminateProcess(HANDLE hProcess,UINT uExitCode)
  72.     {
  73.             // ننفذ مانريد ->
  74.             MessageBoxA(0, "Can't  Terminate", "Hooked",MB_ICONERROR);
  75.      
  76.         return false; // إرجاع قيمة
  77.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement