Как получить адрес kernel32.dll

184
28 ноября 2017, 22:43

Как получить адрес kernel32.dll не используя функции WinAPI?

Распространенный способ - это

auto hKernel32 = *(HMODULE*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(__readfsdword(0x30) + 0x0C) + 0x14))) + 0x10);

Здесь берется второй элемент списка InLoadOrderModuleList. Считается, что kernel32 всегда грузится второй (первой грузится ntdll).
Однако это не выглядит надежным, как написать лучше?

Answer 1

Как-то так, например

HMODULE FindKernel32Base() {
  auto teb = (PTEB)__readfsdword(0x18);
  auto link = teb->ProcessEnvironmentBlock->Ldr->InMemoryOrderModuleList.Flink;
  for (;;) {
    auto entry = PLDR_DATA_TABLE_ENTRY((char*)link - offsetof(LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks));
    auto expected = "kernel32.dll";
    auto name = entry->FullDllName.Buffer + entry->FullDllName.Length / 2 - strlen(expected);
    while ((*name++ | 32) == *expected++ && *expected);  // strcasecmp
    if (*expected == '\0') {
      return (HMODULE)entry->DllBase;
    }
    link = entry->InMemoryOrderLinks.Flink;
  }
}
Answer 2

Вместо того, чтобы полагаться на индекс, следует сделать полноценный поиск по InLoadOrderModuleList. Поле FullDllName в LDR_DATA_TABLE_ENTRY содержит имя модуля. Вместо всяких strcmp достаточно сравнить 1-2 DWORD'а.

READ ALSO
has triggered a breakpoint

has triggered a breakpoint

При выполнении выдаёт ошибку

208
Задача с двумерными массивами С++

Задача с двумерными массивами С++

В общем ребят, есть задача с двумерными массивамиУсловие : расставить на шахматном поле 2 белых и 2 черных слона произвольным образом и определить,...

210
Присвоение значения переменной в c++ переданной по указателю

Присвоение значения переменной в c++ переданной по указателю

Как с помощью конструктора копирования из string присвоить значению, на которое ссылается temp, значение m?

157