Masteryxy/CMSTPLua-Reflective-UAC-Bypass
GitHub: Masteryxy/CMSTPLua-Reflective-UAC-Bypass
基于反射式DLL注入和ICMLuaUtil COM接口的Windows UAC绕过工具,支持无文件内存执行。
Stars: 8 | Forks: 2
# COM BypassUAC - 反射式 DLL 注入
该项目是一个旨在利用 COM (组件对象模型) 接口结合反射式 DLL 注入技术来绕过 Windows UAC (用户账户控制) 的工具。
## 概述
该项目是一个构建用于绕过 Windows 系统上 UAC 保护的反射式 DLL。它由两个主要组件组成:
1. **反射式 DLL 加载器** – 在内存中加载并执行 DLL 的机制
2. **UAC 绕过** – 使用 COM 接口以提升的权限启动程序
## 特性
* **反射式 DLL 注入**:完全从内存加载 DLL,无需接触磁盘
* **UAC 绕过**:使用 COM 接口 `ICMLuaUtil` 绕过 UAC
* **多架构支持**:x86 (32位), x64 (64位), 以及 ARM
* **隐蔽性**:不在磁盘上留下痕迹
* **最小依赖**:仅使用 Windows API 函数
## 工作原理
### 1. 反射式 DLL 注入
反射式 DLL 注入是一种直接将 DLL 加载到内存中而不使用标准 Windows API (`LoadLibrary`, `GetProcAddress`) 的技术。
该项目中的加载器通过以下步骤工作:
1. **PE 头搜索**:通过在内存中向后扫描来定位 PE (可移植可执行文件) 头
2. **查找 Kernel32.dll**:通过 PEB (进程环境块) 获取引用
3. **解析 API 函数**:使用基于哈希的查找来查找所需的 API:
* `LoadLibraryA`
* `GetProcAddress`
* `VirtualAlloc`
* `NtFlushInstructionCache`
4. **内存分配**:为 DLL 分配内存
5. **PE 加载**:将 PE 头和节复制到新的内存区域
6. **导入表处理**:加载所需的 DLL 并解析导入
7. **重定位处理**:修正基地址差异
8. **调用 DllMain**:调用 DLL 的入口点
### 2. UAC 绕过机制
UAC 绕过是通过使用 Windows 内部的 `ICMLuaUtil` COM 接口执行的:
1. **创建 COM Moniker**:生成以下格式的 moniker
`Elevation:Administrator!new:{CLSID}`
2. **创建 COM 对象**:调用 `CoGetObject` 创建提升权限的 COM 实例
3. **ShellExec 调用**:使用 `ICMLuaUtil::ShellExec` 以提升的权限运行目标程序
### 执行流程
```
[DLL Injection] → [ReflectiveLoader] → [DllMain] → [CMLuaUtilBypassUAC] → [Elevated Program]
```
## 需求
### 构建环境
* **Visual Studio 2022**
* **Windows SDK**
* **C/C++ 编译器**
### 运行环境
* **Windows Vista 或更高版本** (支持 UAC 的系统)
* **非管理员用户账户** (推荐用于测试 UAC 绕过)
## 构建
### 使用 Visual Studio 构建
1. 克隆或下载该项目
2. 在 Visual Studio 中打开 `reflective_dll.sln`
3. 构建项目:
* `Build` → `Build Solution` (Ctrl+Shift+B)
## 用法
### 基本用法
此 DLL 必须使用反射式注入注入到目标进程中。注入后:
1. `ReflectiveLoader` 被调用
2. DLL 将自身加载到内存中
3. `DllMain` 被调用并附带 `DLL_PROCESS_ATTACH`
4. 从 `lpReserved` 参数读取目标程序路径
5. `CMLuaUtilBypassUAC` 执行 UAC 绕过
### 示例使用场景
```
// Example: Loader injecting the DLL
// 1. Load DLL into memory
LPVOID pDllBuffer = LoadDllFromFile("comBypassUac.dll");
// 2. Find the ReflectiveLoader function
REFLECTIVELOADER pReflectiveLoader = GetReflectiveLoader(pDllBuffer);
// 3. Prepare the target program path
char* targetProgram = "C:\\Windows\\System32\\cmd.exe";
// 4. Call ReflectiveLoader (passing the program path via lpReserved)
pReflectiveLoader(targetProgram);
```
### 指定目标程序
DLL 通过 `lpReserved` 参数接收目标程序路径。
这是在 UAC 绕过后将以提升的权限执行的程序。
### 文件描述
#### `src/ReflectiveDll.c`
* 主 DLL 入口点 (`DllMain`)
* `CMLuaUtilBypassUAC`:UAC 绕过函数
* `CoCreateInstanceAsAdmin`:创建提升权限的 COM 实例
* `ICMLuaUtil` 接口定义
#### `src/ReflectiveLoader.c`
* `ReflectiveLoader`:从内存加载 DLL 的主函数
* PE 头解析
* 导入表解析
* 重定位处理
* 基于哈希的 API 解析
#### `bypassuac.h`
* `ICMLuaUtil` 的 COM 接口定义
* CLSID 和 IID 声明
* 函数原型
## 技术细节
### COM 接口: ICMLuaUtil
该项目依赖于 Windows 内部的 `ICMLuaUtil` 接口:
* **CLSID**: `{3E5FC7F9-9A51-4367-9063-A120244FBEC7}` (CMSTPLUA)
* **IID**: `{6EDD6D74-C007-4E75-B76A-E5740995E24C}` (ICMLuaUtil)
### 基于哈希的 API 查找
反射式加载器使用预计算的哈希值而不是字符串名称来解析 API 函数,从而隐藏二进制文件中的敏感字符串:
```
#define KERNEL32DLL_HASH 0x6A4ABC5B
#define LOADLIBRARYA_HASH 0xEC0E4E8E
#define GETPROCADDRESS_HASH 0x7C0DFCAA
#define VIRTUALALLOC_HASH 0x91AFCA54
```
### PE 重定位
当 DLL 加载到不同的基地址时,必须更正所有相对地址。
加载器处理 PE 重定位表以应用这些调整。
## 许可证
该项目采用 MIT 许可证授权。有关更多信息,请参阅 [LICENSE 文件](LICENSE)。
标签:COM接口, CSV导出, DLL注入, Hakrawler, ICMLuaUtil, PEB, Shellcode, UAC Bypass, UML, Windows API, x64, x86, 代理, 免杀技术, 内存加载, 协议分析, 安全测试, 安全规避, 客户端加密, 客户端加密, 技术调研, 攻击性安全, 无文件攻击, 暴力破解检测, 本地提权, 权限提升, 流量审计, 知识库安全, 端点可见性