Drew-Alleman/dmenum
GitHub: Drew-Alleman/dmenum
dmenum 是一个利用 DM token 通过 DMServer 协议枚举并解码企业 Chrome 浏览器策略的跨平台工具与库,将原始策略数据转换为人类可读的配置清单。
Stars: 0 | Forks: 0
# dmenum
一个跨平台的工具/库,用于从 Device Management (DM) token 中枚举企业 Chrome 浏览器策略。它使用 Chromium 真实的 DMServer 协议进行通信,解码返回的 policy blob,并将每条策略与其人类可读的 Chromium 元数据(标题、描述以及每个枚举值的含义)结合在一起。**可以在[这里](https://drewalleman.xyz/red-teaming/2026/07/15/dumping-enterprise-chrome-policies-using-device-management-tokens-from-verbose-logs)找到一篇博客文章,展示了如何从详细的 chrome 日志中提取该 token。**
```
google/chrome/user — 22 policies set (22 enforced, 0 recommended)
----------------------------------------------------------------------
Incognito mode availability
IncognitoModeAvailability = 1 → Incognito mode disabled
Specifies whether the user may open pages in Incognito mode in Google Chrome…
```
## Windows 构建说明
**前置条件**
- **Visual Studio 2022 或更高版本**,包含 **“使用 C++ 的桌面开发”** 工作负载。这一个工作负载就为你提供了 MSVC 编译器 (`cl.exe`)、内置的 CMake 以及 Ninja —— 你不需要单独安装 CMake。
- **Git**(用于克隆 vcpkg)。
- **vcpkg**(在下方安装)。
### 下文使用的占位符
请在通篇内容中将这些占位符替换为你自己的路径:
| 占位符 | 含义 | 示例 |
|-----------------|--------------------------------------|---------|
| `` | 你克隆/安装 vcpkg 的位置 | `C:\Users\drew\vcpkg`, `C:\dev\vcpkg`, `D:\tools\vcpkg` |
| `` | 此代码库所在的位置 | `C:\Users\drew\dmenum` |
vcpkg 可以位于**任何地方**,该项目也可以位于**任何地方** —— 它们不需要彼此靠近。将它们联系在一起的唯一因素是你在步骤 3 中传递给 CMake 的 toolchain 文件路径。
### 1. 安装依赖项
`dmenum` 需要 **Protobuf**(用于使用 DM 线路协议进行通信)和 **OpenSSL**(以便 cpp-httplib 可以与真实的 DMServer 进行 HTTPS 通信):
```
\vcpkg install protobuf openssl
```
对于静态构建,请使用:
```
vcpkg install protobuf:x64-windows-static openssl:x64-windows-static
```
### 3. 配置构建
在项目文件夹中,将 CMake 指向 vcpkg 的 toolchain 文件。**这是将你的构建与你的 vcpkg 连接起来的一行**,这也是自定义安装路径发挥作用的地方:
```
cd
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=/scripts/buildsystems/vcpkg.cmake -DDMENUM_BUILD_TESTS=OFF
```
具体来说,如果 vcpkg 位于 `C:\Users\drew\vcpkg` 下:
```
cd C:\Users\drew\dmenum
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=C:/Users/drew/vcpkg/scripts/buildsystems/vcpkg.cmake -DDMENUM_BUILD_TESTS=OFF
```
关于 toolchain 路径的说明:
- **使用正斜杠**(`C:/Users/...`)或双反斜杠 —— 单个反斜杠可能会被当作转义字符吃掉。
- **不同的盘符**不需要任何特殊处理:`D:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake`。
- 要强制使用特定的 triplet(例如静态构建),请添加 `-DVCPKG_TARGET_TRIPLET=x64-windows`。
- 如果你的检出版本没有 `tests/` 目录,添加 `-DDMENUM_BUILD_TESTS=OFF` 可以避免配置失败。如果你有该目录,则可以去掉它。
成功的配置将以以下内容结束:
```
-- dmenum: TLS ENABLED (OpenSSL found) -- can reach the public https DMServer
-- Configuring done
-- Generating done
```
如果你看到黄色的 **`TLS DISABLED`** 警告,请安装 OpenSSL,删除 `build` 文件夹,然后重新配置。
### 4. 构建
配置仅仅是*写入*项目文件 —— 你仍然需要进行编译。Visual Studio 生成器是多配置的,因此必须使用 `--config`:
```
cmake --build build --config Debug
```
vcpkg 会自动将运行时 DLL(protobuf, abseil, zlib, OpenSSL)复制到 `.exe` 旁边,因此它可以实际运行。生成的二进制文件位于 `build\examples\Debug\enumerate_policies.exe`。
### 5. 运行
```
.\build\examples\Debug\enumerate_policies.exe [policy_type]
```
在不带参数的情况下运行它即可查看用法说明。`policy_type` **必须与你的 token 类型相匹配**:
| 你的 token 类型 | 使用此 `policy_type` |
|--------------------------------------------------------|------------------------|
| 托管配置文件 (`CHROME_MANAGED_GAIA_PROFILE_TOKEN`) | `google/chrome/user` |
| CBCM 浏览器设备 (`CHROME_BROWSER_DEVICE_TOKEN`) | `google/chrome/machine-level-user` (默认) |
| ChromeOS 用户 | `google/chromeos/user` |
如果不匹配,服务器将返回一个明确的 **HTTP 401** 状态,并指出期望的 token 类型。
## Linux 构建说明
**安装依赖项**(Debian / Ubuntu):
```
sudo apt install cmake g++ protobuf-compiler libprotobuf-dev libssl-dev
```
在 macOS 上,等效的命令是 `brew install cmake protobuf openssl`。
使用便捷的 Makefile 进行**构建**:
```
cmake -S . -B build-linux -DDMENUM_BUILD_TESTS=OFF
cmake --build build-linux -j
```
…或者直接驱动 CMake:
```
cmake -S . -B build -DDMENUM_BUILD_TESTS=OFF
cmake --build build -j
```
cpp-httplib 会通过 CMake 的 `FetchContent` 自动获取;Protobuf 和 OpenSSL 来自你的系统软件包。如果你的检出版本没有 `tests/` 目录,请添加 `-DDMENUM_BUILD_TESTS=OFF`(如果省略它,则会构建并运行测试)。
**运行** —— 对于单配置生成器,没有 `Debug/` 子文件夹:
```
./build/examples/enumerate_policies [policy_type]
```
## 示例输出
```
$ enumerate_policies google/chrome/user
google/chrome/user — 22 policies set (22 enforced, 0 recommended)
----------------------------------------------------------------------
Browser sign in settings
BrowserSignin = 2 → Force users to sign-in to use the browser
This policy controls the sign-in behavior of the browser. It allows you to…
Enable deleting browser and download history
AllowDeletingBrowserHistory = false → Disable deleting browser and download history
Setting the policy to Enabled or leaving it unset means browser history and…
Incognito mode availability
IncognitoModeAvailability = 1 → Incognito mode disabled
Specifies whether the user may open pages in Incognito mode in Google Chrome…
Restrict which Google accounts are allowed to be set as browser primary accounts
RestrictSigninToPattern = *example.com
Contains a regular expression which is used to determine which Google accounts…
Set a custom enterprise label for a managed profile
EnterpriseCustomLabel = Ev1l C0rp!zZzZzzzZ
This policy controls a custom label used to identify managed profiles…
… (22 policies total)
```
每个条目都显示了策略的人类可读标题、其原始名称和配置的值、枚举值的解码含义(在 `→` 之后),以及截断的描述 —— 所有这些都从内置的 Chromium 元数据快照中提取。
标签:Bash脚本, C++, Chromium, 企业策略枚举, 安全测试工具, 数据擦除, 无线安全