Простой шаблон подписи, сбой в упакованном процессе - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть очень простой сканер сигнатур (шаблонов), который ищет сигнатуру в диапазоне памяти.

Аргументы функции в значительной степени говорят сами за себя.

Функция предназначена для go в модуль, который будет загружен в процесс и ищет сигнатуры изнутри.

Как всегда - иногда не всегда , функция cra sh всего процесса.

Я перебирал это снова и снова и не мог найти проблему.

Процесс, который вызвал проблему, сильно упакован и получил много анти-отладочных трюков, так что это кошмар для отладки.

Может, мне не хватает чего-то простого

__int64 FindPattern(__int64 range_start, __int64 range_end, const char* pattern)
{
    const char* pat = pattern;
    __int64 firstMatch = NULL;
    __int64 pCur = range_start;
    __int64 region_end;
    MEMORY_BASIC_INFORMATION mbi{};
    while (sizeof(mbi) == VirtualQuery((LPCVOID)pCur, &mbi, sizeof(mbi))) {
        if (pCur >= range_end - strlen(pattern))
            break;
        if (!(mbi.Protect & (PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE))) {
            pCur += mbi.RegionSize;
            continue;
        }
        else
            region_end = pCur + mbi.RegionSize;
        while (pCur < region_end)
        {
            if (!*pat)
                return firstMatch;
            if (*(PBYTE)pat == '\?' || *(BYTE*)pCur == getByte(pat)) {
                if (!firstMatch)
                    firstMatch = pCur;
                if (!pat[1] || !pat[2])
                    return firstMatch;

                if (*(PWORD)pat == '\?\?' || *(PBYTE)pat != '\?')
                    pat += 3;
                else
                    pat += 2;
            }
            else {
                if (firstMatch)
                    pCur = firstMatch;
                pat = pattern;
                firstMatch = 0;
            }
            pCur++;
        }
    }
    return NULL;
}

Спасибо!

...