приветствую имеется античит работающий только в ring3. В данном античите есть функции для сканирования памяти. Я проицирую мою память в процесс через ring0 и закрываю ее через VAD (blackbone). Какое то время помогало, но теперь каким то образом этот античит умудряется получить доступ к ней и сканировать. Возможно кто подскажет какие еще варианты сканирования могут быть через которые они могут сканировать закрытый регион? Если кто подскажет буду очень благодарен.
_us0, А что значит регион закрытый" ? Он исключён из VAD, но страницы присутствуют в WS ? Тоесть регион скрыт от дампа(NtQueryVi) ? Какой смысл при скане памяти перечислять регионы через сервис ядра, учитывая что он может фильтроваться - никакого, ко всем областям памяти должна быть прямая выборка данных. Ставим ловушку и в цикле обращаемся ко всем регионам ап. Учитывая технологии типо анклавов, запрос в ядро на дамп памяти смысла не имеет для реализации защиты.
> Возможно кто подскажет какие еще варианты сканирования могут быть через которые они могут сканировать закрытый регион? Имеется монитор рабочего набора. Сбрасываем его и накапливаем лог, это даст все адреса по которым выполняется выборка - которые читаются и исполняются. Семплы есть в статье по анклавам.
Код (Text): NTSTATUS BBUnlinkVAD( IN PEPROCESS pProcess, IN ULONG_PTR address ) { NTSTATUS status = STATUS_SUCCESS; PMMVAD_SHORT pVadShort = NULL; status = BBFindVAD( pProcess, address, &pVadShort ); if (!NT_SUCCESS( status )) return status; // Erase image name if (pVadShort->u.VadFlags.VadType == VadImageMap) { PMMVAD pVadLong = (PMMVAD)pVadShort; if (pVadLong->Subsection && pVadLong->Subsection->ControlArea && pVadLong->Subsection->ControlArea->FilePointer.Object) { PFILE_OBJECT pFile = (PFILE_OBJECT)(pVadLong->Subsection->ControlArea->FilePointer.Value & ~0xF); pFile->FileName.Buffer[0] = L'\0'; pFile->FileName.Length = 0; } else return STATUS_INVALID_ADDRESS; } // Make NO_ACCESS else if (pVadShort->u.VadFlags.VadType == VadDevicePhysicalMemory) { pVadShort->u.VadFlags.Protection = MM_ZERO_ACCESS; } // Invalid VAD type else status = STATUS_INVALID_PARAMETER; return status; } Наверное он это имел в виду.
Мне тоже интересна эта тема но меня больше интересует как можно изолировать регион памяти от R/W в User-Mode.
Если бы я делал античит запидорасил бы все в ядро, и обошел бы уак в зависимости от задачи, а в ядре уже пляши как хочешь ну и может патч гуард обойти пришлось бы
ivanpos2010, Это можно сделать, софтверный анклав. Для этого нужно раскодировать эффективный адрес каждой инструкции из их потока, для этого код должен быть исполнен под визором. При таком исполнении кодовый регион уже не исполняем, при раскодировке адреса получаются modr/m компоненты. Далее выборка данных перенаправляется на анклав через изменение адресной компоненты, полученной раскодировкой modr/m. Тогда регион физически не существует - на каждой итерации адресуемый блок памяти может быть расшифрован, при этом без прямой выборки данных вне визора его прочитать невозможно, так же это нельзя сделать из более привилегированных режимов. Тоесть нельзя просканить память удалённо. Вот тут пример есть https://wasm.in/threads/skrytie-modulja.31872/
посмотрела предоставленную вами информацию такой метод мне не подходит .. мне больше интересно какими структурами можно манипулировать через ядро чтобы запретить доступ R/W (Windows x64)
ivanpos2010, Не подходит из за сложности - иначе всё бессмысленно, сейчас такой уровень техник. Иначе создать анклав никак нельзя.
ivanpos2010, Будет зависимость от архитектуры, так как нужно раскодировать поток инструкций, а их кодировка(набор) у каждой архитектуры разный. Так же будет зависимость от ос, системная обработка необходимая для работы визора различается на разных ос. Падения профайла же фактически нет(разы) при грамотной реализации. Но при этом есть обратная совметимость, это можно запустить на младших версиях CPU/системы и не нужно встраиваться в ядро. Аппаратного аналога нет, более того принципиально любая защита перестаёт иметь смысл на одинаковом с ней уровне привилегий.
ivanpos2010, Во первых с нуля это не нужно реализовать, есть и паблик визоры(pin etc). Во вторых я к комерсу никакого отношения не имею, так что без понятия что по чём
ivanpos2010, Тогда только виртуальные машины. Но опять же в них данные раскрыты, защищается только код. Если вы строите какую то защиту, то классические методы не годятся, она сразу будет вскрыта.
ivanpos2010, Вот тут есчо посмотрите http://www.rohitab.com/discuss/topic/42331-antimemory-scanner-bypassing-nod32-memory-scan/ Аналогичный вопрос и то же решение. Эта кстате тема следующей моей статьи.