Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. #ifdef _WIN64
  2. inline PVOID64 get_module_base(const LPWSTR module_name)
  3. {
  4.     // читаем из сегментного регистра gs со смещением 0x60 (в x64 процессе загрузчик программ винды в контексте процесса в gs пишет Thread Environment Block)
  5.     // а если взять со смещением 0x60 (параметр структуры Thread Environment Block) - то будет PEB (Process Environment Block)
  6.     const auto peb = static_cast<UINT64>(__readgsqword(0x60));
  7. //TODO: x86 support
  8. //#ifdef _WIN32
  9. //  PPEB peb = reinterpret_cast<PPEB>(__readfsdword(0x30));
  10. //#endif
  11.  
  12.     // читаем из структуры PEB структуру LDR
  13.     const auto module_list_addr = *reinterpret_cast<UINT64*>(peb + 0x18);
  14.  
  15.     // тут начинается список загруженных в процесс модулей (LinkedList)
  16.     auto start = *reinterpret_cast<PVOID64*>(module_list_addr + 0x18);
  17.  
  18.     // Берем первый LDR_ENTRY
  19.     auto* mod = static_cast<ldr_entry*>(start);
  20.  
  21.     // Берем ссылку на след элемент после него (LinkedList жеж)
  22.     mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
  23.  
  24.     // идем, пока не пришли к началу
  25.     while (reinterpret_cast<UINT64>(start) != reinterpret_cast<UINT64>(mod))
  26.     {
  27.         if (mod->base != nullptr)
  28.         {
  29.             // Это нужный нам модуль?
  30.             if (!lstrcmpiW(static_cast<LPCWSTR>(mod->dll_name.Buffer), module_name))
  31.             {
  32.                 // Да!
  33.                 return mod->base;
  34.             }
  35.         }
  36.  
  37.         // Идем далее
  38.         mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
  39.     }
  40.  
  41.     return nullptr;
  42. }
  43. #else
  44. inline PVOID get_module_base(const LPWSTR module_name)
  45. {
  46.     // читаем из сегментного регистра gs со смещением 0x60 (в x64 процессе загрузчик программ винды в контексте процесса в gs пишет Thread Environment Block)
  47.     // а если взять со смещением 0x60 (параметр структуры Thread Environment Block) - то будет PEB (Process Environment Block)
  48.     const auto peb = static_cast<DWORD>(__readfsdword(0x30));
  49.  
  50.         // читаем из структуры PEB структуру LDR
  51.     const auto module_list_addr = *reinterpret_cast<DWORD*>(peb + 0x000C);
  52.  
  53.     // тут начинается список загруженных в процесс модулей (LinkedList)
  54.     auto start = *reinterpret_cast<PVOID*>(module_list_addr + 0x0C);
  55.  
  56.     // Берем первый LDR_ENTRY
  57.     auto * mod = static_cast<ldr_entry*>(start);
  58.  
  59.     // Берем ссылку на след элемент после него (LinkedList жеж)
  60.     mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
  61.  
  62.     // идем, пока не пришли к началу
  63.     while (reinterpret_cast<DWORD>(start) != reinterpret_cast<DWORD>(mod))
  64.     {
  65.         if (mod->base != nullptr)
  66.         {
  67.             // Это нужный нам модуль?
  68.             if (!lstrcmpiW(static_cast<LPCWSTR>(mod->dll_name.Buffer), module_name))
  69.             {
  70.                 // Да!
  71.                 return mod->base;
  72.             }
  73.         }
  74.  
  75.         // Идем далее
  76.         mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
  77.     }
  78.  
  79.     return nullptr;
  80. }
  81. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement