Всех Приветствую. Стоит задача найти адрес функции по паттерну в NTDLL.
На просторах интернета нашел этот код:
Но при запуске программы начинается вечный цикл...
Хотя в IDA Pro этот паттерн обозначает фрагмент в функции LdrpPrepareModuleForExecution.
Заранее спасибо за конструктивную помощь!
На просторах интернета нашел этот код:
C++:
#include <Windows.h>
#include <iostream>
bool DataCompare(byte* pData, byte* pattern, char* mask)
{
for (; *mask; mask++, pattern++, pData++)
{
if (*mask == 'x' && *pData != *pattern)
return false;
}
return true;
}
DWORD FindPattern(DWORD addr, DWORD length, byte* pattern, char* mask)
{
HMODULE handle = GetModuleHandleW(L"ntdll.dll");
MEMORY_BASIC_INFORMATION mbi = { 0 };
DWORD offset = 0;
while (offset < length)
{
VirtualQueryEx(handle, (LPCVOID)(addr + offset), &mbi,
sizeof(MEMORY_BASIC_INFORMATION));
if (mbi.State != MEM_FREE)
{
byte* buffer = new byte[mbi.RegionSize];
memcpy(mbi.BaseAddress, buffer, mbi.RegionSize);
for (unsigned int i = 0; i < mbi.RegionSize; i++)
{
if (DataCompare(buffer + i, pattern, mask))
{
delete[] buffer;
return (DWORD)mbi.BaseAddress + i;
}
}
delete[] buffer;
}
offset += mbi.RegionSize;
}
return 0;
}
unsigned char pattern[] = { 0xF6, 0x40, 0x10, 0x01 };
char* mask = (char*)"xxxx";
int main(int argc, char* argv[]) {
DWORD addr = FindPattern(
(DWORD)GetModuleHandleW(L"ntdll.dll"),
4,
pattern,
mask
);
printf("%p", (void*)addr);
return 0;
}
Но при запуске программы начинается вечный цикл...
Хотя в IDA Pro этот паттерн обозначает фрагмент в функции LdrpPrepareModuleForExecution.
Заранее спасибо за конструктивную помощь!