提权GrantPrivilege
大概一个多月前学习了提权的知识,当时一直不知道提权到底具体是为了干什么。只是模糊的知道提高权限,获得别的进程的一些东西。后来慢慢的学习的多了,知道了一个叫做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 = 1; TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; TokenPrivileges.Privileges[0].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; }