64,687
社区成员
发帖
与我相关
我的任务
分享
//如何以TrustedInstaller用户权限修改注册表
//通过代码将当前权限提升到TrustedInstaller很麻烦,但是可以通过获取备份还原权限来绕过DACL的监测机制。
#pragma comment(lib,"advapi32")
#include <stdio.h>
#include <string.h>
#include <windows.h>
bool EnablePriviledge(LPCTSTR lpSystemName) {
HANDLE hToken;
TOKEN_PRIVILEGES tkp = {1};
if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) {
if (LookupPrivilegeValue(NULL,lpSystemName,&tkp.Privileges[0].Luid)) {
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
if (GetLastError() != ERROR_SUCCESS) {
CloseHandle(hToken);
return false;
}
}
CloseHandle(hToken);
}
return true;
}
int main() {
bool bRet;
LONG lResult;
bRet = EnablePriviledge(SE_BACKUP_NAME);//这个函数是重点,让当前进程具备备份/还原的特权。
if (bRet) {
bRet = EnablePriviledge(SE_RESTORE_NAME);
if (bRet) {
HKEY hResult = NULL;
DWORD dwDisposition;
lResult = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Classes\\CLSID\\{871C5380-42A0-1069-A2EA-08002B30309D}\\shell\\NoAddOns",
0,
NULL,
REG_OPTION_BACKUP_RESTORE,//这个是重点,传入这个参数可以直接忽视KEY_ALL_ACCESS这个参数的作用,直接以备份/还原的特权去操作注册表
KEY_ALL_ACCESS,
NULL,
&hResult,
&dwDisposition);
if (lResult != ERROR_SUCCESS) {
return 3;
}
wchar_t cValue[256] = L"";
lResult = RegSetValueExW(hResult,L"LegacyDisable",NULL,REG_SZ,(LPBYTE)cValue,(wcslen(cValue)+1)*sizeof(wchar_t));
if (lResult != ERROR_SUCCESS) {
return 4;
}
RegCloseKey(hResult);
printf("OK.\n");
return 0;
} else return 2;
} else return 1;
}
void main()
{
bool bRet = true;
bRet = EnablePriviledge(SE_BACKUP_NAME);//这个函数是重点,让当前进程具备备份/还原的特权。
bRet = EnablePriviledge(SE_RESTORE_NAME);
if(bRet)
{
HKEY hResult = NULL;
DWORD dwDisposition;
LONG lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT,
L"CLSID\\{52205fd8-5dfb-447d-801a-d0b52f2e83e1}\\shell\\OpenNewWindow\\command",
0,
NULL,
REG_OPTION_BACKUP_RESTORE,//这个是重点,传入这个参数可以直接忽视KEY_ALL_ACCESS这个参数的作用,直接以备份/还原的特权去操作注册表
KEY_ALL_ACCESS,
NULL,
&hResult,
&dwDisposition);
if(lResult != ERROR_SUCCESS)
{
return;
}
//下面是我随便写的,到了这一步如果都成功的话,下面的代码就可以为所欲为了。
wchar_t cValue[256] = L"explorer.exe ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";
RegSetValueEx(hResult,L"xx",NULL,REG_SZ,(LPBYTE)cValue,sizeof(cValue));
lResult = RegDeleteValue(hResult,L"xx");
//lResult = RegDeleteValue(hResult,L"DelegateExecute");
ErrMsg();
RegCloseKey(hResult);
}
}
bool EnablePriviledge(LPCTSTR lpSystemName)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp = {1};
if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
{
if(LookupPrivilegeValue(NULL, lpSystemName,&tkp.Privileges[0].Luid))
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
{
CloseHandle(hToken);
return false;
}
}
CloseHandle(hToken);
}
return true;
}