當前位置:
首頁 > 新聞 > 滲透基礎——獲得當前系統已安裝的程序列表

滲透基礎——獲得當前系統已安裝的程序列表

0x00 前言

最近遇到了一個有趣的問題:我在嘗試使用wmi獲取當前系統已安裝的程序列表時,並不能獲得完整的列表。於是做了進一步研究,找出錯誤原因,改變思路,完成目標。

本文是一篇介紹基礎知識的文章,用來解決基本的問題。

0x01 簡介

本文將要介紹以下內容:

·通過wmi獲取當前系統已安裝的程序列表

·wmi查詢結果不完整的原因

·獲取完整程序列表的實現思路

0x02 獲取當前系統已安裝的程序列表

1、使用powershell調用wmi

代碼如下:

Get-WmiObject -class Win32_Product

對輸出結果進行過濾,只顯示程序名稱,代碼如下:

Get-WmiObject -class Win32_Product |Select-Object -Property name

獲得結果如下圖

2、使用wmic調用wmi

代碼如下:

wmic /NAMESPACE:"\rootCIMV2" PATH Win32_Product

對輸出結果進行過濾,只顯示程序名稱,代碼如下:

wmic /NAMESPACE:"\rootCIMV2" PATH Win32_Product get name /FORMAT:table

獲得結果如下圖

3、使用WMI Explorer調用wmi

下載地址:

https://wmie.codeplex.com/releases/view/135794

界面化的WMI查詢工具,可用來查詢wmi支持的類,是研究wmi的好工具

首先點擊Connect連接本機

選中ROOTCIMV2 -> Query

輸入查詢命令:

SELECT * FROM Win32_Product

獲得結果如下圖

4、通過控制面板查詢已安裝的程序

控制面板 -> 程序 -> 程序和功能

發現部分程序通過wmi查詢無法獲得,例如Google Chrome,對比結果如下圖

0x03 wmi查詢結果不完整的原因

通過WMI查詢Win32_Product只能獲得特定的程序列表

這些程序有一個共同的特徵: 安裝包由Windows Installer製作,安裝過程中調用Windows Installer服務進行安裝

說明:

Microsoft Windows Installer: Windows 操作系統的一個組件,是安裝和卸載軟體的標準基礎。

Windows Installer服務: 添加、修改和刪除作為Windows Installer程序包提供的應用程序。

除了Microsoft Windows Installer,製作安裝包還可使用EasySetup、Setup2Go、Advanced Installer、Qt installer framework和WinRAR

Chrome的在安裝過程中不會調用Microsoft Windows Installer組件,所以通過WMI查詢Win32_Product無法找到Chrome

0x04 獲取完整程序列表的實現思路

我們知道,通過控制面板 -> 程序 -> 程序和功能獲取的程序列表比較完整,該列表對應註冊表鍵值:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall

每個子健代表列表中的一個程序

所以,可以通過枚舉註冊表鍵值的方法獲得完整程序列表

值得注意的是64位系統下,註冊表存在重定向的問題,也會影響程序列表的顯示

32位程序列表對應註冊表鍵值HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall

64位程序列表對應註冊表鍵值HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall

註:

這個問題在之前的文章《關於32位程序在64位系統下運行中需要注意的重定向問題》進行過整理

編寫powershell腳本實現枚舉註冊表,獲得完整的程序列表

關鍵代碼:

1、枚舉指定註冊表項下的子項

dir Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall -Name

如下圖

2、查詢指定註冊表項的註冊表鍵值

(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall").DisplayName

如下圖

3、加入foreach循環實現枚舉

$RegPath = "Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall"

$QueryPath = dir $RegPath -Name

foreach($Name in $QueryPath)

{

(Get-ItemProperty -Path $RegPath$Name).DisplayName

}

4、加入判斷系統位數,自動判斷註冊表重定向

完整代碼可參考如下地址:

https://github.com/3gstudent/ListInstalledPrograms

0x05 補充

通常,已安裝的程序會創建快捷方式,所以,嘗試枚舉快捷方式文件也能獲得完整的程序列表

通過wmic獲取所有快捷方式:

wmic PATH Win32_ShortcutFile get name /FORMAT:table

0x06 小結

本文介紹了通過wmi無法獲得當前系統已安裝程序完整列表的原因,編寫powershell腳本,通過枚舉註冊表項,實現獲得程序完整列表。作為一篇介紹基礎知識的文章,希望能給新人帶來啟發。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

惡意軟體Ursnif的隱蔽進程注入技術分析
滲透測試實戰:利用列目錄漏洞重置密碼

TAG:嘶吼RoarTalk |