Ботов можно грубо поделить на две категории.
Первая категория использует стандартный игровой клиент и просто эмулирует события мыши и клавиатуры, а состояние игры (или хотя бы ту часть, которая интересует бота) определяет по цвету/конфигурации пикселей в заданных зонах экрана. Соответственно, реакция на непредвиденные игровые события обычно примитивная, но написать тупенького бота для выполнения повторяющихся действий можно.
Подобные боты чисто техническими средствами не ловятся, так как изнутри игрового клиента определить, толи нажатие на кнопку пришло от клавиатуры, толи от третьей программы, не возможно. На серверной стороне формально можно анализировать регулярность выполнения команд, но постоянно делать это для всех и каждого в нормальной ммо значит создавать дополнительную нагрузку на сервер, так что обычно кто-то сначала должен настучать, что "вон то тело похоже на бота", а уж потом либо к этому телу подключают анализатор, либо смотрят логи. Да и то хозяин тела всегда может сказать, что он супер-пупер-профи-гуру и рекордсмен Гиннеса и может прощелкать по каждому пикселю на 1600х1200 экране по порядку за минуту.
Вторая категория ботов является специализированым игровым клиентом с зачатками АИ. Либо хакается стандартный клиент, либо тупо проводится реверсинжиниринг протокола и бот пишется с нуля. В любом из этих случаев боту уже не надо распознавать мусор на экране и эмулировать мышь/клавиатуру. В распоряжении бота есть все внутренние данные о состоянии игры и бот может отправлять на сервер предельно четкие команды.
Боты из этой категории определяются техническими средствами на 100%, было бы желание. Самый правильный способ такой: в игровом протоколе, кроме передачи данных и команд, присутствует специальный пакет. Когда сервер по любым причинам хочет проверить какие-либо клиент (настучали на конкретное тело, или сработал какой-нибудь серверный анализатор повторяемости-ритмичности действий, или просто на сервере политика раз в неделю всех проверять), сервер отсылает клиент небольшую подпрограмму. Клиент должен эту подпрограмму запустить и затем отправить результат серверу.
Самое интересное заключается в том, как сервер генерит эту подпрограмму, и это очень важно! В правильных ммо в этом месте используются алгоритмы, сходные с теми, что используют вирусописатели для создания морфящихся и самомодифицирующихся вирусов, то есть код подпрограммы морфится без изменения семантики программы. Что это дает? Каждому клиенту может высылаться уникальная копия (с точки зрения байтов) подпрограммы, что фактически делает невозможным написание ботов, которые по шаблону определяют результат выполнения этой подпрограммы на чистом клиенте. На чистом клиенте эта подпрограмма может считать что угодно, в простейшем случае контрольную сумму какой-либо части клиента в памяти, но что именно она считает, точно знает только сервер в момент генерации конкретной версии. Клиенты с ботами первой категории вернут правильный ответ, а хакнутые клиенты или чистые боты вынуждены будут что-то там угадывать, и даже если случайно угадают один раз, вероятность успешно пройти подобную проверку несколько раз стремится к нулю.
Особо надо заметить, что в правильных ммо за ботов банят не сразу, а только после того, как этот аккаунт проплатит следующий игровой период =).