您的位置:首页 > 理论基础 > 计算机网络

openprocess 提升权限结束进程(来自网络)

2010-07-10 09:38 399 查看
1、进程相当于系统提供的一个平台,它可以包括一个或多个线程,如IE是个进程,

  打开多个网页是它的多个线程,把IE进程Kill掉即可关闭多个打开网页的线程。

  2、98和NT不一样。98下可以用CreateToolhelp32Snapshot函数Process32First和

  Process32Next来枚举当前所有进程的进程ID(先调用函数CreateToolhelp32Snapshot)

  NT下用EnumProcesses函数来枚举。2000是支持CreateToolhelp32Snapshot函数的。

  得到进程ID后就可以用OpenProcess函数得到句柄了,在NT和2000下要通过安全检测。

  3、EnumProcess 也可以得到系统中的进程列表

  杀掉本地进程其实很简单,取得进程ID后,调用OpenProcess函数打开进程句柄,然

  后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,

  例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。

  提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用

  OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你

  想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限

  就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。

  1.OpenProcessToken

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

  BOOL OpenProcessToken(

  HANDLE ProcessHandle, //要修改访问权限的进程句柄

  DWORD DesiredAccess, //指定你要进行的操作类型

  PHANDLE TokenHandle //返回的访问令牌指针

  );

  成功返回非0;

  参数说明:

  第一参数是要修改访问权限的进程句柄;

  第三个参数就是返回的访问令牌指针;

  第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考Platform SDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。

  包含头文件Winbase.h

  2.LookupPrivilegeValue

  获取当前系统上,指定权限名字的唯一标志(LUID),函数原形如下:

  BOOL LookupPrivilegeValue(

  LPCTSTR lpSystemName,

  LPCTSTR lpName,

  PLUID lpLuid

  );

  成功返回非0;

  参数说明:

  lpSystemName

  [in]传入参数,字符传指针;指定需要获取权限的操作系统名字,如果传入null,那么将在本地系统上查询指定权限名的LUID;

  lpName

  [in]传入参数,字符串指针;指定需要查询LUID的权限名字,可以系统中定义了的权限产量(如SE_SECURITY_NAME),也可以是一个自己定义的字符串(如"SeSecurityPrivilege");

  lpLuid

  [out]传出参数,字符串指针; 传出权限名字指定的LUID;

  包含头文件Winbase.h

  3.AdjustTokenPrivileges

  根据指定的权限令牌,置进程的权限为可用或不可用;

  函数原型:

  BOOL AdjustTokenPrivileges(

  HANDLE TokenHandle,

  BOOL DisableAllPrivileges,

  PTOKEN_PRIVILEGES NewState,

  DWORD BufferLength,

  PTOKEN_PRIVILEGES PreviousState,

  PDWORD ReturnLength

  );

  参数说明:

  TokenHandle

  [in]包含需要修改权限的令牌句柄.这个参速需要有TOKEN_ADJUST_PRIVILEGES权限.如果参数PreviousState=NULL,那么句柄已应该拥有TOKEN_QUERY权限.

  DisableAllPrivileges

  [in]是否置所有的权限为不可用状态.如果值=TRUE,使所有的权限不可用,并且忽略NewState参数.如果为FALSE,那么该函数将修改这些权限为NewState参数所指的状态.

  NewState

  [in]指向一个描述权限属性的TOKEN_PRIVILEGES结构数组.如果DisableAllPrivileges=FALSE,那么AdjustTokenPrivileges将使数组中指向的属性为可用,不可用状态或者删除.

  系统中定义的三个常量SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_ENABLED,SE_PRIVI LEGE_REMOVED.

  Windows XP/2000/NT中,不能删除权限

  BufferLength

  [in] 以字节为单位指定了PreviousState所指缓冲buffer的长度,如果PreviousState参数为NULL,那么BufferLength可以被置为0.

  PreviousState

  [out] 传输AdjustTokenPrivileges参作将修改的属性的修改前状态,可以被置为NULL;

  ReturnLength

  [out] 返回PreviousState请求字节长度,如果PreviousState=NULL,这个参数可以为NULL;

包含头文件Winbase.h

  4.OpenProcessToken ,LookupPrivilegeValue,AdjustTokenPrivileges引用举例

  BOOL EnableDebugPrivilege(BOOL fEnable) {

  BOOL fOk = FALSE; // Assume function fails

  HANDLE hToken;

  //以修改选项,获取当前进程的令牌环

  if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))

  {

  TOKEN_PRIVILEGES tp;

  tp.PrivilegeCount = 1;

  //获取debug权限的luid

  LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);

  //将权限属性置为可用

  tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;

  //修改权限

  AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

  fOk = (GetLastError() == ERROR_SUCCESS);

  CloseHandle(hToken);

  }

  return(fOk);

  }

  //结束进程

  #include<windows.h>

  #include<process.h>

  #include<string.h>

  #include<Tlhelp32.h>

  DWORD GetProcessIdFromName(char * name)

  {

  PROCESSENTRY32 pe;

  DWORD id = 0;

  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

  pe.dwSize = sizeof(PROCESSENTRY32);

  if( !Process32First(hSnapshot,&pe)) return 0;

  do

  {

  pe.dwSize = sizeof(PROCESSENTRY32);

  if( Process32Next(hSnapshot,&pe)==FALSE ) break;

  if(strcmp(pe.szExeFile,name) == 0)

  {

  id = pe.th32ProcessID;

  break;

  }

  } while(TRUE);

  CloseHandle(hSnapshot);

  return id;

  }

  int WINAPI WinMain( HINSTANCE hInstance,

  HINSTANCE hPrevInstance,

  LPSTR lpCmdLine,

  int nCmdShow)

  {

  ////////////////////////////////////////////////// //////////////////// 提升权限为SE_DEBUG_NAME

  HANDLE hToken;

  if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))

  {

  LUID luid;

  if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))

  {

  TOKEN_PRIVILEGES TokenPrivileges;

  TokenPrivileges.PrivilegeCount = 1;

  TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  TokenPrivileges.Privileges[0].Luid = luid;

  AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);

  }

  CloseHandle(hToken);

  }

  ////////////////////////////////////////////////// /////////////////////

  DWORD pid=GetProcessIdFromName("WINLOGON.EXE"); //结束WINLOGO.EXE进程

  HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);

  TerminateProcess(hProcess, 0);

  return 0;

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: