欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
如何在Vista中不彈出UAC以本地系統賬戶(hù)啟動(dòng)程序

 本文講解如何以本地系統賬戶(hù)從會(huì )話(huà)0至會(huì )話(huà)1啟動(dòng)一個(gè)程序。

 

 

         簡(jiǎn)介

         Vista中,你可能也遇到過(guò)這樣的問(wèn)題,當想要以管理員賬戶(hù)啟動(dòng)一個(gè)exe執行某些特定任務(wù)時(shí),往往UAC權限提升對話(huà)框就出來(lái)了。為解決這個(gè)問(wèn)題,可把一個(gè)服務(wù)以本地系統賬戶(hù)權限放入到當前用戶(hù)會(huì )話(huà)中,來(lái)啟動(dòng)所需的程序,這就不需要我們響應UAC對話(huà)框了,并以盡可能最高的權限來(lái)運行程序。在某些情況中,這是必不可少的,因為某些程序需要在無(wú)用戶(hù)干預的情況下,以管理員權限相互控制與通訊,并在操作系統啟動(dòng)時(shí),在當前用戶(hù)會(huì )話(huà)中執行一些管理性的任務(wù)。

 

 

         背景

         有一個(gè)普通用戶(hù)模式的程序,其通過(guò)自定義消息與某個(gè)服務(wù)進(jìn)行通訊,當接收到自定義消息時(shí),服務(wù)將會(huì )以系統賬戶(hù)啟動(dòng)所請求的程序。這里使用了winlogon的令牌來(lái)獲取本地系統賬戶(hù),因為winlogon.exe正運行在本地系統賬戶(hù)下。(不像XP,在Vista中,服務(wù)運行在會(huì )話(huà)0中,而第一個(gè)登錄在會(huì )話(huà)1中,以此類(lèi)推)

 

 

         使用的代碼

         先來(lái)看一下CustomMessageSender.cpp這個(gè)文件,這是一個(gè)用戶(hù)模式程序,其負責與服務(wù)通訊,且沒(méi)有任務(wù)特權。

 

 

#define SERVICE_NAME _T("CustomSvc")

//為服務(wù)自定義消息,以便在會(huì )話(huà)1中啟動(dòng)相關(guān)進(jìn)程

#define SERVICE_CONTROL_CUSTOM_MESSAGE 0x0085

 

int _tmain(int argc, _TCHAR* argv[])

{

    SC_HANDLE hMyService,hSCM;

    BOOL bSuccess;

    SERVICE_STATUS status;

    hSCM = OpenSCManager(0,0,SC_MANAGER_CONNECT);

    if(!hSCM)

    {

        printf("Open SCM failed with error %u",GetLastError());

    }

    hMyService = OpenService(hSCM,SERVICE_NAME,SERVICE_USER_DEFINED_CONTROL);

    if(!hMyService)

    {

        printf("Open SCM failed with error %u",GetLastError());

    }

    bSuccess = ControlService(hMyService,SERVICE_CONTROL_CUSTOM_MESSAGE,&status);

    if(!bSuccess)

    {

        printf("Control Service failed with error %u",GetLastError());

    }

    CloseServiceHandle(hMyService);

    CloseServiceHandle(hSCM);

    return 0;

}

 

 

         代碼非常簡(jiǎn)單,使用了SERVICE_USER_DEFINED_CONTROLSC_MANAGER_CONNECT訪(fǎng)問(wèn)權限,因為任何用戶(hù)模式的程序都能連接到我們的服務(wù),并向它發(fā)送自定義消息,在這并不需要管理員權限。這個(gè)程序向服務(wù)發(fā)送SERVICE_CONTROL_CUSTOM_MESSAGE,服務(wù)收到消息并啟動(dòng)相應的程序。以下是一段簡(jiǎn)單的服務(wù)代碼:

 

 

//為服務(wù)自定義消息,以便在會(huì )話(huà)1中啟動(dòng)相關(guān)進(jìn)程

#define SERVICE_CONTROL_CUSTOM_MESSAGE 0x0085

 

//以本地系統賬戶(hù),在會(huì )話(huà)1下啟動(dòng)程序的方法

 

BOOL LaunchAppIntoDifferentSession();

.

省略...

 

void WINAPI ServiceCtrlHandler(DWORD Opcode)

{

  switch(Opcode)

  {

//////////////////////////////////////////////////////////////////////////

//從用戶(hù)程序接受到一個(gè)自定義消息

 

    case SERVICE_CONTROL_CUSTOM_MESSAGE:

        LaunchAppIntoDifferentSession();

break;

 

 

         在這段代碼中,聲明了自定義消息與方法原型,先來(lái)說(shuō)一下這個(gè)LaunchAppIntoDifferentSession方法。為達到以本地系統賬戶(hù)啟動(dòng)一個(gè)進(jìn)程的目的,需要以下步驟:

 

 

1、   WTSGetActiveConsoleSessionId,得到目前活動(dòng)的控制臺SessionID。

2、   因為需要以系統賬戶(hù)啟動(dòng)程序,所以要使用從Winlogon得到的令牌(因為Winlogon運行在系統賬戶(hù)下)。取得Winlogon進(jìn)程ID并復制令牌。

3、   CreateProcessAsUser中,用復制的Winlogon令牌以會(huì )話(huà)1啟動(dòng)相應程序。

 

 

BOOL LaunchAppIntoDifferentSession()

{

   PROCESS_INFORMATION pi;

   STARTUPINFO si;

   BOOL bResult = FALSE;

   DWORD dwSessionId,winlogonPid;

   HANDLE hUserToken,hUserTokenDup,hPToken,hProcess;

   DWORD dwCreationFlags;

 

   dwSessionId = WTSGetActiveConsoleSessionId();

 

//////////////////////////////////////////

   //查找winlogon進(jìn)程

////////////////////////////////////////

 

   PROCESSENTRY32 procEntry;

 

    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap == INVALID_HANDLE_VALUE)

    {

        return 1 ;

    }

 

    procEntry.dwSize = sizeof(PROCESSENTRY32);

 

    if (!Process32First(hSnap, &procEntry))

    {

        return 1 ;

    }

 

    do

    {

        if (_stricmp(procEntry.szExeFile, "winlogon.exe") == 0)

        {

        //找到winlogon進(jìn)程

        //確定它運行在控制臺會(huì )話(huà)中

            DWORD winlogonSessId = 0;

            if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId)

                    && winlogonSessId == dwSessionId)

            {

                winlogonPid = procEntry.th32ProcessID;

                break;

            }

        }

 

    } while (Process32Next(hSnap, &procEntry));

 

////////////////////////////////////////////////////////////////////////


WTSQueryUserToken(dwSessionId,&hUserToken);

   dwCreationFlags = NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE;

   ZeroMemory(&si, sizeof(STARTUPINFO));

   si.cb= sizeof(STARTUPINFO);

   si.lpDesktop = "winsta0\\default";

   ZeroMemory(&pi, sizeof(pi));

   TOKEN_PRIVILEGES tp;

   LUID luid;

   hProcess = OpenProcess(MAXIMUM_ALLOWED,FALSE,winlogonPid);

 

   if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY

                 |TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_SESSIONID

                          |TOKEN_READ|TOKEN_WRITE,&hPToken))

   {

               int abcd = GetLastError();

               printf("Process token open Error: %u\n",GetLastError());

   }

 

   if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid))

   {

       printf("Lookup Privilege value Error: %u\n",GetLastError());

   }

   tp.PrivilegeCount =1;

   tp.Privileges[0].Luid =luid;

   tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;

 

   DuplicateTokenEx(hPToken,MAXIMUM_ALLOWED,NULL,

            SecurityIdentification,TokenPrimary,&hUserTokenDup);

   int dup = GetLastError();

 

   //調整令牌權限

   SetTokenInformation(hUserTokenDup,

        TokenSessionId,(void*)dwSessionId,sizeof(DWORD));

 

   if (!AdjustTokenPrivileges(hUserTokenDup,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),

                        (PTOKEN_PRIVILEGES)NULL,NULL))

   {

       int abc =GetLastError();

       printf("Adjust Privilege value Error: %u\n",GetLastError());

   }

 

   if (GetLastError()== ERROR_NOT_ALL_ASSIGNED)

   {

     printf("Token does not have the provilege\n");

   }

 

   LPVOID pEnv =NULL;

 

   if(CreateEnvironmentBlock(&pEnv,hUserTokenDup,TRUE))

   {

       dwCreationFlags|=CREATE_UNICODE_ENVIRONMENT;

   }

   else

      pEnv=NULL;

 

//在用戶(hù)登錄的會(huì )話(huà)中啟動(dòng)進(jìn)程

 

  bResult = CreateProcessAsUser(

      hUserTokenDup,                  //用戶(hù)的訪(fǎng)問(wèn)令牌

      _T("C:\\SessionLauncher\\a.exe"),   //要執行的文件

      NULL,                          //命令行

      NULL,                          //進(jìn)程指針SECURITY_ATTRIBUTES

      NULL,                          //線(xiàn)程指針SECURITY_ATTRIBUTES

      FALSE,                         //句柄不可繼承

      dwCreationFlags,                //創(chuàng )建標志

      pEnv,                          //指向新環(huán)境塊的指針

      NULL,                         //當前目錄名

      &si,                           //指向STARTUPINFO結構的指針

      &pi                           //新進(jìn)程的相關(guān)信息

   );

 

   int iResultOfCreateProcessAsUser = GetLastError();//此處結果應為0

 

