通过基于直接系统调用的反射式进程镂空绕过 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 标志完全终止进程。
| 浏览器 | 已测试版本(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 |
注意: Chrome/Brave/Edge 144+ 使用新的
IElevator2COM 接口。该工具在可用时自动使用IElevator2,并在旧版本上回退到IElevator。Avast Secure Browser 使用自定义的IElevatorChrome接口,其 vtable 扩展为 12 个方法,DecryptData 位于偏移 104 处。
该矩阵列出了每个受支持浏览器的提取能力。
| 功能 | 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 |
该工具的执行专注于隐蔽性和效率,围绕 基于直接系统调用的反射式镂空 进程构建。这种方法确保很少进行高级别 API 调用,并且载荷在合法的、新创建的浏览器进程内部运行。
chromelevator.exe)ntdll.dll 以使用基于哈希的匹配来解析系统调用号(SSN),并定位内核转移指令(syscall/ret 或 svc/ret)。如果指定了 --kill 标志,它将使用 NtGetNextProcess 和 NtTerminateProcess 系统调用终止目标浏览器的所有运行实例,以释放 SQLite 数据库上的文件锁。CREATE_SUSPENDED 状态(CreateProcessW)创建目标浏览器的一个新实例。这个全新的、挂起状态的进程将作为我们载荷的主机。NtAllocateVirtualMemory(直接系统调用)分配内存。NtWriteVirtualMemory 将解密后的载荷 DLL 写入分配的空间。NtProtectVirtualMemory(直接系统调用)将内存区域的权限更改为可执行。NtCreateThreadEx 在目标进程中创建一个新线程。线程的起始地址直接指向载荷的 Bootstrap 导出函数,其参数为远程管道名称的地址。浏览器的原始主线程保持挂起状态,且永远不会被恢复。随后注入器等待载荷回连到管道。Bootstrap 反射式加载器开始执行,充当自定义的内存中 PE 加载器,并具有增强的隐蔽性:
NtAllocateVirtualMemory 为载荷分配新内存(绕过被挂钩的 VirtualAlloc)。NtProtectVirtualMemory 设置节区权限。DllMain。DllMain 生成一个新线程,该线程立即连接到注入器传递的命名管道句柄。它读取注入器发送的配置,包括输出路径。所有后续日志和状态更新都通过此管道回传。IElevator2,早期版本为 IElevator,Edge 为 IEdgeElevatorFinal,Avast Secure Browser 为 IAvastElevator)。由于调用源自受信任的进程路径,因此服务器所有安全检查均会通过。DecryptData 方法,并传入其从 Local State 文件中读取的 app_bound_encrypted_key。COM 服务器忠实地解密该密钥,并将明文 AES-256 主密钥返回给载荷。Default、Profile 1 等)。对于每个配置文件,它查询相关的 SQLite 数据库(Cookies、Login Data、Web Data),使用 AES-256-GCM 解密数据块,并将机密信息格式化为 JSON。结果直接写入注入器指定的输出目录。FreeLibraryAndExitThread 进行清理。注入器收到信号后,使用 NtTerminateProcess 终止父主机进程。本项目使用一个简单且稳健的构建脚本,可自动处理所有编译和载荷嵌入工作。
克隆 此仓库。
打开 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`
启用注入器的详细调试输出。