提权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; }

 

转载于:https://www.cnblogs.com/Anony-WhiteLearner/p/6246613.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值