提权GrantPrivilege

时间:2023-03-08 18:23:40

大概一个多月前学习了提权的知识,当时一直不知道提权到底具体是为了干什么。只是模糊的知道提高权限,获得别的进程的一些东西。后来慢慢的学习的多了,知道了一个叫做ReadProcessMemory的函数,第一次看是因为已经提完权限了,这个函数实现的比较完美,后来想了想,把提权注释后,发现ReadProcessMemory实现不成功了。。。查看了MSDN发现了Remarks:Any process that has a handle with PROCESS_VM_READ access can call the function.(仍记得我用的是"SeDugPrivilege",这个权限貌似还是Ring3层最高的)。然后明白了提权的意义,两个进程空间互不相连,想要通过自家进程空间打开目标进程空间,并且获取内容的话,必须提高权限(相当于拿到了钥匙)。

提权大概分为3个步骤:

1.获得目标进程句柄(戏称“令牌”)。

2.获取权限(用“SeDugPrivelege"权限)。

3.将获得的权限注入你获得的”令牌“中。

if (GrantPriviledge(L"SeDebugPrivilege") == FALSE);

BOOL GrantPriviledge(IN const WCHAR* PriviledgeName)
{
TOKEN_PRIVILEGES TokenPrivileges;
TOKEN_PRIVILEGES OldPrivileges; HANDLE ProcessHandle = GetCurrentProcess();
HANDLE TokenHandle = NULL;
LUID Luid; //获得令牌
if (OpenProcessToken(ProcessHandle, TOKEN_ALL_ACCESS, &TokenHandle) == FALSE)
{
CloseHandle(ProcessHandle);
CloseHandle(TokenHandle);
TokenHandle = NULL;
return FALSE;
} //获取Debug权限
if (LookupPrivilegeValue(NULL, PriviledgeName, &Luid) == FALSE)
{
CloseHandle(ProcessHandle);
CloseHandle(TokenHandle);
TokenHandle = NULL;
ProcessHandle = NULL;
return FALSE;
} TokenPrivileges.PrivilegeCount = ;
TokenPrivileges.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
TokenPrivileges.Privileges[].Luid = Luid; if (AdjustTokenPrivileges(TokenHandle, FALSE, &TokenPrivileges,
sizeof(TOKEN_PRIVILEGES), NULL, NULL) == FALSE)
{
CloseHandle(ProcessHandle);
CloseHandle(TokenHandle);
TokenHandle = NULL;
ProcessHandle = NULL;
return FALSE;
} CloseHandle(TokenHandle);
CloseHandle(ProcessHandle);
ProcessHandle = NULL;
TokenHandle = NULL;
return TRUE;
}