Kernel Anticheat (EAC, Vanguard, BattleEye). Мануал для разработчиков: как работает, способы обхода, разработка драйверов режима ядра

Большинство популярных игр используют античиты режима ядра. Такой способ защиты наиболее эффективен в предотвращении использования читов пользователем. Этот мануал предоставит максимум информации, необходимой для обхода подобных античитов.

Информация, представленная в этом руководстве, объясняет:

  • Что такое режим ядра, пользовательский режим.
  • Как научиться разработке драйверов режима ядра (KMDF).
  • Серия англоязычных видеоуроков, посвященная читам режима ядра.
  • Как использовать драйверы с уязвимостями.
  • Распространенные драйверы с уязвимостями и инструменты.
  • Обзор общих функций античитов в режиме ядра.
  • Обнаружение читов режима ядра.

Что такое режим ядра и в чем его отличие от пользовательского режима.

Процессор на компьютере с Windows имеет два разных режима: режим ядра (kernel mode) и пользовательский режим (user mode). Процессор переключается между двумя режимами в зависимости от того, какой тип кода выполняется. Обычные программы .exe запускаются в пользовательском режиме, а основные компоненты операционной системы - в режиме ядра. Конструкция этих режимов встроена в ЦП. Низкоуровневые основные функции операционной системы выполняются в режиме ядра, который является привилегированной частью памяти, которая недоступна из пользовательского режима и выполняется с привилегированным статусом на ЦП. Вы можете создать драйвер .sys для выполнения любых действий в режиме ядра, включая обход античита.

Весь код, работающий в режиме ядра, использует единое виртуальное адресное пространство. Это означает, что драйвер на уровне ядра не изолирован от других драйверов и самой операционной системы. При сбое драйвера режима ядра, сбой происходит во всей операционной системе. В пользовательском режиме каждое приложение изолировано, находится в собственном адресном пространстве, которое не взаимодействует с памятью других процессов в обычном режиме. Если обычная программа дает сбой, он ограничивается этим одним приложением.

Многие из простых вещей, которые вам нужно делать при взломе игр, зависят от ядра, выполняющего эти задачи за вас. Например, когда вы вызываете WriteProcessMemory (), эта функция экспортируется из NTDLL.DLL, этот запрос на запись в память другого процесса передается ядру через NTDLL. Ваше приложение на самом деле этого не делает, это ядро, ваша программа просто делает запрос. Просмотрите изображение ниже, чтобы понять, как разделены режим ядра и режим пользователя.

Процессы пользовательского режима не имеют доступа к процессам и памяти режима ядра. Так устроены ЦП и операционная система.

Как это применимо к обходу античита?

Если вы имеете дело с игрой, которая использует античит пользовательского режима, вы можете написать драйвер режима ядра, чтобы обойти его. Поскольку вы находитесь в ядре, а античит - нет, вы можете изменить античит, чтобы остановить его обнаружение. Античит пользовательского режима не знает, что вы делаете в ядре.

Если игра использует античит режима ядра, тогда вы также должны быть в ядре, потому что ничего, что вы делаете в пользовательском режиме, не сможет обойти или скрыть античит ядра. Вообще, драйверы режима ядра не нужны для взлома 99% игр. Фактически, драйверы режима ядра очень легко обнаружить античитом, если все сделано неправильно.

Разработка драйвера режима ядра намного сложнее, чем для приложений пользовательского режима, по этой причине ваши функции, обеспечивающие «обход», выполняются в ядре, но в большинстве случаев, фактическая логика читерства выполняется в модуле пользовательского режима. В этой ситуации вы загружаете драйвер, включаете функцию обхода и затем инжектите свою DLL. В качестве альтернативы вы можете написать весь свой хак в режиме ядра, что намного сложнее.

Разработка драйвера режима ядра.

Тестовая подпись и подпись драйвера.

Windows требует, чтобы ваш драйвер режима ядра был подписан сертификатом безопасности, чтобы ОС его загрузила, но не волнуйтесь, вам не нужно платить 200 долларов за сертификат. Вам необходимо включить тестовую подпись, если вы хотите загрузить драйвер, который вы активно разрабатываете.

Раньше вы могли отключить подписи драйверов, выполнив эти команды от имени администратора и перезагрузившись:

bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS
bcdedit.exe -set TESTSIGNING ON

В Windows 8 и 10 вам может потребоваться войти в меню дополнительных параметров загрузки, нажав F8 во время загрузки. Windows 10 отключила горячую клавишу F8, чтобы снова включить ее:

bcdedit /set {default} bootmenupolicy legacy

Затем перезагрузитесь и нажмите F8 перед загрузкой Windows, вы увидите меню, в котором вы можете отключить подпись драйверов. В качестве альтернативы, в Windows 10 вы можете удерживать SHIFT при нажатии кнопки “Перезагрузить”, и появится это меню. Но это работает только для этой одной перезагрузки, вам нужно делать это каждый раз, потому что Windows 10 сбрасывает его до значения по умолчанию.

Как использовать драйверы с уязвимостями.

Любой драйвер, который берет данные из пользовательского режима и что-то делает с ними в ядре, потенциально уязвим. У многих есть переполнение буфера, которое можно использовать, или, что еще хуже, произвольная уязвимость ядра, связанная с записью данных. Эти уязвимости могут быть использованы из пользовательского режима для выполнения вашего кода, обеспечивая простой метод для загрузки вашего собственного драйвера.

Но вы не можете просто загрузить драйвер, потому что он не имеет цифровой подписи. У уязвимых драйверов режима ядра должны быть действующие сертификаты безопасности. Используя действующий и сертифицированный драйвер, вы можете без проблем вручную сопоставить неподписанный драйвер. Microsoft или центры сертификации могут принять решение об отклонении этих сертификатов в любое время, в результате чего они больше не будут работать, но это происходит крайне редко.

В учебных целях сначала научитесь использовать KDMapper, а затем KDU.

KDMapper.

KDMapper используется создателями платных читов:

  • Использует встроенный уязвимый драйвер Intel.
  • Предоставляет простой интерфейс командной строки.
  • Вы просто передаете ему 1 аргумент, и ваш драйвер загружен.
  • В KDMapper встроен уязвимый драйвер диагностики Intel Ethernet iqvw64e.sys. Драйвер встроен в массив байтов в intel_driver_resource.hpp.

Драйвер был подписан в 2013 году. Уязвимость была официально опубликована в 2015 году как CVE-2015-2291 с оценкой серьезности 7,8. Удивительно, но сертификат еще не отозван.

iqvw64e.sys

sha256            :     B2B2A748EA3754C90C83E1930336CF76C5DF9CBB1E3EEC175164BB01A54A4701
date            :     empty
language        :     English-United States
code-page        :     Unicode UTF-16    :      little endian
CompanyName        :     Intel Corporation
FileDescription    :     Intel(R) Network Adapter Diagnostic Driver
FileVersion        :     1.03.0.7 built by WinDDK
InternalName    :     iQVW64.SYS
LegalCopyright    :     Copyright (C) 2002-2013 Intel Corporation All Rights Reserved.
OriginalFilename:     iQVW64.SYS
ProductName        :     Intel(R) iQVW64.SYS
ProductVersion    :     1.03.0.7

Уязвимость существует из-за недостаточной проверки входного буфера, когда драйвер обрабатывает коды IOCTL 0x80862013, 0x8086200B, 0x8086200F, 0x80862007 с использованием METHOD_NEITHER, а также из-за небезопасных разрешений, позволяющих всем читать и писать доступ только к функциям привилегированного использования.

KDMapper использует код IOCTL 0x80862007 для произвольного выполнения.

Список уязвимых драйверов.

