Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef _WIN64
- inline PVOID64 get_module_base(const LPWSTR module_name)
- {
- // читаем из сегментного регистра gs со смещением 0x60 (в x64 процессе загрузчик программ винды в контексте процесса в gs пишет Thread Environment Block)
- // а если взять со смещением 0x60 (параметр структуры Thread Environment Block) - то будет PEB (Process Environment Block)
- const auto peb = static_cast<UINT64>(__readgsqword(0x60));
- //TODO: x86 support
- //#ifdef _WIN32
- // PPEB peb = reinterpret_cast<PPEB>(__readfsdword(0x30));
- //#endif
- // читаем из структуры PEB структуру LDR
- const auto module_list_addr = *reinterpret_cast<UINT64*>(peb + 0x18);
- // тут начинается список загруженных в процесс модулей (LinkedList)
- auto start = *reinterpret_cast<PVOID64*>(module_list_addr + 0x18);
- // Берем первый LDR_ENTRY
- auto* mod = static_cast<ldr_entry*>(start);
- // Берем ссылку на след элемент после него (LinkedList жеж)
- mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
- // идем, пока не пришли к началу
- while (reinterpret_cast<UINT64>(start) != reinterpret_cast<UINT64>(mod))
- {
- if (mod->base != nullptr)
- {
- // Это нужный нам модуль?
- if (!lstrcmpiW(static_cast<LPCWSTR>(mod->dll_name.Buffer), module_name))
- {
- // Да!
- return mod->base;
- }
- }
- // Идем далее
- mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
- }
- return nullptr;
- }
- #else
- inline PVOID get_module_base(const LPWSTR module_name)
- {
- // читаем из сегментного регистра gs со смещением 0x60 (в x64 процессе загрузчик программ винды в контексте процесса в gs пишет Thread Environment Block)
- // а если взять со смещением 0x60 (параметр структуры Thread Environment Block) - то будет PEB (Process Environment Block)
- const auto peb = static_cast<DWORD>(__readfsdword(0x30));
- // читаем из структуры PEB структуру LDR
- const auto module_list_addr = *reinterpret_cast<DWORD*>(peb + 0x000C);
- // тут начинается список загруженных в процесс модулей (LinkedList)
- auto start = *reinterpret_cast<PVOID*>(module_list_addr + 0x0C);
- // Берем первый LDR_ENTRY
- auto * mod = static_cast<ldr_entry*>(start);
- // Берем ссылку на след элемент после него (LinkedList жеж)
- mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
- // идем, пока не пришли к началу
- while (reinterpret_cast<DWORD>(start) != reinterpret_cast<DWORD>(mod))
- {
- if (mod->base != nullptr)
- {
- // Это нужный нам модуль?
- if (!lstrcmpiW(static_cast<LPCWSTR>(mod->dll_name.Buffer), module_name))
- {
- // Да!
- return mod->base;
- }
- }
- // Идем далее
- mod = reinterpret_cast<ldr_entry*>(mod->orders[0].Flink);
- }
- return nullptr;
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement