Найди точный адрес версии
Качай
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 это редко, но бывает в кастомных сборках.