Вероятно, существуют тысячи уязвимых драйверов, вот некоторые из них, о которых мы знаем.
  • iqvw64e.sys
  • gpcidrv64.sys
  • AsUpIO64.sys
  • AsrDrv10.sys
  • AsrDrv101.sys
  • AsrDrv102.sys
  • AsrDrv103.sys
  • BSMEMx64.sys
  • BSMIXP64.sys
  • BSMIx64.sys
  • BS_Flash64.sys
  • BS_HWMIO64_W10.sys
  • BS_HWMIo64.sys
  • BS_I2c64.sys
  • GLCKIO2.sys
  • GVCIDrv64.sys
  • HwOs2Ec10x64.sys
  • HwOs2Ec7x64.sys
  • MsIo64.sys
  • NBIOLib_X64.sys
  • NCHGBIOS2x64.SYS
  • NTIOLib_X64.sys
  • PhlashNT.sys
  • Phymemx64.sys
  • UCOREW64.SYS
  • WinFlash64.sys
  • WinRing0x64.sys
  • amifldrv64.sys
  • atillk64.sys
  • dbk64.sys
  • mtcBSv64.sys
  • nvflash.sys
  • nvflsh64.sys
  • phymem64.sys
  • rtkio64.sys
  • rtkiow10x64.sys
  • rtkiow8x64.sys
  • segwindrvx64.sys
  • superbmc.sys
  • semav6msr.sys
  • piddrv64.sys
  • RTCore64
  • Gdrv
  • ATSZIO64
  • MICSYS
  • GLCKIO2
  • EneIo
  • WinRing0x64
  • EneTechIo

Ресурсы для уязвимых драйверов:

Функциональность античитов в режиме ядра.

  • Все самые обычные обнаружения в пользовательском режиме.
  • Обнаружение тестовой подписи.
  • Обнаружение хуков пользовательского режима.
  • Обнаружение введенных модулей.
  • Обнаружение драйверов режима ядра.
  • Обнаружение следов вручную отображаемых драйверов.
  • Обнаружение виртуальных машин и эмуляции.

Что делать дальше?

Итак, вы можете загрузить ваш драйвер с помощью Manual Map, можете читать и записывать память, что делать дальше?

Ну, вы действительно еще не обошли античит. Все, что вы сделали, это загрузили чит, который они еще не обнаружили, и теперь очень вероятно, что у них есть ваши модули. Если одни и те же модули обнаруживаются на нескольких машинах, вы можете оказаться в следующей волне бана. Простое создание драйвера и его отображение ничего не обходят. Античиты режима ядра невероятно агрессивны и могут обнаруживать все, что происходит в вашей системе. Если вы делаете что-то, что выглядит вредоносным, они легко могут обнаружить это и заблокировать вас.

Kernel Anticheat обычно используется в сочетании с модулем пользовательского режима, который отображается в игре и скрывается. Ваш следующий шаг - выгрузить модуль ядра, и модуль пользовательского режима, после чего перепроектировать их. Тогда у вас будет очень хорошее представление о том, как они работают.

Помните, что вы не можете пропатчить античит режима ядра, поэтому вам нужно обойти его.

Затем вы должны исправить все детекты в пользовательском режиме, чтобы вы могли подключить отладчик, особенно Cheat Engine & Reclass, чтобы вы могли начать реверс игры.

Из ядра вы можете пропатчить или перехватить все механизмы обнаружения в модуле пользовательского режима античита, далее вы можете использовать свой собственный модуль, чтобы защитить и скрыть другой модуль пользовательского режима. По сути, вы хотите заблокировать доступ античита к любому диапазону адресов ваших модулей. Как только вы позаботитесь обо всем этом, вы можете без проблем внедрить свой модуль пользовательского режима.

Обнаружение читов режима ядра.

Разработчики античитов имеют тот же список уязвимых драйверов, что и мы, они активно сканируют самые популярные из них. Если они найдут ваш модуль, они загрузят его на свой сервер, проанализируют и создадут для него свой метод обнаружение. EAC, например, имеет несколько очень хороших методов обнаружения, независимо от того, какой античит вы пытаетесь обойти.

Драйвер внедренный с помощью Manual Map не может быть обнаружен с помощью стандартных методов, но внедрение вашего драйвера оставляет следы. Убедитесь, что вы очистили PiDDBCacheTable и все остальное, что оставил после себя ваш драйвер.

Ресурсы:

Примечание

Статья переведена @antihero с англоязычного форума, возможны некоторые ошибки. Если вы их нашли, пожалуйста, воспользуйтесь личными сообщениями на форуме и проинформируйте меня.
Источник.

5 Likes

Хоть я в этом ничего не понимаю, но с удовольствием почитал. Все максимально подробно описано. Полезно и интересно. Лайк однозначно :slightly_smiling_face:

1 Like

вот можно было б обойти бан :smile: