#include "stdafx.h" // VOID CreateLowProcess(WCHAR wszProcessName[100]); BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName) ; BOOL RunProcess(LPCSTR lpImage) ; int main() { CHAR ch[100]="C://Windows//System32//Notepad.exe"; RunProcess(ch); } //VOID CreateLowProcess(WCHAR wszProcessName[100]) //{ // BOOL bRet; // HANDLE hToken; // HANDLE hNewToken; // // // Notepad is used as an example // //WCHAR wszProcessName[MAX_PATH] = // // L"C://Windows//System32//Notepad.exe"; // // // Low integrity SID // WCHAR wszIntegritySid[20] = L"S-1-16-4096"; // PSID pIntegritySid = NULL; // // TOKEN_MANDATORY_LABEL TIL = {0}; // PROCESS_INFORMATION ProcInfo = {0}; // STARTUPINFO StartupInfo = {0}; // ULONG ExitCode = 0; // // if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken)) // { // OutputDebugString(L"OpenProcessToken success!"); // if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, // SecurityImpersonation, TokenPrimary, &hNewToken)) // { //ImpersonateLoggedOnUser( hNewToken ); // OutputDebugString(L"DuplicateTokenEx success!"); // if (ConvertStringSidToSid(wszIntegritySid, &pIntegritySid)) // { // TIL.Label.Attributes = SE_GROUP_INTEGRITY; // TIL.Label.Sid = pIntegritySid; // // // Set the process integrity level // if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL, // sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid))) // { // OutputDebugString(L"SetTokenInformation success!"); // // Create the new process at Low integrity // bRet = CreateProcessAsUser(hNewToken, NULL, // wszProcessName, NULL, NULL, FALSE, // 0, NULL, NULL, &StartupInfo, &ProcInfo); // DWORD dw=GetLastError(); // WCHAR ch[100]; // wsprintf(ch,L"CreateProcessAsUser getlasterror =%d",dw); // OutputDebugString(ch); // if(bRet) // { // MessageBox(NULL,L"123",L"123",MB_OK); // } // else // { // MessageBox(NULL,L"222",L"123",MB_OK); // } // } // // LocalFree(pIntegritySid); // } // CloseHandle(hNewToken); // } // CloseHandle(hToken); // } // //} // // BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName) { if(!lpName) { return FALSE; } HANDLE hProcessSnap = NULL; BOOL bRet = FALSE; PROCESSENTRY32 pe32 = {0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return (FALSE); pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { do { if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName))) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,pe32.th32ProcessID); bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken); CloseHandle (hProcessSnap); return (bRet); } } while (Process32Next(hProcessSnap, &pe32)); bRet = TRUE; OutputDebugString("GetToken success!"); } else bRet = FALSE; OutputDebugString("GetToken fail!"); CloseHandle (hProcessSnap); return (bRet); } BOOL RunProcess(LPCSTR lpImage) { if(!lpImage) { return FALSE; } HANDLE hToken; if(!GetTokenByName(hToken,"EXPLORER.EXE")) { OutputDebugString("GetTokenByName fail"); return FALSE; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb= sizeof(STARTUPINFO); si.lpDesktop = TEXT("winsta0//default"); BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL, FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); CloseHandle(hToken); if(bResult) { OutputDebugString("CreateProcessAsUser ok!/r/n"); getchar(); } else { OutputDebugString("CreateProcessAsUser false!/r/n"); } return bResult; }