Мое почтение всем. Имеется античитер для онлайновой игрушки. Необходимо его отключить. Думал, посижу немного и готово -- ан нет. Античитер существует в виде dll, загружаемой с помощью LoadLibrary и имеющей всего три экспортируемые точки входа. Судя по всему зашифрован. Имеет привычки проверять целостность самого себя, по слухам не любит подмены API (хотя ничего подобного я, вроде, пока не обнаружил), занимается сканированием адресного пространства игры на поиск читов и активно обменивается с сервером информацией. Все это желательно отключить. Но есть одно маленькое "но". dll время от времени обновляется, а реверсить каждую версию не хочется. Поэтому я думаю о внешнем по отношению к dll вмешательству. Пришла мысль о "виртуализации" памяти, в которой живут читы. Т.е. открыть процесс после его создания, поставить признак GUARD_PAGE страницам с читами и отслеживать, когда процесс стукается об эти страницы. Затем смотреть, откуда пришел звонок -- если обращение произошло по eip, значит все Ок, а если нет -- значит надо притворяться шлангом. Проблемой в таком случае станет снижение скорости. Второй вариант -- выяснить, каким образом вражеская программа получает карту памяти процесса и подсунуть ей неверную карту, а читы грузить с помощью своего лоадера и где-нибудь прятать. Но программа может возмутиться подмене API. Правда, если сделать это в ring0, то, думаю, она ничего не заметит. По крайней мере привычку лазить в ring0 я за ней не заметил, хотя игра требует привилегий администратора, но чисто для использования OpenProcess и т.д. (Она для чего-то открывает саму себя). Я с такой задачей сталкиваюсь первый раз, может кто-то знает вариант получше? Ring0 возможен. Заранее благодарен.
n0name Такой вариант я рассмотрел самым первым . Дело в том, что защита регулярно обновляется, поэтому я хочу найти "максимально внешний" по отношению к ней способ.
Mika0x65 давать античиту левую память не пойдёт? Перехватить в нём функции чтения памяти, и подсовывать, что либо левое.
Mika0x65 А делать FreeLibrary в цикле пока не выгрузиться? Так можно обойти AntiDialer кривого Kaspersky Internet Security.
Mental_Mirror Не совсем понял, что это даст. В общем, я попробовал первый вариант, но не вышло: как я понял, нельзя устанавливать признак GUARD_PAGE страницам, которые были закоммичены, например как PAGE_EXECUTE_READWRITE. Как им еще образом отследить обращение к странице из ring0 не знаю. UPD: пардон, это у меня ошибка в коде была, видимо.
Всем добра. Просто хочу поделиться первыми успехами Скачал прогу нное время назад...T_Freeze версия 1.0, а асм начал изучать неделю назад... короче..вчера я эту прогу за 5 сек. ломанул ) от радости чуть не лопнул...асм рулит!!
Возвращаясь к теме, задам еще вопрос. Сам подход -- подмена страницы, в случае когда ее начинают сканировать я обдумал и он, вроде, по всем параметрам подходит. Вопрос в том, какой режим доступа к странице лучше использовать -- PAGE_GUARD или PAGE_NOACCESS? Сам алгоритм выглядит так: моя dll поддерживает массив описателей защищаемых участков памяти и регистрирует свой SEH обработчик. Как только происходит исключение, мой обработчик бежит по массиву, проверяя, входит ли адрес, обращение к которому вызвало исключение, в список защищаемых участков. Если нет, то обработчик возвращает EXCEPTION_CONTINUE_SEARCH и завершает работу. Иначе, в зависимости от того, произошло ли обращение по eip или нет принимает решение. PAGE_GUARD имеет преимущество: не требуется доп. вызов API для снятия защиты страницы. С другой стороны, PAGE_GUARD используется для контроля роста стека и можно нарваться, при условии, что защищаемая мной страница окажется на самой вершине стека. Правда, я не думаю, что в стеке игры будет что защищать -- скорее в области данных. PAGE_NOACCESS в свою очередь, намного надежней PAGE_GUARD, и проблемы со стеком не будет. Но за то если в защищаемой области произойдет AV, то будет вызван мой обработчик, что весьма некстати. Что все же лучше?