VC中如何以TrustedInstaller用户修改注册表

wstc53032979 2014-09-17 06:25:55
如何编程修改诸如 HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\NoAddOns\LegacyDisable 的键值?
用RegOpenKey会失败,原因是Administrator的权限,那个“完全控制”没有勾选上,直接勾无法勾上,需要在“高级”->“所有者”中选择“Administratosr” 为所有者(系统默认为TrustedInstaller),但是我想知道这个过程如何靠编程实现呢? 目前项目卡在这了,手动勾选的动作不可能让用户去做,必须靠编程自动化实现。
或者是不是可以换种思路,让生成的程序直接以TrustedInstaller用户来执行,请问这又如何做到呢?
有哪位大神知道解法吗? 回答的时候顺便留下QQ行吗? 或者加我QQ53032979 想详细咨询。
...全文
359 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yurnero_vv 2014-11-24
  • 打赏
  • 举报
回复
剽窃我的代码也不注明一下 http://blog.csdn.net/yurnero123/article/details/41079707
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
现场剽窃是本贱人的绝技!
//如何以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;
}
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
向1楼学习,向1楼致敬!
yurnero_vv 2014-11-13
  • 打赏
  • 举报
回复
通过代码将当前权限提升到TrustedInstaller很麻烦,但是可以通过获取备份还原权限来绕过DACL的监测机制。
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;
}

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