Запусти сервер и подключись к нему через CE.
В типе поиска выбери 4-байтное значение (int).
Введи текущее значение версии (4057) → First Scan.
Смени версию на другое число (например, через код) → Next Scan.
Найденный адрес будет адресом netgame_version. Вместо memcpy используй запись напрямую в память:
Код:
Код:
uintptr_t netgame_version_addr = 0xABCD1234; // Замени на реальный адрес
// Изменить версию на 4057 (0xFD9)
*(int*)netgame_version_addr = 4057;
// Или через memcpy (если над):
int new_version = 4057;
memcpy((void*)netgame_version_addr, &new_version, sizeof(int));
Посмотри дамп памяти для адреса: gdb -ex "x/xw 0xABCD1234" -ex "quit" ./samp03svr Вывод должен содержать 0xfd9 (4057 в hex). Сервер может перезаписывать netgame_version при старте. Найди код инициализации версии через дизассемблер (IDA Pro/Ghidra) и патчи там:
Код:
Код:
; Пример для 0x555555:
mov dword ptr [netgame_version_addr], 0xFD9
мб у тебя ошибки по типу использование строк вместо чисел: netgame_version — это int, а не строка. неправильный размер данных: Для 4-байтного int используй sizeof(int), а не длину строки отсутствие mprotect: Даже для чисел нужны права на запись:
Код:
Код:
uintptr_t page = netgame_version_addr & ~(4095); // Выравнивание
mprotect((void*)page, 4096, PROT_READ | PROT_WRITE);
*(int*)netgame_version_addr = 4057;
mprotect((void*)page, 4096, PROT_READ);
Если сервер использует проверки целостности:
найди вызовы функций типа CheckNetgameVersion в IDA. Хукни проверку:
Код:
Код:
int (*orig_check)(void);
int hook_check() {
return 1; // Всегда возвращаем "версия валидна"
}
используй библиотеки типа
MinHook для перехвата. Если netgame_version — это int, патчь его как число, а не как строку. Для строки версии (например, "0.3.7") используй отдельный адрес (как в предыдущих ответах).