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

  #3  
Старый 09.03.2025, 17:00
memoryUser
Новичок
Регистрация: 05.03.2025
Сообщений: 2
С нами: 629738

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

Цитата:
Сообщение от loverkis  

Найди точный адрес версии
Качай Cheat Engine или GDB
Ищи строку "0.3.7" в памяти сервака.
Если адрес неправильный — всё сломаешь. Для 0.3.7-R1 адрес обычно 0x4B17C8, но гугли свою сборку.
Оригинал: 0.3.7\0 (5 символов с нулем в конце).
Твой патч: 4057\0 (тоже 5 символов!). Если пишешь только 4 байта — сервер будет читать мусор и крашиться. Пиши так:







Код:





Код:
memcpy((char*)addr, "4057\0", 5);


Перед записью в память:

Код:





Код:
uintptr_t page_start = addr - (addr % 4096);
mprotect((void*)page_start, 4096, PROT_READ | PROT_WRITE);


После записи верни права обратно:







Код:





Код:
mprotect((void*)page_start, 4096, PROT_READ);


Смотри дамп памяти в GDB:







Код:





Код:
gdb -ex "x/8bx 0xадрес" -ex "quit" ./samp03svr


Запусти сервер через GDB и лови креш:

Код:





Код:
gdb --args ./samp03svr
(gdb) run
# при краше:
(gdb) bt full


Посмотри, где именно упало (типа crashdetect) конфликтует. Пример через хуки:

Код:





Код:
int (*original_check)(const char*);
int my_check(const char* ver) {
    return 0;
}


Где чаще всего косячат:

Не добавили \0 в конце строки
Использовали strcpy вместо memcpy (если оригинал длиннее)
Неправильный адрес версии (проверь через gdb!)
Забыли сделать mprotect перед записью
Если всё это не помогло — ищи, нет ли проверок на CRC или сигнатуры кода. Для 0.3.7 это редко, но бывает в кастомных сборках.
в clientjoin сервера, есть netgame_version который в 0.3.7 имеет число 4057, в хексе FD9. если не ошибаюсь, memcpy для строки, у меня целочисленное значение
 
Ответить с цитированием