基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换
進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ);是一個(gè)正在執(zhí)行的程序;計(jì)算機(jī)中正在運(yùn)行的程序?qū)嵗?#xff1b;可以分配給處理器并由處理器執(zhí)行的一個(gè)實(shí)體;
由單一順序的執(zhí)行顯示,一個(gè)當(dāng)前狀態(tài)和一組相關(guān)的系統(tǒng)資源所描述的活動(dòng)單元。
對(duì)應(yīng)用程序來(lái)說(shuō),進(jìn)程就像一個(gè)大容器。在應(yīng)用程序被運(yùn)行后,就相當(dāng)于將應(yīng)用程序裝進(jìn)容器里了,
你可以往容器里加其他東西(如:應(yīng)用程序在運(yùn)行時(shí)所需的變量數(shù)據(jù)、需要引用的DLL文件等),當(dāng)應(yīng)用程序被運(yùn)行兩次時(shí),容器里的東西并不會(huì)被倒掉,
系統(tǒng)會(huì)找一個(gè)新的進(jìn)程容器來(lái)容納它。
動(dòng)態(tài)性:進(jìn)程的實(shí)質(zhì)是程序在多道程序系統(tǒng)中的一次執(zhí)行過(guò)程,進(jìn)程是動(dòng)態(tài)產(chǎn)生,動(dòng)態(tài)消亡的。
并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行
獨(dú)立性:進(jìn)程是一個(gè)能獨(dú)立運(yùn)行的基本單位,同時(shí)也是系統(tǒng)分配資源和調(diào)度的獨(dú)立單位;
異步性:由于進(jìn)程間的相互制約,使進(jìn)程具有執(zhí)行的間斷性,即進(jìn)程按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)
結(jié)構(gòu)特征:進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊三部分組成。 多個(gè)不同的進(jìn)程可以包含相同的程序:一個(gè)程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進(jìn)程,能得到不同的結(jié)果;但是執(zhí)行過(guò)程中,程序不能發(fā)生改變
一般Windows有若干個(gè)用戶(hù),有的是Administator,有的是自定義的,進(jìn)程都有用戶(hù)創(chuàng)建的標(biāo)識(shí),我們?nèi)绾螌⒁粋€(gè)由自己的用戶(hù)例如yincheng創(chuàng)建的進(jìn)程,改成Administator的進(jìn)程,以便獲得更高的權(quán)限呢,
請(qǐng)見(jiàn)代碼注釋與講解
?
?
?
#include "stdafx.h" #include "windows.h" #include <process.h> #include <Tlhelp32.h> #include <psapi.h>#include <tlhelp32.h> #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進(jìn)程的PIDprintf("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用戶(hù)身份執(zhí)行程序,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; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/new0801/archive/2012/01/23/6177783.html
總結(jié)
以上是生活随笔為你收集整理的基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用HOOK禁用鼠标与键盘点击
- 下一篇: VCL组件之TLabel、TStatic