Всем привет. Решил ради интереса написать трейнер под один градострой новый. И столкнулся с проблемой которую не могу что-то решить.
В общем есть параметр, на который нет статичного указателя, который меняется при рестарте игры. => нужен AOB сканер.
Я через CE посмотрел и проанализировал кто обращается к искомому адресу, и была инструкция ( mov [rcx+10],eax ). Вот пытаюсь её найти patern сканированием.
И у меня возникает проблема с написанием AOB сканера - слишком долгое сканирование(мои наработки), а беру сорсы чужие, меняю начальный-конечный адреса, размеры буфферов, адреса вообще коллапс какой-то.
Анализировал в отладке.
Также бывает возникают проблемы доступа к определенным адресам.
Может были у кого опыт, наработки? принцип работы и тд понимаю, но в адекватном виде сделать не могу. Хотел бы на интерес попробовать.
Чужой пример с форума.
В общем есть параметр, на который нет статичного указателя, который меняется при рестарте игры. => нужен AOB сканер.
Я через CE посмотрел и проанализировал кто обращается к искомому адресу, и была инструкция ( mov [rcx+10],eax ). Вот пытаюсь её найти patern сканированием.
И у меня возникает проблема с написанием AOB сканера - слишком долгое сканирование(мои наработки), а беру сорсы чужие, меняю начальный-конечный адреса, размеры буфферов, адреса вообще коллапс какой-то.
Анализировал в отладке.
Также бывает возникают проблемы доступа к определенным адресам.
Может были у кого опыт, наработки? принцип работы и тд понимаю, но в адекватном виде сделать не могу. Хотел бы на интерес попробовать.
Чужой пример с форума.
Код:
DWORD SignatureScanner(BYTE* mod_buffer, DWORD mod_size, DWORD mod_base, BYTE* pattern, int pattern_size, DWORD offset_from_offset)
{
int counter = 0; // Счетчик совпадений сигнатуры
// Проходим по всему буферу модуля памяти
for (int i = 0; i < mod_size; i++)
{
// Проверяем, совпадает ли текущий байт с первым байтом сигнатуры
if (mod_buffer[i] == pattern[0] || pattern[0] == 0x00)
{
// Если совпадение найдено, начинаем проверять последующие байты сигнатуры
for (int p = 0; p < pattern_size; p++)
{
// Проверяем, совпадает ли текущий байт в буфере с текущим байтом сигнатуры
if (mod_buffer[i + p] == pattern[p] || pattern[p] == 0x00)
{
counter++; // Увеличиваем счетчик совпадений
// Если все байты сигнатуры найдены:
if (counter == pattern_size)
{
DWORD start_address_sig = i + mod_base; // Вычисляем адрес сигнатуры | Базовый адрес + количество шагов в памяти
DWORD address_of_offset_hp = start_address_sig + offset_from_offset; // Вычисляем адрес с учетом смещения | Добавляя к началу адреса сигнатуры 4 байта, получаем конечный искомый адрес
return address_of_offset_hp; // Возвращаем адрес
}
}
else {
counter = 0; // Если текущие байты не совпадают, сбрасываем счетчик
}
}
}
}
// Если сигнатура не найдена, возвращаем нулевое значение
std::cout << "Signature not found!" << std::endl;
return 0;
}