Сканирование чтения по шаблону C++ Доступ к нарушению чтения памяти

Функция FindPattern выглядит следующим образом

DWORD FindPattern(DWORD base ,char *module, char *pattern, char *mask)
{
    MODULEINFO mInfo = GetModuleInfo(module);
    DWORD size = (DWORD)mInfo.SizeOfImage;
    DWORD patternLength = (DWORD)strlen(mask);

    for (DWORD i = 0; i < size - patternLength; i++)
    {
        bool found = true;
        for (DWORD j = 0; j < patternLength; j++)
        {
            found &= mask[j] == '?' || pattern[j] == *(char*)(base + i + j);
        }
        if (found)
        {
            return base + i;
        }
    }

    return NULL;
}

и я использую использовать функцию, как это

DWORD aAddy = FindPattern(BaseAddress,(char*)("ros.exe"),
                const_cast<LPSTR>("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\0x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFA\x44\x00\x00\x00\x3F\x00\x00\x00\x00"),
                const_cast<LPSTR>("???????????????x??????????????????????????????????????????????????????????????????????xx???x????"));

во время отладки я получил ошибку при j = 15 и маске [j] = 'x' было сгенерировано исключение показать нарушение доступа к месту чтения "base"

Может ли кто-нибудь помочь мне, что не так с J = 15 или я просто неправильно передать параметры?

Я не могу передать режим char*, как ("ros.exe"), его ошибка мне не удается преобразовать аргумент char* в char*.

1 ответ

Ну и дела этот код выглядит знакомым:P

Вы получаете Access Violation для "base", потому что у вас нет разрешения на чтение "BaseAddress", которое вы передаете в качестве аргумента "base". Мы не знаем, что такое "BaseAddress", потому что вы не включаете способ присвоения значения этой переменной в код, который вы опубликовали. Возможно, он неинициализирован или вам нужно использовать VirtualProtect() для получения разрешений на чтение. Я предполагаю, что вы не инициализируете его или передаете не по адресу.

Он читает из "base" в первый раз, когда j=15, потому что это первый элемент массива char, который не является подстановочным знаком, что означает, что ваш код не читает из "base + i + j", пока не подстановочный знак не будет обнаружил, что именно поэтому это не происходит, пока j=15.

Исходный исходный код содержит эту строку, чтобы получить базовый адрес модуля, но вы изменили / удалили его.

 DWORD base = (DWORD)mInfo.lpBaseOfDll;

В качестве альтернативы вы можете использовать это, чтобы получить базовый адрес исполняемого файла

 DWORD base = (DWORD)GetModuleHandle(NULL);

Как только вы правильно определите базу, я думаю, что ваш код будет работать нормально

Другие вопросы по тегам