R3提权 突破TrustedInstaller 更改所有者实现代码删除系统文件
为了让需要的网友能够找到相关资料,所以标题起的有点夸张,前年,我有个奇怪的需求就是要删除系统目录下的某个文件,然后东拼西凑出来的代码
Win10系统手动修改删除
我们直接删除系统目录下的文件会提示需要权限才能进行更改
编辑权限也无法编辑
问了一下百度 原因是需要修改所有者 下面是修改所有者的步骤
修改完成之后即可正常编辑权限
代码
#include<Windows.h>
#include<iostream>
#include<AclAPI.h>
//修改文件的用户访问权限
BOOL EnableFilaAccountPrivilege(const char path[],PCTSTR accountName)
{
EXPLICIT_ACCESS aces{};
PACL pACL = NULL;
PACL pACL1 = NULL;
//获取文件(夹)安全对象的DACL列表
GetNamedSecurityInfo((LPTSTR)path,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,&pACL1,NULL,NULL);
//生成指定用户帐户的访问控制信息(这里指定赋予全部的访问权限)
BuildExplicitAccessWithName(&aces,(LPTSTR)accountName,GENERIC_ALL,GRANT_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
//创建新的ACL对象(合并已有的ACL对象和刚生成的用户帐户访问控制信息)
if (ERROR_SUCCESS != SetEntriesInAcl(1,&aces,pACL1,&pACL))
{
printf("SetEntriesInAcl\r\n");
if (NULL != pACL) LocalFree(pACL);
return FALSE;
}
//设置文件(夹)安全对象的DACL列表
if (ERROR_SUCCESS != SetNamedSecurityInfo((LPTSTR)path,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pACL,NULL))
{
printf("SetNamedSecurityInfo\r\n");
if (NULL != pACL) LocalFree(pACL);
return FALSE;
}
if (NULL != pACL) LocalFree(pACL);
return TRUE;
}
//提升自己进程的权限
BOOL AdjustPrivileges()
{
HANDLE hToken = NULL;
LUID luidValue = { 0 };
TOKEN_PRIVILEGES tokenPrivileges = { 0 };
//打开进程令牌并获取进程令牌句柄
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
printf("OpenProcessToken\r\n");
return FALSE;
}
//设置提升权限信息
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!LookupPrivilegeValue(NULL, SE_TAKE_OWNERSHIP_NAME, &tokenPrivileges.Privileges[0].Luid))
{
printf("LookupPrivilegeValue\r\n");
return FALSE;
}
//提升进程令牌访问权限
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, NULL, NULL))
{
printf("AdjustTokenPrivileges\r\n");
return FALSE;
}
else
{
//根据错误码判断是否特权都设置成功
DWORD dwRet = ::GetLastError();
if (ERROR_SUCCESS == dwRet)
{
return TRUE;
}
else if (ERROR_NOT_ALL_ASSIGNED == dwRet)
{
printf("ERROR_NOT_ALL_ASSIGNED\r\n");
return FALSE;
}
}
return FALSE;
}
//修改所有者权限
BOOL ChangeOwner(const char* Path)
{
char UserName[36] = { 0 };
//LookupAccountName函数所需要的变量
DWORD cbUserName = sizeof(UserName);
char Sid[1024] = { 0 };
DWORD cbSid = sizeof(Sid);
char DomainBuffer[128] = { 0 };
DWORD cbDomainBuffer = sizeof(DomainBuffer);
SID_NAME_USE eUse;
//获取当前登陆用户名
GetUserNameA(UserName,&cbUserName);
//获取用户名SID
if (!LookupAccountNameA(NULL,UserName,&Sid,&cbSid,DomainBuffer,&cbDomainBuffer,&eUse)) return FALSE;
//更改所有者
//Path 要更改的文件或文件夹路径
//SE_FILE_OBJECT 注册表为:SE_REGISTRY_KEY
//Sid 需要更改所有者的SID
if(ERROR_SUCCESS!=SetNamedSecurityInfoA((LPSTR)Path,SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,&Sid,NULL,NULL,NULL)) return FALSE;
return TRUE;
}
int main()
{
char strBuffer[256] = { 0 };
DWORD dwSize = sizeof(strBuffer);
GetUserName(strBuffer, &dwSize);
printf("用户名 %s\n",strBuffer);
if (AdjustPrivileges()) printf("提升自己进程的权限成功\n");
if (ChangeOwner("C:\\Windows\\System32\\ntoskrnl.exe")) printf("更改所有者成功\n");
if(EnableFilaAccountPrivilege("C:\\Windows\\System32\\ntoskrnl.exe", strBuffer)) printf("修改文件的用户访问权限成功\n");
system("pause");
return 0;
}
编译的时候需要修改一下UAC执行级别
运行结果