在Windows Vista里面,進(jìn)程是分權(quán)限級(jí)別的。Windows會(huì)根據(jù)manifest內(nèi)容、Windows Installer detection、兼容性數(shù)據(jù)庫(kù)等方法判斷一個(gè)進(jìn)程是否需要一開(kāi)始就運(yùn)行在完整admin模式下。
但是不是所有的程序一開(kāi)始就需要運(yùn)行在完整admin模式下的,例如任務(wù)管理器TaskMgr.EXE。在Windows Vista里面,啟動(dòng)任務(wù)管理器以后,默認(rèn)只能顯示當(dāng)前賬戶(hù)相關(guān)的進(jìn)程信息,只有當(dāng)點(diǎn)擊下面這個(gè)按鈕并回應(yīng)UAC提示以后才能顯示所有用戶(hù)的進(jìn)程信息:
Show processes from all users 按鈕前面有一個(gè)Windows 安全中心的圖標(biāo)。這個(gè)表示這個(gè)操作需要觸發(fā)UAC。這個(gè)倒是沒(méi)有什么特別的。問(wèn)題的關(guān)鍵在于:TaskMgr是怎么觸發(fā)UAC的?
我們知道,一個(gè)沒(méi)有完全admin權(quán)限的進(jìn)程是沒(méi)法直接創(chuàng)建更高權(quán)限進(jìn)程的,也就是說(shuō)一般權(quán)限下的進(jìn)程是沒(méi)法直接創(chuàng)建完全Admin權(quán)限進(jìn)程的。因此CreateProcess API函數(shù)肯定是不能使用的。如果使用CreateProcessAsUser函數(shù),那么需要提供一個(gè)比較高的令牌才能完成,這個(gè)需要有額外的來(lái)源,而TaskMgr顯然不具備這種能力。那TaskMgr是怎么完成這個(gè)神秘的動(dòng)作呢?
上述問(wèn)題我思考了數(shù)個(gè)月,上網(wǎng)搜索也沒(méi)有搜索到有價(jià)值的內(nèi)容。直到昨天晚上才有空去調(diào)試一把,看看到底是怎么玩的。
我用windbg attach到 taskmgr 進(jìn)程上,然后把所有的進(jìn)程創(chuàng)建相關(guān)函數(shù)全部設(shè)置了斷點(diǎn),然后點(diǎn)擊Show processes from all users 按鈕,結(jié)果ShellExecuteExW函數(shù)被斷下了,難道ShellExecuteExW有什么特殊的地方嗎?查閱最新的MSDN關(guān)于ShellExecuteExW的說(shuō)明文檔,什么介紹都沒(méi)有。是斷點(diǎn)有問(wèn)題嗎?
繼續(xù)使用windbg單步調(diào)試,當(dāng)程序執(zhí)行的時(shí)候,有一個(gè)看起來(lái)很關(guān)鍵的函數(shù)調(diào)用:
call SHELL32!ShellExecuteNormal (7656e6ce),看到這個(gè)名字我的第一個(gè)直覺(jué)是這個(gè)是真正的執(zhí)行函數(shù),前面還有很多操作僅僅是一些檢查步驟。當(dāng)執(zhí)行完call SHELL32!ShellExecuteNormal (7656e6ce)指令以后,UAC框彈出了??吹経AC框的彈出,我已經(jīng)可以確認(rèn)任務(wù)管理器是使用ShellExecuteExW某個(gè)在MSDN上面沒(méi)有公開(kāi)的操作觸發(fā)UAC的。根據(jù)前面的描述,call SHELL32!ShellExecuteNormal (7656e6ce)指令是一個(gè)關(guān)鍵指令,因此需要檢查call SHELL32!ShellExecuteNormal (7656e6ce)指令之前的參數(shù)操作。
呵呵,這回我盯上了push esi指令了。
windbg里面查看esi對(duì)應(yīng)的內(nèi)存內(nèi)容以后發(fā)現(xiàn)可能是一個(gè)結(jié)構(gòu)體,由于是ShellExecuteExW函數(shù)里面執(zhí)行的,因此我猜測(cè)這個(gè)結(jié)構(gòu)體是 SHELLEXECUTEINFO,對(duì)照SHELLEXECUTEINFO結(jié)構(gòu)體的定義,果然和esi內(nèi)容相符。最后一步就是檢查結(jié)構(gòu)體里面各個(gè)參數(shù)的情況了。當(dāng)我發(fā)現(xiàn)LPCTSTR lpVerb指向的參數(shù)內(nèi)容(db 0xe5d93c命令)是“runas”這個(gè)字符串的時(shí)候,Taskmgr 將自身提示為完全admin權(quán)限的方法也就揭曉了:
在Windows Vista里面,ShellExecuteExW lpVerb的參數(shù)可以傳入runas命令,使得系統(tǒng)調(diào)用 ShellExecuteExW 的時(shí)候,會(huì)強(qiáng)制將目標(biāo)文件以完全admin模式啟動(dòng),即使目標(biāo)文件的manifest沒(méi)有申明需要完全admin權(quán)限。
效果等同于在目標(biāo)程序上右鍵點(diǎn)擊,然后選擇 run as administrator 菜單內(nèi)容。
幕后:當(dāng)全部搞定以后,我上網(wǎng)google了一下,發(fā)現(xiàn)這個(gè)方法早有人提及了,而且還是在 Vista Compatibility Team Blog 上面,我花的1個(gè)多小時(shí)全部白費(fèi)了,為啥先前都沒(méi)有搜索到呢??郁悶
但是不是所有的程序一開(kāi)始就需要運(yùn)行在完整admin模式下的,例如任務(wù)管理器TaskMgr.EXE。在Windows Vista里面,啟動(dòng)任務(wù)管理器以后,默認(rèn)只能顯示當(dāng)前賬戶(hù)相關(guān)的進(jìn)程信息,只有當(dāng)點(diǎn)擊下面這個(gè)按鈕并回應(yīng)UAC提示以后才能顯示所有用戶(hù)的進(jìn)程信息:
Show processes from all users 按鈕前面有一個(gè)Windows 安全中心的圖標(biāo)。這個(gè)表示這個(gè)操作需要觸發(fā)UAC。這個(gè)倒是沒(méi)有什么特別的。問(wèn)題的關(guān)鍵在于:TaskMgr是怎么觸發(fā)UAC的?
我們知道,一個(gè)沒(méi)有完全admin權(quán)限的進(jìn)程是沒(méi)法直接創(chuàng)建更高權(quán)限進(jìn)程的,也就是說(shuō)一般權(quán)限下的進(jìn)程是沒(méi)法直接創(chuàng)建完全Admin權(quán)限進(jìn)程的。因此CreateProcess API函數(shù)肯定是不能使用的。如果使用CreateProcessAsUser函數(shù),那么需要提供一個(gè)比較高的令牌才能完成,這個(gè)需要有額外的來(lái)源,而TaskMgr顯然不具備這種能力。那TaskMgr是怎么完成這個(gè)神秘的動(dòng)作呢?
上述問(wèn)題我思考了數(shù)個(gè)月,上網(wǎng)搜索也沒(méi)有搜索到有價(jià)值的內(nèi)容。直到昨天晚上才有空去調(diào)試一把,看看到底是怎么玩的。
我用windbg attach到 taskmgr 進(jìn)程上,然后把所有的進(jìn)程創(chuàng)建相關(guān)函數(shù)全部設(shè)置了斷點(diǎn),然后點(diǎn)擊Show processes from all users 按鈕,結(jié)果ShellExecuteExW函數(shù)被斷下了,難道ShellExecuteExW有什么特殊的地方嗎?查閱最新的MSDN關(guān)于ShellExecuteExW的說(shuō)明文檔,什么介紹都沒(méi)有。是斷點(diǎn)有問(wèn)題嗎?
繼續(xù)使用windbg單步調(diào)試,當(dāng)程序執(zhí)行的時(shí)候,有一個(gè)看起來(lái)很關(guān)鍵的函數(shù)調(diào)用:
call SHELL32!ShellExecuteNormal (7656e6ce),看到這個(gè)名字我的第一個(gè)直覺(jué)是這個(gè)是真正的執(zhí)行函數(shù),前面還有很多操作僅僅是一些檢查步驟。當(dāng)執(zhí)行完call SHELL32!ShellExecuteNormal (7656e6ce)指令以后,UAC框彈出了??吹経AC框的彈出,我已經(jīng)可以確認(rèn)任務(wù)管理器是使用ShellExecuteExW某個(gè)在MSDN上面沒(méi)有公開(kāi)的操作觸發(fā)UAC的。根據(jù)前面的描述,call SHELL32!ShellExecuteNormal (7656e6ce)指令是一個(gè)關(guān)鍵指令,因此需要檢查call SHELL32!ShellExecuteNormal (7656e6ce)指令之前的參數(shù)操作。
呵呵,這回我盯上了push esi指令了。
windbg里面查看esi對(duì)應(yīng)的內(nèi)存內(nèi)容以后發(fā)現(xiàn)可能是一個(gè)結(jié)構(gòu)體,由于是ShellExecuteExW函數(shù)里面執(zhí)行的,因此我猜測(cè)這個(gè)結(jié)構(gòu)體是 SHELLEXECUTEINFO,對(duì)照SHELLEXECUTEINFO結(jié)構(gòu)體的定義,果然和esi內(nèi)容相符。最后一步就是檢查結(jié)構(gòu)體里面各個(gè)參數(shù)的情況了。當(dāng)我發(fā)現(xiàn)LPCTSTR lpVerb指向的參數(shù)內(nèi)容(db 0xe5d93c命令)是“runas”這個(gè)字符串的時(shí)候,Taskmgr 將自身提示為完全admin權(quán)限的方法也就揭曉了:
在Windows Vista里面,ShellExecuteExW lpVerb的參數(shù)可以傳入runas命令,使得系統(tǒng)調(diào)用 ShellExecuteExW 的時(shí)候,會(huì)強(qiáng)制將目標(biāo)文件以完全admin模式啟動(dòng),即使目標(biāo)文件的manifest沒(méi)有申明需要完全admin權(quán)限。
效果等同于在目標(biāo)程序上右鍵點(diǎn)擊,然后選擇 run as administrator 菜單內(nèi)容。
幕后:當(dāng)全部搞定以后,我上網(wǎng)google了一下,發(fā)現(xiàn)這個(gè)方法早有人提及了,而且還是在 Vista Compatibility Team Blog 上面,我花的1個(gè)多小時(shí)全部白費(fèi)了,為啥先前都沒(méi)有搜索到呢??郁悶