Сканирование чтения по шаблону 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);
Как только вы правильно определите базу, я думаю, что ваш код будет работать нормально