博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换
阅读量:5278 次
发布时间:2019-06-14

本文共 2959 字,大约阅读时间需要 9 分钟。

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;

由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。

对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,

你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,

系统会找一个新的进程容器来容纳它。

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。  

 并发性:任何进程都可以同其他进程一起并发执行  

 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;   

异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进  

 结构特征:进程由程序、数据和进程控制块三部分组成。   多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变

一般Windows有若干个用户,有的是Administator,有的是自定义的,进程都有用户创建的标识,我们如何将一个由自己的用户例如yincheng创建的进程,改成Administator的进程,以便获得更高的权限呢,

请见代码注释与讲解

 

 

 

#include "stdafx.h"#include "windows.h"#include 
#include
#include
#include
#pragma comment (lib,"psapi")BOOL EnableDebugPriv(){ HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) { return FALSE; } if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &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 ) ) { return FALSE; } CloseHandle( hToken ); return TRUE;}HANDLE GetProcessHandle(LPSTR szExeName) { PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) }; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); if(Process32First(hSnapshot, &Pc)){ do{ if(!stricmp(Pc.szExeFile, szExeName)) { //返回explorer.exe进程的PID printf("explorer's PID=%d\n",Pc.th32ProcessID); return OpenProcess(PROCESS_ALL_ACCESS, TRUE, Pc.th32ProcessID); } }while(Process32Next(hSnapshot, &Pc)); } return NULL; }int impuser(TCHAR cmdline[256]){ HANDLE hToken; HANDLE hExp = GetProcessHandle("calc.EXE"); if(hExp == NULL) return FALSE; OpenProcessToken(hExp,TOKEN_ALL_ACCESS,&hToken); if(hToken == NULL) return FALSE; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.lpDesktop = "winsta0\\default"; si.wShowWindow = SW_SHOW; si.dwFlags=STARTF_USESHOWWINDOW; TCHAR szParameter[256] = "/c "; lstrcat(szParameter,cmdline); printf("szParameter=%s\n",szParameter); char path[MAX_PATH]; GetSystemWindowsDirectory(path,MAX_PATH); lstrcat(path,"\\system32\\cmd.exe"); if(CreateProcessAsUser(hToken,(char *)path,szParameter,NULL, NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,&pi)) //以administrator用户身份执行程序,CREATE_NO_WINDOW,CREATE_NEW_CONSOLE,CREATE_DEFAULT_ERROR_MODE { printf("CreateProcessAsUser sucessed!%d\n",GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } return 0;}int main() { impuser("regedit"); return 0;}

 

转载于:https://www.cnblogs.com/new0801/archive/2012/01/23/6177783.html

你可能感兴趣的文章
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>
rotate the clock
查看>>
bugku 变量
查看>>
数据库01 /Mysql初识以及基本命令操作
查看>>
数据库02 /MySQL基础数据类型以及多表之间建立联系
查看>>
Python并发编程04/多线程
查看>>
CF461B Appleman and Tree
查看>>
CF219D Choosing Capital for Treeland
查看>>
杂七杂八的小笔记本
查看>>
51Nod1353 树
查看>>
CF1215E Marbles
查看>>
BZOJ2339 HNOI2011卡农(动态规划+组合数学)
查看>>
octave基本操作
查看>>