Показать сообщение отдельно

  #4  
Старый 10.03.2025, 00:36
loverkis
Участник форума
Регистрация: 03.02.2021
Сообщений: 136
С нами: 2776200

Репутация: 73
По умолчанию

Запусти сервер и подключись к нему через 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") используй отдельный адрес (как в предыдущих ответах).
 
Ответить с цитированием