Обход защиты

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mika0x65, 4 авг 2007.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Имеется античитер для онлайновой игрушки. Необходимо его отключить. Думал, посижу немного и готово -- ан нет. Античитер существует в виде dll, загружаемой с помощью LoadLibrary и имеющей всего три экспортируемые точки входа. Судя по всему зашифрован. Имеет привычки проверять целостность самого себя, по слухам не любит подмены API (хотя ничего подобного я, вроде, пока не обнаружил), занимается сканированием адресного пространства игры на поиск читов и активно обменивается с сервером информацией. Все это желательно отключить. Но есть одно маленькое "но". dll время от времени обновляется, а реверсить каждую версию не хочется. Поэтому я думаю о внешнем по отношению к dll вмешательству.

    Пришла мысль о "виртуализации" памяти, в которой живут читы. Т.е. открыть процесс после его создания, поставить признак GUARD_PAGE страницам с читами и отслеживать, когда процесс стукается об эти страницы. Затем смотреть, откуда пришел звонок -- если обращение произошло по eip, значит все Ок, а если нет -- значит надо притворяться шлангом. Проблемой в таком случае станет снижение скорости.

    Второй вариант -- выяснить, каким образом вражеская программа получает карту памяти процесса и подсунуть ей неверную карту, а читы грузить с помощью своего лоадера и где-нибудь прятать. Но программа может возмутиться подмене API. Правда, если сделать это в ring0, то, думаю, она ничего не заметит. По крайней мере привычку лазить в ring0 я за ней не заметил, хотя игра требует привилегий администратора, но чисто для использования OpenProcess и т.д. (Она для чего-то открывает саму себя).

    Я с такой задачей сталкиваюсь первый раз, может кто-то знает вариант получше? Ring0 возможен.

    Заранее благодарен.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    изучить протокол и сэмулировать его не подойдет?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    n0name
    Такой вариант я рассмотрел самым первым :). Дело в том, что защита регулярно обновляется, поэтому я хочу найти "максимально внешний" по отношению к ней способ.
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Mika0x65
    давать античиту левую память не пойдёт? Перехватить в нём функции чтения памяти, и подсовывать, что либо левое.
     
  5. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    в ринг0 лезет. стопудово.
     
  6. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Mika0x65
    А делать FreeLibrary в цикле пока не выгрузиться? Так можно обойти AntiDialer кривого Kaspersky Internet Security.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Mental_Mirror
    Не совсем понял, что это даст.

    В общем, я попробовал первый вариант, но не вышло: как я понял, нельзя устанавливать признак GUARD_PAGE страницам, которые были закоммичены, например как PAGE_EXECUTE_READWRITE. Как им еще образом отследить обращение к странице из ring0 не знаю.

    UPD: пардон, это у меня ошибка в коде была, видимо.
     
  8. Greef

    Greef New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2007
    Сообщения:
    1
    Всем добра.
    Просто хочу поделиться первыми успехами :)
    Скачал прогу нное время назад...T_Freeze версия 1.0, а асм начал изучать неделю назад...
    короче..вчера я эту прогу за 5 сек. ломанул :)) от радости чуть не лопнул...асм рулит!!
     
  9. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Greef
    что там было тогда, если ты всего уча неделю её уже ломанул? о.О
     
  10. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    В Readme серийниик :)
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Возвращаясь к теме, задам еще вопрос.

    Сам подход -- подмена страницы, в случае когда ее начинают сканировать я обдумал и он, вроде, по всем параметрам подходит. Вопрос в том, какой режим доступа к странице лучше использовать -- PAGE_GUARD или PAGE_NOACCESS?

    Сам алгоритм выглядит так: моя dll поддерживает массив описателей защищаемых участков памяти и регистрирует свой SEH обработчик. Как только происходит исключение, мой обработчик бежит по массиву, проверяя, входит ли адрес, обращение к которому вызвало исключение, в список защищаемых участков. Если нет, то обработчик возвращает EXCEPTION_CONTINUE_SEARCH и завершает работу. Иначе, в зависимости от того, произошло ли обращение по eip или нет принимает решение.

    PAGE_GUARD имеет преимущество: не требуется доп. вызов API для снятия защиты страницы. С другой стороны, PAGE_GUARD используется для контроля роста стека и можно нарваться, при условии, что защищаемая мной страница окажется на самой вершине стека. Правда, я не думаю, что в стеке игры будет что защищать -- скорее в области данных. PAGE_NOACCESS в свою очередь, намного надежней PAGE_GUARD, и проблемы со стеком не будет. Но за то если в защищаемой области произойдет AV, то будет вызван мой обработчик, что весьма некстати.

    Что все же лучше?