修改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

相关文章

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.