//關(guān)閉所有句柄

 

  CloseHandle(hProcess);

  CloseHandle(hUserToken);

  CloseHandle(hUserTokenDup);

  CloseHandle(hPToken);

 

 return 0;

}

 

 

         這樣一來(lái),普通用戶(hù)模式的程序就能向服務(wù)發(fā)送一自定義消息,以在本地系統賬戶(hù)下啟動(dòng)自身,而無(wú)須彈出UAC對話(huà)框。

 

         可能你要問(wèn)了:怎樣用GetUserName() API來(lái)返回當前已登錄用戶(hù)、怎樣在系統賬戶(hù)下訪(fǎng)問(wèn)HKCU。事實(shí)上,當我們啟動(dòng)一個(gè)需要提升權限的進(jìn)程時(shí),不可能從用戶(hù)角度繞過(guò)UAC對話(huà)框,因為微軟就是這樣設計的。盡管寫(xiě)一些內核模式代碼可能會(huì )達到此目的,但最好還是模仿系統賬戶(hù)來(lái)訪(fǎng)問(wèn)HKCU。在此使用了Explorer進(jìn)程,因為它運行在用戶(hù)賬戶(hù)中。

         模仿用戶(hù)令牌會(huì )導致當前工作者線(xiàn)程運行于用戶(hù)上下文中。請注意,如果你使用CreateProcess(),它仍會(huì )在系統賬戶(hù)下生成進(jìn)程,因為我們總的進(jìn)程仍是運行在本地系統賬戶(hù)之下。

         以下便是大致的代碼,這段代碼需要寫(xiě)進(jìn)由服務(wù)啟動(dòng)的程序中:

 

 

DWORD dwSessionId,dwExplorerLogonPid,dwSize,dwRegDataSize;

HANDLE hProcess,hPToken;

char szUserName[MAX_PATH];

char szRegData[MAX_PATH];

char szRegPath[500] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";

HKEY hKey; //用于注冊表鍵值的句柄

long lRegResult; //注冊表操作結果

 

//取當前活動(dòng)的桌面會(huì )話(huà)id

dwSessionId = WTSGetActiveConsoleSessionId();

 

 

//////////////////////////////////////////

   //查找explorer進(jìn)程

////////////////////////////////////////

 

   PROCESSENTRY32 procEntry;

 

    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap == INVALID_HANDLE_VALUE)

    {

        return 1 ;

    }

 

    procEntry.dwSize = sizeof(PROCESSENTRY32);

 

    if (!Process32First(hSnap, &procEntry))

    {

        return 1 ;

    }

 

    do

    {

        if (_stricmp(procEntry.szExeFile, "explorer.exe") == 0)

        {

          DWORD dwExplorerSessId = 0;

          if (ProcessIdToSessionId(procEntry.th32ProcessID, &dwExplorerSessId)

                    && dwExplorerSessId == dwSessionId)

            {

                dwExplorerLogonPid = procEntry.th32ProcessID;

                break;

            }

        }

 

    } while (Process32Next(hSnap, &procEntry));

 

////////////////////////////////////////////////////////////////////////

hProcess = OpenProcess(MAXIMUM_ALLOWED,FALSE,dwExplorerLogonPid);

 

   if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY

              |TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_SESSIONID

              |TOKEN_READ|TOKEN_WRITE,&hPToken))

   {

               int abcd = GetLastError();

               printf("Process token open Error: %u\n",GetLastError());

   }

 

 

         我們需要模仿服務(wù)令牌,以便作為用戶(hù)運行來(lái)訪(fǎng)問(wèn)注冊表,這會(huì )導致我們的工作者線(xiàn)程運行在用戶(hù)令牌上下文中。

 

 

//模仿explorer令牌,其運行于用戶(hù)賬戶(hù)下

ImpersonateLoggedOnUser(hPToken);

 

int iImpersonateResult = GetLastError();

 

if(iImpersonateResult == ERROR_SUCCESS)

{

  GetUserName(szUserName,&dwSize);

 

 //因為線(xiàn)程作為用戶(hù)運行,現在就可以訪(fǎng)問(wèn)HKCU

  dwRegDataSize = sizeof(szRegData);

  lRegResult = RegOpenKeyEx(HKEY_CURRENT_USER,

            szRegPath,0,KEY_QUERY_VALUE,&hKey);

  if (lRegResult == ERROR_SUCCESS)

     RegQueryValueEx(hKey,_T("SideBar"),NULL,NULL,

            (LPBYTE)&szRegData,&dwRegDataSize);

}

//一旦操作完成,回復到系統賬戶(hù)

RevertToSelf();

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
電腦進(jìn)程詳解
VC程序在win7系統上運行,自動(dòng)獲取管理員權限
受限token實(shí)現xp下沙箱設計的關(guān)鍵概念之DAC
密碼-自動(dòng)進(jìn)行擴展驗證(EV)代碼簽名
windows提權看這一篇就夠了
Wininet模擬登陸網(wǎng)站
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久