Как получить адрес kernel32.dll не используя функции WinAPI?
Распространенный способ - это
auto hKernel32 = *(HMODULE*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(*(DWORD*)(__readfsdword(0x30) + 0x0C) + 0x14))) + 0x10);
Здесь берется второй элемент списка InLoadOrderModuleList
. Считается, что kernel32 всегда грузится второй (первой грузится ntdll).
Однако это не выглядит надежным, как написать лучше?
Как-то так, например
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;
}
}
Вместо того, чтобы полагаться на индекс, следует сделать полноценный поиск по InLoadOrderModuleList. Поле FullDllName в LDR_DATA_TABLE_ENTRY содержит имя модуля. Вместо всяких strcmp достаточно сравнить 1-2 DWORD'а.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В общем ребят, есть задача с двумерными массивамиУсловие : расставить на шахматном поле 2 белых и 2 черных слона произвольным образом и определить,...
Как с помощью конструктора копирования из string присвоить значению, на которое ссылается temp, значение m?