当前位置:编程学习 > 网站相关 >>

创建高权限进程的方法

写这个初衷是为了让 Windows 任务管理器可以结束掉一些服务和僵死进程,用 pslist/pskill 之类工具无法获得象任务管理器那样丰富的信息,还得来回切换,麻烦的很。最初想写个驱动监视任务管理器运行,使用 SYSTEM 进程 TOKEN 替换来达到目的。

后来觉得通用性不好,就改用了这种方法。此方法还可使Regedit查看、编辑 SAM 等注册表键,何乐而不为。

 

 

 

 

// wssrun taskmgr.exe
// wssrun regedit.exe
//


#include
#include
#include
#include
#include
#include
#include

#pragma comment(lib,"Shlwapi.lib")


/////////////////////////////////////////////////////////////////
// 函数类型 :自定义工具函数
// 函数模块 :
////////////////////////////////////////////////////////////////
// 功能 :提升当前进程权限
// 注意 :
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2006.2.09
/////////////////////////////////////////////////////////////////
// 重   大   修   改   历   史
////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////

BOOL
EnableDebugPriv( LPCTSTR szPrivilege )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if ( !OpenProcessToken( GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
                &hToken ) )
{
  return FALSE;
}
if ( !LookupPrivilegeValue( NULL, szPrivilege, &sedebugnameValue ) )
{
  CloseHandle( hToken );
  return FALSE;
}

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
{
  CloseHandle( hToken );
  return FALSE;
}

return TRUE;
}

/////////////////////////////////////////////////////////////////
// 函数类型 :自定义工具函数
// 函数模块 :
////////////////////////////////////////////////////////////////
// 功能 :通过指定进程名得到其进程 ID
// 注意 :
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2006.2.09
/////////////////////////////////////////////////////////////////
// 重   大   修   改   历   史
////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////

DWORD
GetProcessId( LPCTSTR szProcName )
{
PROCESSENTRY32 pe;  
DWORD dwPid;
DWORD dwRet;
BOOL bFound = FALSE;

//
// 通过 TOOHLP32 函数枚举进程
//

HANDLE hSP = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if ( hSP )
{
  pe.dwSize = sizeof( pe );

  for ( dwRet = Process32First( hSP, &pe );
      dwRet;
      dwRet = Process32Next( hSP, &pe ) )
  {
    //
    // 使用 StrCmpNI 比较字符传,可忽略大小写
    //
    if ( StrCmpNI( szProcName, pe.szExeFile, strlen( szProcName ) ) == 0 )
    {
    dwPid = pe.th32ProcessID;
    bFound = TRUE;
    break;
    }
  }

  CloseHandle( hSP );

  if ( bFound == TRUE )
  {
    return dwPid;
  }
}

return NULL;
}

/////////////////////////////////////////////////////////////////
// 函数类型 :自定义工具函数
// 函数模块 :
////////////////////////////////////////////////////////////////
// 功能 : 创建具有高权限的进程
// 注意 :
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2006.2.09
/////////////////////////////////////////////////////////////////
// 重   大   修   改   历   史
////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////

BOOL
CreateSystemProcess( LPTSTR szProcessName )
{
HANDLE hProcess;
HANDLE hToken, hNewToken;
DWORD dwPid;

PACL pOldDAcl = NULL;
PACL pNewDAcl = NULL;
BOOL bDAcl;
BOOL bDefDAcl;
DWORD dwRet;

PACL pSacl = NULL;
PSID pSidOwner = NULL;
PSID pSidPrimary = NULL;
DWORD dwAclSize = 0;
DWORD dwSaclSize = 0;
DWORD dwSidOwnLen = 0;
DWORD dwSidPrimLen = 0;

DWORD dwSDLen;
EXPLICIT_ACCESS ea;
PSECURITY_DESCRIPTOR pOrigSd = NULL;
PSECURITY_DESCRIPTOR pNewSd = NULL;

STARTUPINFO si;
PROCESS_INFORMATION pi;

BOOL bError;

if ( !EnableDebugPriv( "SeDebugPrivilege" ) )
{
  printf( "EnableDebugPriv() to failed! " );

  bError = TRUE;
  goto Cleanup;
}

//
// 选择 WINLOGON 进程
//
if ( ( dwPid = GetProcessId( "WINLOGON.EXE" ) ) == NULL )
{
  printf( "GetProcessId() to failed! " );  

  bError = TRUE;
  goto Cleanup;
}

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPid );
if ( hProcess == NULL )
{
  printf( "OpenProcess() = %d ", GetLastError() );  

  bError = TRUE;
  goto Cleanup;
}

if ( !OpenProcessToken( hProcess, READ_CONTROL | WRITE_DAC, &hToken ) )
{
  printf( "OpenProcessToken() = %d ", GetLastError() );

  bError = TRUE;
  goto Cleanup;
}

//
// 设置 ACE 具有所有访问权限
//
ZeroMemory( &ea, sizeof( EXPLICIT_ACCESS ) );
BuildExplicitAccessWithName( &ea,
                    "Everyone",
                    TOKEN_ALL_ACCESS,
                    GRANT_ACCESS,
                    0 );

if ( !GetKernelObjectSecurity( hToken,
                      DACL_SECURITY_INFORMATION,
                      pOrigSd,
                      0,
                      &dwSDLen ) )
{
  //
  // 第一次调用给出的参数肯定返回这个错误,这样做的目的是
  // 为了得到原安全描述符 pOrigSd 的长度
  //
  if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
  {
    pOrigSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
 &nb

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,