Advertisement
captmicro

SMALL HOOK LIBRARY

Jul 3rd, 2013
402
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.54 KB | None | 0 0
  1. #include "winlite.h"
  2. #include "hde32.h"
  3.  
  4. #ifndef DWORD
  5. typedef unsigned int DWORD;
  6. #endif
  7. #ifndef BYTE
  8. typedef unsigned char BYTE;
  9. #endif
  10.  
  11. void RemoveHook(DWORD dwOrigFn, DWORD dwHookType)
  12. void InstallHook(DWORD dwOrigFn, DWORD dwHookFn, DWORD dwHookType);
  13.  
  14. #define XALLOC(sz) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz)
  15. #define XFREE(ptr) HeapFree(GetProcessHeap(), 0, (ptr))
  16. #define XEXEC(ptr, sz) { DWORD temp; VirtualProtect(ptr, sz, PAGE_EXECUTE_READWRITE, &temp; }
  17.  
  18. typedef enum {
  19.     HOOK_TYPE_JMP,
  20.     HOOK_TYPE_RET,
  21. } HOOK_TYPES;
  22.  
  23. void InstallHook(DWORD dwOrigFn, DWORD dwHookFn, DWORD dwHookType)
  24. {
  25.     if (dwHookType == HOOK_TYPE_JMP)
  26.     {
  27.         //use hde32 to calculate trampoline size
  28.         //as to not cut instructions in half
  29.         DWORD dwTrampSz = 0;
  30.         hde32s hde; memset((void*)&hde, 0, sizeof(hde32s));
  31.         while (dwTrampSz < 10)
  32.         {
  33.             hde32_disasm((void*)(dwOrigFn + dwTrampSz), &hde);
  34.             dwTrampSz += hde.len;
  35.         }
  36.        
  37.         //allocate trampoline function
  38.         //and make executable
  39.         DWORD dwTrampFn = XALLOC(dwTrampSz + 5);
  40.         XEXEC((void*)dwTrampFn, dwTrampSz + 5);
  41.        
  42.         //the hook code
  43.         BYTE dwHook[10];
  44.         memset(dwHook, 0, 10);
  45.         dwHook[0] = 0xE9;
  46.         *(DWORD*)&dwHook[1] = dwHookFn;
  47.         dwHook[5] = 0x68;
  48.         *(DWORD*)&dwHook[6] = dwTrampFn;
  49.        
  50.         //copy bytes from the original function
  51.         //to the trampoline function
  52.         memcpy((void*)dwOrigFn, (void*)dwTrampFn, dwTrampSz);
  53.        
  54.         //and the jump back to the original function
  55.         BYTE dwTrampReturn[5];
  56.         memset(dwTrampReturn, 0, 5);
  57.         dwTrampReturn[0] = 0xE9;
  58.         *(DWORD*)&dwTrampReturn[1] = dwHookFn + dwTrampSz;
  59.         memcpy((void*)&dwTrampReturn[0], (void*)(dwTrampFn + dwTrampSz), 5);
  60.        
  61.         //install the hook
  62.         memcpy((void*)&dwHook[0], (void*)dwOrigFn, 10);
  63.        
  64.         //pad with nops if trampoline size
  65.         //is larger than needed
  66.         while (dwTrampSz > 10)
  67.         {
  68.             *(BYTE*)(dwOrigFn + dwTrampSz) = 0x90;
  69.             dwTrampSz--;
  70.         }
  71.     }
  72.     else if (dwHookType == HOOK_TYPE_RET)
  73.     {
  74.         //use hde32 to calculate trampoline size
  75.         //as to not cut instructions in half
  76.         DWORD dwTrampSz = 0;
  77.         hde32s hde; memset((void*)&hde, 0, sizeof(hde32s));
  78.         while (dwTrampSz < 11)
  79.         {
  80.             hde32_disasm((void*)(dwOrigFn + dwTrampSz), &hde);
  81.             dwTrampSz += hde.len;
  82.         }
  83.        
  84.         //allocate trampoline function
  85.         //and make executable
  86.         DWORD dwTrampFn = XALLOC(dwTrampSz);
  87.         XEXEC((void*)dwTrampFn, dwTrampSz);
  88.        
  89.         //the hook code
  90.         BYTE dwHook[11];
  91.         memset(dwHook, 0, 11);
  92.         dwHook[0] = 0x68;
  93.         *(DWORD*)&dwHook[1] = dwTrampFn;
  94.         dwHook[5] = 0x68;
  95.         *(DWORD*)&dwHook[6] = dwHookFn;
  96.         *(BYTE*)&dwHook[10] = 0xC3;
  97.        
  98.         //copy bytes from the original function
  99.         //to the trampoline function
  100.         memcpy((void*)dwOrigFn, (void*)dwTrampFn, dwTrampSz);
  101.        
  102.         //and the jump back to the original function
  103.         BYTE dwTrampReturn[5];
  104.         memset(dwTrampReturn, 0, 5);
  105.         dwTrampReturn[0] = 0xE9;
  106.         *(DWORD*)&dwTrampReturn[1] = dwHookFn + dwTrampSz;
  107.         memcpy((void*)&dwTrampReturn[0], (void*)(dwTrampFn + dwTrampSz), 5);
  108.        
  109.         //install the hook
  110.         memcpy((void*)&dwHook[0], (void*)dwOrigFn, 11);
  111.        
  112.         //pad with nops if trampoline size
  113.         //is larger than needed
  114.         while (dwTrampSz > 11)
  115.         {
  116.             *(BYTE*)(dwOrigFn + dwTrampSz) = 0x90;
  117.             dwTrampSz--;
  118.         }
  119.     }
  120. }
  121.  
  122. void RemoveHook(DWORD dwOrigFn, DWORD dwHookType)
  123. {
  124.     if (dwHookType == HOOK_TYPE_JMP)
  125.     {
  126.         //get the address of the trampoline function
  127.         DWORD dwTrampFn = *(DWORD*)(dwOrigFn + 1);
  128.        
  129.         //use hde32 to calculate trampoline size
  130.         DWORD dwTrampSz = 0;
  131.         hde32s hde; memset((void*)&hde, 0, sizeof(hde32s));
  132.         while (dwTrampSz < 10)
  133.         {
  134.             hde32_disasm((void*)(dwTrampFn + dwTrampSz), &hde);
  135.             if (*(DWORD*)(dwTrampFn + dwTrampSz + 1) == dwOrigFn) break;
  136.             dwTrampSz += hde.len;
  137.         }
  138.        
  139.         //copy bytes from the trampoline function
  140.         //back to the original function (removes the hook)
  141.         memcpy((void*)dwTrampFn, (void*)dwOrigFn, dwTrampSz);
  142.        
  143.         //free trampoline function
  144.         XFREE(dwTrampSz);
  145.     }
  146.     else if (dwHookType == HOOK_TYPE_RET)
  147.     {
  148.         //get the address of the trampoline function
  149.         DWORD dwTrampFn = *(DWORD*)(dwOrigFn + 6);
  150.        
  151.         //use hde32 to calculate trampoline size
  152.         DWORD dwTrampSz = 0;
  153.         hde32s hde; memset((void*)&hde, 0, sizeof(hde32s));
  154.         while (dwTrampSz < 11)
  155.         {
  156.             hde32_disasm((void*)(dwTrampFn + dwTrampSz), &hde);
  157.             if (*(DWORD*)(dwTrampFn + dwTrampSz + 1) == dwOrigFn) break;
  158.             dwTrampSz += hde.len;
  159.         }
  160.        
  161.         //copy bytes from the trampoline function
  162.         //back to the original function (removes the hook)
  163.         memcpy((void*)dwTrampFn, (void*)dwOrigFn, dwTrampSz);
  164.        
  165.         //free trampoline function
  166.         XFREE(dwTrampSz);
  167.     }
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement