修改window进程访问权限

2024-06-23 17:18

本文主要是介绍修改window进程访问权限,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

修改访问权限

使用CreateRemoteThread植入DLL时,必须应用程序的权限。

插入的程序每次操作目标进程的虚拟空间,调用CreateRemoteThread 的时候,都先调用OpenProcess打开这个进程,将PROCESS_ALL_ACCESS 标志作为参数传递,得到这个进程最大的访问权限。

所有受限的进程都是操作系统的一部分,普通的应用程序不应该有权去操作OS。要访问,调用的进程必须有调试的特权。

逻辑描述:

(1) 获取进程的访问令牌的句柄(OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)来打获得任意进程的句柄.并且指定了所有的访问权),得到hToken。

(2) 使用LookupPrivilegeValue 函数取得描述特定特权级的LUID(本地唯一标识)。

(3) 使用AdjustTokenPrivilege调整访问令牌特技级别。

(4) 关闭进程访问令牌句柄。

  OpenProcessToken
  要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被使能(Enabled)的,所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken,

LookupPrivilegevalue,

AdjustTokenPrivileges。

我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下: 
  BOOL OpenProcessToken( 
  __in HANDLE ProcessHandle, //要修改访问权限的进程句柄(GetCurrentProcess())
  __in DWORD DesiredAccess, //指定你要进行的操作类型 
  __out PHANDLE TokenHandle //返回的访问令牌指针 
  ); 
 

接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。AdjustTokenPrivileges的原型如下: 
  BOOL AdjustTokenPrivileges( 
  HANDLE TokenHandle, // 访问令牌的句柄

  BOOL DisableAllPrivileges, // 决定是进行权限修改还是除能(Disable)所有权限

       PTOKEN_PRIVILEGES NewState, // 修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作  

      DWORD BufferLength, // 结构PreviousState的长度,如果PreviousState为空,该参数应为NULL  

       PTOKEN_PRIVILEGES PreviousState, // TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空

  PDWORD ReturnLength // 实际PreviousState结构返回的大小

  );  

在使用这个函数前再看一下TOKEN_PRIVILEGES这个结构,其声明如下: 
  typedef struct _TOKEN_PRIVILEGES { 
  DWORD PrivilegeCount; // 数组元素的个数
  LUID_AND_ATTRIBUTES Privileges[]; //LUID_AND_ATTRIBUTES类型的数组
  } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 
 

LUID_AND_ATTRIBUTES这个结构的内容,声明如下: 
  typedef struct _LUID_AND_ATTRIBUTES { 
  LUID Luid; //权限的类型,是一个LUID的值(locally unique identifier)
  DWORD Attributes; //操作类型
  } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES 
  

操作类型,有三个可选项:

SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、SE_PRIVILEGE_USED_FOR_ACCESS。

我们要怎么样才能知道一个权限对应的LUID值是多少呢?这就要用到另外一个API函数LookupPrivilegevalue,其原形如下: 
  BOOL LookupPrivilegevalue( 
  LPCTSTR lpSystemName, // 系统的名称(本地系统只要指明为NULL)

  LPCTSTR lpName, // 权限的名称(SeDebugPrivilege)

  PLUID lpLuid // LUID的指针

  ); 
在Winnt.h中还定义了一些权限名称的宏,如: 
  #define SE_BACKUP_NAME TEXT("SeBackupPrivilege") 
  #define SE_RESTORE_NAME TEXT("SeRestorePrivilege") 
  #define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege") 
  #define SE_DEBUG_NAME TEXT("SeDebugPrivilege")


 例子:

TOKEN_PRIVILEGES     TP;

HANDLE    hToken;

LUID     luid;

if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))

{

        printf("OpenProcessToken error:%u\n", GetLastError());

        return     FALSE;

}     

if(!( LookupPrivilegeValue(NULL, lpszPrivilege, &luid)))

{

        printf("LookupPrivilege error: %u\n", GetLastError());

        return FASLE;

}

TP.PrivilegeCount = 1;

TP.Proivileges[0]   = luid;

if( bEnalePrivilege )

{

         TP.Privilege[0].Attributes = SE_PRIVILEGE_ENABLEED;

}

else

{

        TP.Privilege[0].Attributes = 0;

}

if( !AdjustTokenPrivilege(hToken, FALSE, &TP, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGEES)NULL, (PDWORD)NULL))

{

         printf("AdjustTokenPrivilege error:%u\n", GetLastError());

         return FALSE;

}

if( GetLastError()  ==  ERROR_NOT_ALL_ASSIGNED)

{

         printf("The token does not havespecified Privilege:%u\n");

         return FASLE;

}

这篇关于修改window进程访问权限的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087781

相关文章

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用   判断员工是否有权限访问,首先得知道现在操作的人是谁,所以必须先实现登录功能 2 登录流程   ① 提供登录页面,可输入用户名与密码信息,并添加执行登录的按钮。(登录页面不能被拦截)   ② 给按钮绑定点击事件(异步操作,POST请求)   ③ 事件中发送登录请求,使用 AJAX 方式提交。(使用 AJAX 原因:用户体验更好,既可保留用户刚输入的用户名和密码

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

开启青龙 Ninja 扫码功能失效后修改成手动填写CK功能【修正Ninja拉库地址】

国内:进入容器docker exec -it qinglong bash #获取ninjagit clone -b main https://ghproxy.com/https://github.com/wjx0428/ninja.git /ql/ninja#安装cd /ql/ninja/backend && pnpm install cp .env.example .env

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

局域网内vue2 配置本地IP地址访问项目

在日常开发中同事可能需要访问你的前端项目,可以通过配置实现通过ip访问 一.首先找到config文件夹目录下的 index.js文件             将此处的host的值修改为0.0.0.0(即 host: 0.0.0.0) // Various Dev Server settings//host: 'localhost' //将localhost进行替换成 0.0.0.0host:

C# 命名管道中客户端访问服务器时,出现“对路径的访问被拒绝”

先还原一下我出现错误的情景:我用C#控制台写了一个命名管道服务器,然后用ASP.NET写了一个客户端访问服务器,运行之后出现了下面的错误: 原因:服务器端的访问权限不够,所以是服务器端的问题,需要增加访问权限。(网上很多都说是文件夹的权限不够,情况不同,不适用于我这种情况) 解决办法: (1)在服务器端相应地方添加以下代码。 PipeSecurity pse = new PipeSec

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。

关于文章“python+百度语音识别+星火大模型+讯飞语音合成的语音助手”报错的修改

前言 关于我的文章:python+百度语音识别+星火大模型+讯飞语音合成的语音助手,运行不起来的问题 文章地址: https://blog.csdn.net/Phillip_xian/article/details/138195725?spm=1001.2014.3001.5501 1.报错问题 如果运行中报错,且报错位置在Xufi_Voice.py文件中的pcm_2_wav,如下图所示

文件权限修改为777,php failed to open stream: Permission denied

记录一次在谷歌云上的异常诡异的事件: 环境 centos7.5 nginx php7.0 mysql 问题: 问题一 我用相同的nginx配置,只是修改了nginx root目录。 打开/var/www/html/ 这个目录就报 2018/06/22 04:35:03 [error] 15840#0: *438 FastCGI sent in stderr: “Primary scr