Возможно ли HMODULE user32/kernel32(и других) получить по хешам ? То есть без использования LoadLibruary , GetProcAddress, GetModuleHandleW посредством разбора PEB ?
Что я не так делаю? Попробовал разные вариации хеширования. HashString1 работает на функциях, где уже загружена библиотека. Пробовал в нейронку загонять херню какую-то даёт. Всё равно null. Не могу получить его.
Что я не так делаю? Попробовал разные вариации хеширования. HashString1 работает на функциях, где уже загружена библиотека. Пробовал в нейронку загонять херню какую-то даёт. Всё равно null. Не могу получить его.
C++:
DWORD HashString1(const char* str) { // работает с функциями
DWORD hash = 0;
while (*str) {
char c = *str++;
if (c >= 'a' && c <= 'z')
c -= 32;
hash = _rotr(hash, 13);
hash += c;
}
return hash;
}
DWORD HashString(const char* str) {
DWORD hash = 5381;
int c;
while ((c = *str++)) {
hash = ((hash << 5) + hash) + c;
}
return hash;
}
HMODULE GetModuleHandleByHash(DWORD moduleNameHash) {
PPEB pPeb = (PPEB)__readfsdword(0x30);
PPEB_LDR_DATA pLdr = pPeb->Ldr;
PLIST_ENTRY pListEntry = pLdr->InMemoryOrderModuleList.Flink;
while (pListEntry != &pLdr->InMemoryOrderModuleList) {
PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
// Конвертируем Wide String в ASCII для хеширования
char moduleName[256];
WideCharToMultiByte(CP_ACP, 0, pEntry->FullDllName.Buffer, -1, moduleName, sizeof(moduleName), NULL, NULL);
if (HashString(moduleName) == moduleNameHash) {
return (HMODULE)pEntry->DllBase;
}
pListEntry = pListEntry->Flink;
}
return NULL;
}