Смотря с какой стороны на это смотреть. Некоторые читы меняют версию клиента, которую можно получить с помощью отправки:
SendClientMessage(playerid, -1, "$cmd get_version");
В ответ в OnPlayerCommandText в аргументе cmdtext будет получено что-то вроде:
$response get_version 0.424
Я не специалист по КРМП, но, если взглянуть с рациональной точки зрения, задача чита - после инжекта остаться незаметным для клиента (и, следовательно, для сервера). О инжекторах есть много статей в интернете. Однако, скорее всего, Вы столкнётесь с инжектором чита Project Armageddon, который использует инжект через функцию WinApi LoadLibrary(...). Самым эффективным способом защиты в данном случаем будет инжект Вашей библиотеки в игру, которая будет проверять названия библиотек, загружаемых функцией LoadLibraryW(...). Естественно, для этого Вам нужно иметь какой-то лаунчер, чтобы запускать весь этот процесс вместе с игрой.
P.S. Для общего развития: в WinApi существуют два варианта практически любых функций: FunctionA() и FunctionW(). FunctionA() работает с ANSI-C, FunctionW() - с wchar_t. В ANSI-C присутствует только английский язык, и кодировка использует по одному байту на символ. А wchar_t (wide char) использует несколько байт на символ, и поддерживает различные языки. Упомянутая же мной выше LoadLibrary(...) является дефайном, который в зависимости от определённой кодировки подставляет одну или другую функцию. На самом деле, вызов LoadLibraryA(...) сводится к вызову LoadLibraryW(...) с преобразованной к wchar_t строкой. Из всего сказанного вывод прост: вызов LoadLibrary() и LoadLibraryA() так или иначе приводят к вызову LoadLibraryW(). Соответственно, LoadLibraryW() является функцией, через которую проходят все загружаемые библиотеки.