看流星社区

 找回密码
 注册账号
查看: 2947|回复: 0

创建进程置新进程的父进程为指定进程 附 一个提权函数 一个进程名寻进程ID函数

[复制链接]

该用户从未签到

发表于 2011-3-26 10:40:59 | 显示全部楼层 |阅读模式

  1. #include <cstdio>
  2. #include <Windows.h>
  3. #include <atlbase.h>
  4. #include <Tlhelp32.h>

  5. BOOL EnablePrivilege( LPCTSTR name )
  6. {//提升进程权限
  7.     BOOL    bRet=FALSE;
  8.     //获得指定的权限值
  9.     TOKEN_PRIVILEGES priv = { 1, { 0, 0, SE_PRIVILEGE_ENABLED } };
  10.     BOOL bLookup = LookupPrivilegeValue( NULL, name, &priv.Privileges[0].Luid );
  11.     if( !bLookup )
  12.     {
  13.         //OutLog("查找指定权限值失败");
  14.         return bRet;
  15.     }
  16.     //打开进程的访问标记
  17.     HANDLE hToken = NULL;
  18.     BOOL bOpenToken = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken );
  19.     if( !bOpenToken )
  20.     {
  21.         //OutLog("打开进程的访问标记失败");
  22.         return bRet;
  23.     }

  24.     //调整权限
  25.     BOOL bAdjustpriv = AdjustTokenPrivileges( hToken, false, &priv, sizeof( priv ), 0, 0 );
  26.     if( !bAdjustpriv )
  27.     {
  28.         //OutLog("调整权限失败");
  29.         CloseHandle( hToken );
  30.         return bRet;
  31.     }
  32.     CloseHandle( hToken );

  33.     return TRUE;
  34. }

  35. DWORD FindProcessIDByProcessName(LPCTSTR lpszProcessName)//根据进程名寻找进程ID
  36. {
  37.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  38.     if( hSnapshot == NULL )
  39.     {
  40.         return 0;
  41.     }
  42.     int nStrLen=lstrlen(lpszProcessName);
  43.     const char *szFind=NULL;
  44. #ifdef _UNICODE
  45.     char szCopy[128];
  46.     WideCharToMultiByte(CP_ACP,NULL,lpszProcessName,-1,szCopy,sizeof(szCopy),NULL,NULL);
  47.     szFind=szCopy;
  48. #else
  49.     szFind=lpszProcessName;
  50. #endif

  51.     PROCESSENTRY32 stProcessEntry32 = {0};
  52.     stProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
  53.     Process32First( hSnapshot, &stProcessEntry32 );
  54.     BOOL bFind = FALSE;
  55.     do
  56.     {
  57.         if(lstrcmpA( stProcessEntry32.szExeFile,szFind) == 0 )
  58.         {
  59.             bFind = TRUE;
  60.             break;
  61.         }
  62.     }while( Process32Next( hSnapshot, &stProcessEntry32 ) );
  63.     CloseHandle( hSnapshot );
  64.     if (bFind)
  65.     {
  66.         return stProcessEntry32.th32ProcessID;
  67.     }
  68.     return 0;
  69. }

  70. int main()
  71. {
  72.     EnablePrivilege(SE_SECURITY_NAME);//提权
  73.     PROCESS_INFORMATION pi={0};
  74.     STARTUPINFOEX si={sizeof(STARTUPINFOEX)};
  75.     SIZE_T    cbAListSize=0;

  76.     InitializeProcThreadAttributeList(NULL,1,0,&cbAListSize);
  77.     PPROC_THREAD_ATTRIBUTE_LIST pAList=(PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(),0,cbAListSize);
  78.     InitializeProcThreadAttributeList(pAList,1,0,&cbAListSize);
  79.     HANDLE hParent=OpenProcess(PROCESS_ALL_ACCESS,FALSE,
  80.             FindProcessIDByProcessName(TEXT("explorer.exe")));//要置为父进程的句柄
  81.     UpdateProcThreadAttribute(pAList,0,PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,&hParent,sizeof(HANDLE),NULL,NULL);
  82.     si.lpAttributeList=pAList;

  83.     CreateProcess(NULL,TEXT("notepad.exe"),NULL,NULL,FALSE,EXTENDED_STARTUPINFO_PRESENT,NULL,NULL,&si.StartupInfo,&pi);

  84.     DeleteProcThreadAttributeList(pAList);
  85.     HeapFree(GetProcessHeap(),0,pAList);
  86.     system("pause");
  87.     return 0;
  88. }
  89. //置新进程的父进程为指定进程 仅支持 vista win2008 及以上版本


复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-5 03:13

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表