<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      厚積薄發(fā)
      海納百川,有容乃大
      Session

      我們平常所說的Session是指一次終端登錄, 這里的終端登錄是指要有自己的顯示器和鼠標(biāo)鍵盤等, 它包括本地登錄和遠(yuǎn)程登錄。在XP時代每次終端登錄才會創(chuàng)建一個Session,但是在Vista后所有的服務(wù)程序都運(yùn)行在Session 0, 其他終端會依次運(yùn)行在session 1, session 2...

      Logon Session

      登錄Session是指不同帳號的登錄,它包括System登錄, 網(wǎng)絡(luò)登錄及活動交互登錄等。 我們在任務(wù)管理器里可以看到各種進(jìn)程運(yùn)行在不同的帳號下,比如System, Local Service, xxx Account等, 這些帳號有不同的權(quán)限。這里要注意區(qū)分上面的終端登錄Session, 每個終端登錄Session內(nèi)有好幾個Logon Session.

      Window Station

      按MSDN的說法,一個Window Station管理一個剪貼板(Clipboard),一個原子表(Atom Table)和一組桌面(Desktop)。為什么要有Window Station這個概念? 實(shí)際上每個Window Station對應(yīng)一個Logon Session, 也就是說通過Window Station, 把不同的帳號進(jìn)行隔離,防止他們相互影響, 試想其他人在你機(jī)器上執(zhí)行一個DCOM對象,如果沒有Window Station隔離,他可以直接操作你的桌面了。一個終端登錄Session可以有多個Window Station,但只能有一個可交互的活動Window Station, 也就是Winsta0. 

      Desktop

      每個Window Station可以創(chuàng)建多個Desktop, 我們平時和3個Desktop打交道比較多(WinLogon, Disconnect, Default), 他們分別代表登錄桌面,屏保桌面和我們工作的桌面。我們也可以自己通過CreateDesktop創(chuàng)建桌面, 并通過SwitchDesktop進(jìn)行切換。


      Sid

      Sid表示Security Identifier, 它是一串唯一標(biāo)志符, 它可以表示代表一個帳號, 一個用戶組或是一次用戶登錄等, 具體可以參考這里

      Token

      Token和進(jìn)程相關(guān)聯(lián), 每個進(jìn)程創(chuàng)建時都會根據(jù)Logon Session權(quán)限由LSA(Local Security Authority)分配一個Token(如果CreaeProcess時自己指定了Token,  LSA會用該Token, 否則就用父進(jìn)程Token的一份拷貝,由大部分進(jìn)程是由Explorer.exe創(chuàng)建, 所以我們大部分時候都復(fù)制了explorer.exe的Token), 里面含有該進(jìn)程的安全信息,包括用戶帳號, 組信息, 權(quán)限信息和默認(rèn)安全描述符(Security Descriptor)等, 我們可以通過GetTokenInformation查詢某個Token的詳細(xì)情況。具體可以參考這里


      DACL和SACL

      DACL(discretionary access control list)用來標(biāo)志某個安全對象允許被哪些對象訪問。SACL(system access control list )用來記錄某個安全對象被訪問的情況。具體可以參考這里


      Security Descriptor

      每個安全對象在創(chuàng)建時都可以指定一個安全描述符(Security Descriptor), 如果沒有指定就用進(jìn)程默認(rèn)的, 該描述符指定了哪些對象可以訪問該安全對象。大部分情況下我們都是傳NULL, 也就是用該進(jìn)程Token中默認(rèn)的。具體可以參考這里

      Integrity level

      這是UAC提供的新特性, 強(qiáng)制完整性控制(Mandatory Integrity Control), 它標(biāo)志某進(jìn)程的安全性級別, 安全級別的高低很大程度和該標(biāo)志相關(guān)聯(lián)。


      下面的圖表示了Session, Window Station和Desktop的關(guān)系:


      下面的圖表示當(dāng)某程序試圖訪問某個安全對象時, 系統(tǒng)是如何檢測的:系統(tǒng)會檢測Object的DACL列表, 根據(jù)當(dāng)前進(jìn)程的Token,判斷當(dāng)前進(jìn)程(線程)是否允許訪問該Object。



      我們用Process Explorer查看某個進(jìn)程的屬性時, Security頁的信息如何理解? 



      User和SID項(xiàng)表示創(chuàng)建該進(jìn)程的用戶情況,可以通過GetTokenInformation, 將第二個參數(shù)指定成TokenInformationClass來查詢。

      Session項(xiàng)上面提到過了,表示終端登錄session ID,可以通過GetTokenInformation, 將第二個參數(shù)指定成TokenSessionId來查詢, 也可以通過 API ProcessIDToSessionID來獲取

      Logon Session表示Logon Session的authority id, 可以通過GetTokenInformation, 將第二個參數(shù)指定成TokenStatistics來查詢。系統(tǒng)登錄的Logon Session id是999(0x3E7), 這里要區(qū)分還有一個概念是Logon Session SID, 他們是不同的概念, 前者某種程度上反映了Logon Session的類型, 后則是某次登陸的標(biāo)志(SID)。

      Virtualized是Vista之后才有的概念,表示該程序是否啟用了UAC virtualization, 對于沒有指定manifest的老程序會使用數(shù)據(jù)重定向機(jī)制。可以通過GetTokenInformation的TokenVirtualizationAllowed/TokenVirtualizationEnabled來查詢。

      Group是指該用戶所在的用戶組。我們可以看到盡管我們的用戶在Administrators組里,但是上面卻顯示是Deny的,為什么?因?yàn)樵赩ista之后, UAC打開時, 除非我們顯式的Run As Admin, 否則我們的程序都默認(rèn)運(yùn)行在標(biāo)準(zhǔn)用戶權(quán)限下。同時我們注意到上面還有Mandatory label\Medium Mandatory Level項(xiàng),表示該程序運(yùn)行的完整性級別, 它包括Untrust, Low, Medium, Hight, System等, 級別越低,權(quán)限也就越低。我們可以通過GetTokenInformation的TokenIntegrityLevel來進(jìn)行查詢。

      Privilege表示該進(jìn)程的權(quán)限, 我們可以看到好多權(quán)限默認(rèn)是Disabled, 實(shí)際上我們可以通過AdjustTokenPrivileges進(jìn)行提升。 我們可以通過GetTokenInformation的TokenPrivileges進(jìn)行查詢。

      Kernel Object, User Object, GDI Object的使用范圍?

      Kernel Object可以跨進(jìn)程使用, 如果指定成Global, 還可以跨session.  XP時代即使不指定成Global, 服務(wù)程序和普通應(yīng)用程序也可以通過Kernel Object通訊,但是Vista之后就不行了, 因?yàn)樗麄冊诓煌腟ession了。
      User Object可以跨進(jìn)程使用, 但是User Object的使用范圍是Window Station, 它不能垮Window Station, 更別說跨session了。我們看不到服務(wù)程序彈出的界面, 那是因?yàn)榉?wù)程序和我們的桌面運(yùn)行在不同的Window Station, 除非你指定“允許服務(wù)程序與桌面交互”, 顯式讓服務(wù)程序運(yùn)行在活動桌面的Window Station (WinStat0) 。
      GDI Object只有在創(chuàng)建它的進(jìn)程里有效。


      怎樣以管理員的身份運(yùn)行某個程序?

      其實(shí)就是右鍵Run as Admin, UAC打開時會有確認(rèn)窗口。
      ::ShellExecute(0, L"runas",L"C:\\Windows\\Notepad.exe",0,0,SW_SHOWNORMAL);


      如何判斷當(dāng)前進(jìn)程是否運(yùn)行在管理員賬號下?

      這里包含2個概念 一個是運(yùn)行程序的賬號是管理員賬號, 另外一個是當(dāng)前運(yùn)行的環(huán)境是管理員環(huán)境。
      我們下面的Am_I_In_Admin_Group(TRUE)相當(dāng)于Windows API IsUserAnAdmin()

      //如果bCheckAdminMode是TRUE, 則除了檢測Admin賬號外,還檢測是真的運(yùn)行在Admin環(huán)境, 否則只是檢測Admin賬號。

      BOOL Am_I_In_Admin_Group(BOOL bCheckAdminMode /*= FALSE*/)
      {
       BOOL   fAdmin;
       HANDLE  hThread;
       TOKEN_GROUPS *ptg = NULL;
       DWORD  cbTokenGroups;
       DWORD  dwGroup;
       PSID   psidAdmin;

       SID_IDENTIFIER_AUTHORITY SystemSidAuthority= SECURITY_NT_AUTHORITY;

       if ( !OpenThreadToken ( GetCurrentThread(), TOKEN_QUERY, FALSE, &hThread))
       {
        if ( GetLastError() == ERROR_NO_TOKEN)
        {
         if (! OpenProcessToken ( GetCurrentProcess(), TOKEN_QUERY, 
          &hThread))
          return ( FALSE);
        }
        else 
         return ( FALSE);
       }


       if ( GetTokenInformation ( hThread, TokenGroups, NULL, 0, &cbTokenGroups))
        return ( FALSE);


       if ( GetLastError() != ERROR_INSUFFICIENT_BUFFER)
        return ( FALSE);


       if ( ! ( ptg= (TOKEN_GROUPS*)_alloca ( cbTokenGroups))) 
        return ( FALSE);


       if ( !GetTokenInformation ( hThread, TokenGroups, ptg, cbTokenGroups,
        &cbTokenGroups) )
        return ( FALSE);


       if ( ! AllocateAndInitializeSid ( &SystemSidAuthority, 2, 
        SECURITY_BUILTIN_DOMAIN_RID, 
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0, &psidAdmin) )
        return ( FALSE);

       fAdmin= FALSE;

       for ( dwGroup= 0; dwGroup < ptg->GroupCount; dwGroup++)
       {
        if ( EqualSid ( ptg->Groups[dwGroup].Sid, psidAdmin))
        {
         if(bCheckAdminMode)
         {
          if((ptg->Groups[dwGroup].Attributes) & SE_GROUP_ENABLED)
          {
           fAdmin = TRUE;
          }
         }
         else
         {
          fAdmin = TRUE;
         }
         break;
        }
       }

       FreeSid ( psidAdmin);

       return ( fAdmin);
      }



      如何提升權(quán)限?


      注意只有原來是Disable的權(quán)限才可以提成Enable, 如果原來就沒有這個權(quán)限, 是提不上去的。

      BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilegeName)
      {
          TOKEN_PRIVILEGES tkp = {0};
          BOOL bRet = LookupPrivilegeValue( NULL, lpszPrivilegeName, &tkp.Privileges[0].Luid );
          
      if(!bRet) return FALSE;

          tkp.PrivilegeCount = 1;
          tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
          bRet = AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL );

          
      return bRet;
      }


      如何判斷用戶的進(jìn)程完整性級別?

      該信息包含在Integrity  Level的SID里,通過GetTokenInformation, 第二個參數(shù)設(shè)置成TokenIntegrityLevel,大概代碼如下, 詳細(xì)可以參考后面下載的源代碼。

      void CIntegrityLevel::Print(std::wostream& os) const
      {
          SID* pSid = (SID*)m_pIntegrity->Label.Sid;
          DWORD rid = pSid->SubAuthority[0];

          LPCTSTR lpszIntegrity = L"Unknown";
          
      switch (rid)
          
      {
          
      case SECURITY_MANDATORY_UNTRUSTED_RID:
              
      {
                  lpszIntegrity = L"Untrusted";
                  
      break;
              }

          case SECURITY_MANDATORY_LOW_RID:
              
      {
                  lpszIntegrity = L"Low";
                  
      break;
              }

          case SECURITY_MANDATORY_MEDIUM_RID:
              
      {
                  lpszIntegrity = L"Medium";
                  
      break;
              }


          case SECURITY_MANDATORY_MEDIUM_PLUS_RID:
              
      {
                  lpszIntegrity = L"Medium +";
                  
      break;
              }

          case SECURITY_MANDATORY_HIGH_RID:
              
      {
                  lpszIntegrity = L"High";
                  
      break;
              }

          case SECURITY_MANDATORY_SYSTEM_RID:
              
      {
                  lpszIntegrity = L"System";
                  
      break;
              }

          default:
              
      {
                  lpszIntegrity = L"XXXXX";
              }

          }


          os << L"Integrity: " << lpszIntegrity << endl;
      }



      如何指定程序默認(rèn)啟動運(yùn)行的級別?

      在VC里配置Manifest文件。
      asInvoker:默認(rèn)選項(xiàng),新的進(jìn)程將簡單地繼承其父進(jìn)程的訪問令牌
      highestAvailable:應(yīng)用程序會選擇該用戶允許范圍內(nèi)盡可能高的權(quán)限。對于標(biāo)準(zhǔn)用戶來說,該選項(xiàng)與asInvoker一樣,而對于管理員來說,這就意味著請求Admin令牌。
      requireAdministrator:應(yīng)用程序需要Admin令牌。運(yùn)行該程序時,標(biāo)準(zhǔn)用戶將要輸入管理員的用戶名和密碼,而管理員則要在彈出的確認(rèn)對話框中進(jìn)行確認(rèn)。



      上面只是我自己的一些理解和總結(jié), 由于不是專門搞安全相關(guān)的, 如果有不正確的地方, 歡迎指正。

      注,這是部分測試代碼:MySecurityTest
      posted on 2013-08-25 08:09  Richard Wei  閱讀(2620)  評論(2)    收藏  舉報(bào)

      主站蜘蛛池模板: 成人动漫综合网| 亚洲国产色婷婷久久99精品91| 精品国产午夜福利在线观看| 最新亚洲国产手机在线| 伊人天天久大香线蕉av色| 亚洲高清免费在线观看| 暖暖影院日本高清...免费| 丰满爆乳一区二区三区| 精品视频一区二区三区不卡| 国产久免费热视频在线观看| 九九热精品视频免费在线| 仪征市| 囯产精品久久久久久久久久妞妞 | 色综合久久久久综合体桃花网| 暖暖 免费 高清 日本 在线观看5| 国产无套精品一区二区三区 | 国产无人区码一区二区| 国产精品亚洲а∨天堂2021| 久久天堂综合亚洲伊人HD妓女| 亚洲一区二区av观看| 欧美色欧美亚洲高清在线视频| 久久久av男人的天堂| 亚洲熟妇色自偷自拍另类| 亚亚洲视频一区二区三区| 国产成人午夜福利院| 四虎成人免费视频在线播放| 亚洲av第一区二区三区| 青青草无码免费一二三区| 精品人妻伦一二三区久久| 南江县| 亚洲男人AV天堂午夜在| 午夜成人精品福利网站在线观看 | 中文字幕人妻无码一区二区三区| 欧美性猛交xxxx黑人猛交| 中文人妻av高清一区二区| 国产精品高清一区二区三区| 一个人在看www免费| 亚洲成av人片无码不卡播放器 | 精品人妻系列无码天堂| 深夜福利视频在线播放| 日夜啪啪一区二区三区|