Я вот тут взялся сделать защиту от читов к популярной стрелялке Counter-Strike 1.6. Ибо сервак держу, а читеры заколустали Так вот хочу выяснить у опытных людей, как лучше подойти к решению проблемы. Для начала опишу её: Большинство читов представляют собой Ring3 DLL-Injector с каким-нить мудрёным получением хендла процесса. Иногда процесс ищётся просто Toolhelp функциями (совпадение по имение "hl.exe"). Ну и собственно DLL-это чит. Хотя видел я недавно жёсткий чит от китайцев который представляет собой просто exe-шник, причём очень маленький. Так вот нужно не дать людям использовать эти программы вместе с игрой. Как лучше организовать? Я сделал вариант античита, но получилось коряво Могу выложить если надо.
Бесполизняк, можно сэмулировать работу анти чита, а к примеру координаты противников всеравно клиенту идут.
Может попробывать контроль компонентов, что использует Аутпост - при модификации более 16 байт он заблокирует доступ программы к сети, равно как и при подгрузке "незнакомой" DLL. Насколько мне известно он использует для этого свой сервис.
SPA, я согласен что можно сэмулировать. Ко всем античитам для Counter-Strike уже давно сделали эмуляторы. Но после каждого их апдейта эмуляторы делаются заного. Мой игровой сервер доступен пока что только локально. Да и если не распространять античит, то его оочень мало кто похакает. Например тот кривой, что я щас сделал никто даже не тронул. =) alpet, Интересно... И мне всех игроков просить установить коммерческую программу Аутпост? P. S. Опишу как работает тот, что щас есть: запускается драйвер который блокирует вызовы VirtualProtect и CreateRemoteThread (или чего-то такое... точно не помню) на заданный процесс. Плюс в процессе самой игры из функции VirtualProtect (Ex) стырены начальные байты и поставлен переход на мою функцию, которая соответственно блокирует эти вызовы если там используются права на запись. Это помогает от всех читов, которые щас есть. Но только вот слабовато это и криво реализовано Поэтому и прошу спецов подсказать интересную систему.
Drakon Нет конечно, но создать подобный механизм наверное можно (перехват подгрузки DLL, и модификации памяти by WriteProcessMemory). Кстати еще вот что - игроки со своих компов играют, или же это дело в клубе происходит? В последнем случае можно еще попытаться на уровне прав разграничение сделать - CS запускать от админа, а игрокам давать работать как обычным пользователям - OpenProcess и прочие функции при этом работать у них не будут.
alpet, я и спрашиваю как лучше реализовать и чего использовать. =) Своим умом ничего хорошего не придумал Насчёт второго вопроса: всё происходит в большой локальной сети с пиринговыми сетками и в будущем возможно с инетом.
делал нечто подобное. пока работает на ultima online (realworld.mcn.ru) и WorldOfWarcraft (warcraftworld.ru) сервера - pol и wowemu. теоретически будет работать с любой прогой которая юзает TCP (под UDP придется децл доделать но тоже можно) при отладке успешно работал apache (я на нем серверную DLL тестировал) . посмотреть подробнее можно на shardsecurity.com
kropalik, так поделись опытом! Посмотрел подробнее... Где скачать не нашёл. Да и исходников нету =) Без возможности доработки это не интересно.
>> Посмотрел подробнее... Где скачать не нашёл хочешь посмотреть как работает - http://shardsecurity.com/files/rw_launcher.dll и еще клиент 2.exe http://realworld.mcn.ru/test/2.rar (работать небудет без остальных файлов ~600M ссылка на сайте realworld). еще можешь поюзать http://warcraftworld.ru/wow180.rar - клиент worldofwarcraft только патченый exe сам клиент 4Gb >> Да и исходников нету =) ага чтоб побыстрее эмуль написали... все равно наверно расковыряют, но хоть новой версией пофиксить можно будет. >> Без возможности доработки это не интересно. доработка активно происходит. только проблема в тестировании - геймеры иногда нормально crashdump прислать не могут... (отправить лог на e-mail) только в форумах флуд разводят что ланчер глючит... в общем если интересно - могу рассказать как прикрутить к CounterStrike (придется написать dll для сервера тк та которая есть работает с tcp). клиентскую часть я исправлю если понадобится (вообще там плагины предусмотрены). сервер авторизации изменений скорее всего не потребует. web-интерфейс тоже (только он недоделан тк некому).
kropalik, я в этом силён. Если надо - могу сделать. За исходники. =) Интересует? А насчёт твоего античита - есть аналог, ssClient. Почти тоже, что и твой делает и для КСа. =) Короче мне проще свой доделать. А тут столько знающего народа и никто ничего не предлагает Завтра опишу тогда подробно и возможные варианты.
>> Интересует? да вообщето интерисует. я подумаю (вернее надо спросить остальных участников проекта) >> А тут столько знающего народа и никто ничего >> не предлагает а тут предлагать особо нечего. ибо ТЗ на античит невыполнимо. из достаточно простых соображений - юзерь может запустить наш код с такими правами с какими захочет. а требовать админа (чтоб например ring0 поюзать) без мазы тк одно из требований что должно работать везде например в интернет-кафе. вообще я считаю что возможность читерства - это ошибка в игровом сервере и исправлять надо его а не писать бесполезный и глючный софт.
Эх.. Я тут вошёл в праздничное состояние и долго пил и отдыхал. ПОэтому произошёл такой перерыв. Так вот нужно решать двепроблемы: 1. Я чего-то незнаю или ring0 действительно никак не получить без прав админа? 2. Нужно сделать какой-то универсальный метод чтобы люди не могли коннектиться к серверу игры, если у них не запущен античит. 3. Нужно придумать какой-нибудь более-менее эффективный метод защиты. У меня есть такое предложение по работе античита: 1) Игрок запускает античит 2) Античит делает список текущий процессов. 2.1) Игрок вводит ИП сервера где стоит сервер игры и нажимает кнопку "коннект". Производится первичная верификация и клиент получает ключ. 3) Античит ждёт запуска нужного процесса. Кстати как узнать что процесс действительно нужный? 4) Когда нужный процесс найден, античит сверяет со списком процессов в п. 2. Если его там нету, то к процессу применяется античит. 5) Производится сверка секций помеченных как выполняемые с оригиналом на диске. Это эффективно? Есть где-нить исходники которые это делают? 6) Производится перехват CreateRemoteThread на уровне ядра. При коннекте к выбранному серверу (уже игровому а не античиту) сначала посалыется ключ полученный в п. 2.1, и только потом идёт игровой трафик.
1. чтобы корректно работало на разных версиях и сервиспаках - нет (по крайней мере документированным способом). в общем я решил отказаться тк куча геймеров обитает в интернет-кафе где админа не дадут так просто. 2. у меня это сделано так: к игровому серверу подгружается моя DLL которая перехватывает WSAAccept. клиент когда коннектится должен передать ключ, который получает от сервера авторизации. если ключ неправильный - closesocket. кроме того любого клиента дисконнектит по запросу от сервера авторизации (если чит запущен после захода в игру) 3. мне кажется правильней чтобы античит находился в адресном пространстве самой игры. преимущества: не надо запускать несколько процессов и пытаться их синхронизировать (выяснять какой из них нужный) и проще перехватывать API типа connect() и send(). 5) не стоит. я пробовал - в результате куча вполне нормальных геймеров оказываются читерами. (у них обычно куча всякого spyware троянов и вирусов, а также некоторые firewall-ы тоже модифицируют код или IAT). В ShardSecurity сделана база (сейчас в ней 1500 шт) со всякими DLL и их CRC. примерно 1-2 в день новых появляется (с неизвестной dll тоже не пускает в игру) кроме того предусмотрена привязка игрового аккаунта к форумному. то есть чтобы зайти в игру надо сначала зарегистрироваться на форуме. а в случае читерства можно просто забанить по имени юзера.
kropalik Помню тебя когда ты к нам на ФХД о ней рассказывал.... много времени прошло ... надо будет глянуть на неё более подробно...