打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
创建进程置新进程的父进程为指定进程 附 一个提权函数 一个进程名寻进程ID函数
分类: C++新手自学成长 2010-12-16 00:02 586人阅读 评论(0) 收藏 举报
  1. #include <cstdio>  
  2. #include <Windows.h>  
  3. #include <atlbase.h>  
  4. #include <Tlhelp32.h>  
  5.   
  6. BOOL EnablePrivilege( LPCTSTR name )  
  7. {//提升进程权限  
  8.     BOOL    bRet=FALSE;  
  9.     //获得指定的权限值  
  10.     TOKEN_PRIVILEGES priv = { 1, { 0, 0, SE_PRIVILEGE_ENABLED } };  
  11.     BOOL bLookup = LookupPrivilegeValue( NULL, name, &priv.Privileges[0].Luid );  
  12.     if( !bLookup )  
  13.     {  
  14.         //OutLog("查找指定权限值失败");  
  15.         return bRet;  
  16.     }  
  17.     //打开进程的访问标记  
  18.     HANDLE hToken = NULL;  
  19.     BOOL bOpenToken = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken );  
  20.     if( !bOpenToken )  
  21.     {  
  22.         //OutLog("打开进程的访问标记失败");  
  23.         return bRet;  
  24.     }  
  25.   
  26.     //调整权限  
  27.     BOOL bAdjustpriv = AdjustTokenPrivileges( hToken, false, &priv, sizeof( priv ), 0, 0 );  
  28.     if( !bAdjustpriv )  
  29.     {  
  30.         //OutLog("调整权限失败");  
  31.         CloseHandle( hToken );  
  32.         return bRet;  
  33.     }  
  34.     CloseHandle( hToken );  
  35.   
  36.     return TRUE;  
  37. }  
  38.   
  39. DWORD FindProcessIDByProcessName(LPCTSTR lpszProcessName)//根据进程名寻找进程ID  
  40. {  
  41.     HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );  
  42.     if( hSnapshot == NULL )  
  43.     {  
  44.         return 0;  
  45.     }  
  46.     int nStrLen=lstrlen(lpszProcessName);  
  47.   
  48.     PROCESSENTRY32 stProcessEntry32 = {0};  
  49.     stProcessEntry32.dwSize = sizeof(PROCESSENTRY32);  
  50.     Process32First( hSnapshot, &stProcessEntry32 );  
  51.     BOOL bFind = FALSE;  
  52.     do  
  53.     {  
  54.         if(lstrcmp( stProcessEntry32.szExeFile,lpszProcessName) == 0 )  
  55.         {  
  56.             bFind = TRUE;  
  57.             break;  
  58.         }  
  59.     }while( Process32Next( hSnapshot, &stProcessEntry32 ) );  
  60.     CloseHandle( hSnapshot );  
  61.     if (bFind)  
  62.     {  
  63.         return stProcessEntry32.th32ProcessID;  
  64.     }  
  65.     return 0;  
  66. }  
  67.   
  68. int main()  
  69. {  
  70.     EnablePrivilege(SE_SECURITY_NAME);//提权  
  71.     PROCESS_INFORMATION pi={0};  
  72.     STARTUPINFOEX si={sizeof(STARTUPINFOEX)};  
  73.     SIZE_T    cbAListSize=0;  
  74.     InitializeProcThreadAttributeList(NULL,1,0,&cbAListSize);  
  75.     PPROC_THREAD_ATTRIBUTE_LIST pAList=(PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(),0,cbAListSize);  
  76.     InitializeProcThreadAttributeList(pAList,1,0,&cbAListSize);  
  77.     HANDLE hParent=OpenProcess(PROCESS_ALL_ACCESS,FALSE,  
  78.         FindProcessIDByProcessName(TEXT("explorer.exe")));//要置为父进程的句柄  
  79.     UpdateProcThreadAttribute(pAList,0,PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,&hParent,sizeof(HANDLE),NULL,NULL);  
  80.     si.lpAttributeList=pAList;  
  81.     TCHAR szProcess[]=TEXT("notepad.exe");  
  82.     CreateProcess(NULL,szProcess,NULL,NULL,FALSE,EXTENDED_STARTUPINFO_PRESENT,NULL,NULL,&si.StartupInfo,&pi);  
  83.   
  84.     DeleteProcThreadAttributeList(pAList);  
  85.     HeapFree(GetProcessHeap(),0,pAList);  
  86.     system("pause");  
  87.     return 0;  
  88. }  
  89. //置新进程的父进程为指定进程 仅支持 vista win2008 及以上版本  


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
fork()创建新进程
2007年Google笔试题
Exit()函数
对进程的创建函数fork()的深入理解
什么是进程调度?linux中进程调度分为哪几种?
AllocConsole 为调用进程分配一个新的控制台
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服