
Скрывайте артефакты памяти с помощью ROP и аппаратных точек останова.
Этот инструмент — простой PoC того, как скрыть артефакты памяти с помощью ROP-цепочки в сочетании с аппаратными точками останова. ROP-цепочка изменит защиту страницы памяти основного модуля на N/A во время сна (т.е. при вызове функции Sleep). Для получения более подробной информации об этой технике обхода сканирования памяти ознакомьтесь с оригинальным проектом Gargoyle. Только x64.
Идея состоит в том, чтобы установить аппаратную точку останова в kernel32!Sleep и новый фильтр верхнего уровня для обработки исключения. При вызове Sleep срабатывает предварительно установленная функция фильтра исключений, что позволяет нам вызвать ROP-цепочку без необходимости использования классических хуков функций. Таким образом, мы избегаем появления странных и необычных частных областей памяти в процессе, связанных с известными DLL.
ROP-цепочка просто вызывает VirtualProtect() для установки текущей страницы памяти в N/A, затем вызывает SleepEx и, наконец, восстанавливает защиту памяти RX.
Обзор процесса выглядит следующим образом:
Этот процесс повторяется бесконечно.
Как видно на изображении, защита памяти основного модуля меняется на N/A во время сна, что позволяет избежать сканирования памяти, ищущего страницы с разрешением на выполнение.

Поскольку мы используем плагин LITCRYPT для обфускации строковых литералов, перед компиляцией кода необходимо установить переменную окружения LITCRYPT_ENCRYPT_KEY:
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"
После этого просто скомпилируйте код и запустите инструмент:
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
Этот инструмент — всего лишь PoC, и для полноценной работы необходимо реализовать некоторые дополнительные функции. Основная цель проекта — изучить, как реализовать ROP-цепочку и интегрировать её в Rust. Из-за этого инструмент будет работать только при использовании «как есть», и при попытке использовать его иными способами (например, компиляции в DLL и рефлексивной загрузки и выполнения) ожидаются сбои.