修改Manifest文件控制應用程序運行權限

    在Win7環境下,當使用普通用戶賬號運行某些應用程序(程序圖標顯示有盾牌)的時候,系統會彈出對話框要求輸入管理員賬號和密碼,否則無法運行,也就是說這類應用程序只允許管理員運行,普通用戶則完全無法運行。但同一應用程序在Win XP環境下卻能基本運行,只是部分功能因沒有管理員權限而無法使用。爲安全起見,公司電腦一般都不會賦予用戶賬號管理員權限,這樣一來很多程序都會無法在Win7下運行,會造成相當的不便。

    這是由於Windows的UAC(用戶賬戶控制)安全機制導致的。Windows從Vsita開始引入該機制,當應用程序需要進行一些操作系統層面或者影響其他用戶操作的設置,比如更改控制面板設置、刪除系統文件、修改註冊表等,操作系統便會彈出對話框,提示用戶輸入管理員賬號密碼,獲得許可後方能繼續。

    UAC的這種臨時提升用戶權限的設計大大提高了Windows的安全性,應用程序的一些操作必須要獲取到管理員用戶的許可方能運行,這樣可以防止惡意軟件和間諜軟件在未經許可的情況下在計算機上運行安裝或者對計算機進行更改。

    凡是圖標顯示有盾牌的可執行文件都需要管理員權限才能完全正常的運行,但也有可能該應用程序只是部分功能需要管理員權限而已,很多情況下我們只需使用應用程序的一般功能,所以我們需要強制可執行文件以普通用戶權限運行。默認情況下可執行文件EXE是以當前用戶權限運行的,那麼操作系統是如何知道應用程序需要使用管理員權限運行而彈出對話框提示用戶呢?

    操作系統是通過讀取manifest清單文件來獲取EXE文件運行所需的權限,Manifest清單文件是一個後綴爲.manifest的XML文件,保存了有關應用程序的配置元數據。該Manifest可以作爲一個文件存儲在應用程序相同的目錄下,也可以作爲一種資源嵌入在可執行文件內部。


所以我們可以通過修改manifest文件來控制應用程序的運行權限,以下爲外置和內置兩種清單文件的修改方法:


  • 外置同名manifest文件

以軟件“一號店在線客服”爲例,軟件安裝後,修改程序目錄(C:\Program Files (x86)\yhd)的文件夾權限,編輯Users用戶組,添加“修改和寫入”權限,在“高級”菜單中,勾選“更改權限”→“使用可從此對象繼承的權限替代所有子對象項目”。然後以普通用戶賬號登陸系統,運行主程序(im-desktop.exe),系統彈出UAC對話框。這時候無論按是或否均無法運行程序。

wKiom1dFJo7gFhyjAACVvYtbgnw834.png


用記事本編輯跟程序位於同一目錄的im-desktop.exe.manifest文件:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

配置中有一個 requestedExecutionLevel 項,這個項用於配置當前應用請求的執行權限級別。這個項有3個值可供選擇,如下表所示:


作用
asInvoker應用程序就是以當前的權限運行。
highestAvailable

應用程序以當前用戶可以獲得的最高權限運行

requireAdministrator應用程序僅以系統管理員權限運行。


所以我們只需要將requestedExecutionLevel項目設置爲asInvoker或者highestAvailable,程序就能以當前用戶賬號正常運行了。


    其中,highestAvailable和 requireAdministrator 這兩個選項都可以提示用戶獲取系統管理員權限。兩個選項的區別在哪裏呢?他們的區別在於,如果我們不是以管理員帳號登錄,而應用程序設置爲requireAdministrator,那麼應用程序就直接運行失敗,無法啓動,也就是強制程序以管理員賬號運行。而如果設置爲 highestAvailable,則應用程序可以運行成功,只是以當前帳號的最高權限運行而不是系統管理員權限運行。另外,直接將該manifest文件刪除也可以強制操作系統以當前用戶運行。



  • 可執行文件內置manifest文件

以軟件“美圖秀秀”爲例,安裝軟件後,使用普通賬號運行程序同樣會彈出UAC對話框,從而導致運行失敗。其manifest清單文件內置在EXE文件裏,無法直接編輯。

  1. 首先下載並安裝可執行文件編輯軟件Resource Hacker(http://www.angusj.com/resourcehacker/)。

  2. 接着用管理員賬號運行ResourceHacker軟件(鼠標右鍵主程序以管理員身份運行),然後點擊File→Open,選擇美圖秀秀的主程序Xiuxiu.exe,點擊左側的資源列表中的Manifest→1:1033。

    這時候就看到了內置在EXE文件中的清單文件內容了,該文件內容和需要修改的內容都跟之前外置的清單文件一樣,只要將requestedExecutionLevel項目修改爲asInvoker或者highestAvailable即可。


    wKiom1dFLAKgbUG3AAEtqvSRgWg692.png


  3. 修改後點擊工具欄中的Compile Script,接着點擊Save,程序會自動備份原文件爲 XiuXiu_original.exe。

    註銷並重新登陸一下當前的普通用戶,運行xiuxiu.exe,程序就可以順利運行了。

   

    現在越來越多應用程序運行時需要提升權限到管理員級別,這樣可以提高軟件的使用體驗。但是企業辦公電腦由於安全性和管理的需要,一般不允許賦予普通用戶本機管理員的權限,這樣一來會很多軟件都無法使用。通過關閉UAC功能或者修改manifest清單文件都可以令普通用戶能基本運行這類應用程序,不過,關閉UAC後,即與XP環境軟件的運行機制類似,只能通過鼠標右鍵選擇“運行爲”來提升運行權限,而且基於安全性的考慮,不建議關閉UAC功能。需要注意的是,修改清單文件後不能保證軟件可以百分百正常運行,修改後有時需要註銷再登陸當前用戶或者重啓系統纔會生效,還有,清單文件修改前要注意對EXE文件和manifest文件原文件做好備份。


原文爲博主所著,並刊登於《網絡安全和信息化》雜誌2016.05期。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章