跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

渗透基金会——获取当前系统中已安装程序的列表


Tenfk

推荐的帖子

0x00 前言

最近遇到一个有趣的问题:当我试图使用wmi获取当前系统中已安装程序的列表时,却无法获取完整的列表。于是我做了进一步的研究,找到了错误的原因,改变了思路,达到了目的。

本文是基础知识介绍,用来解决基础问题。

0x01 简介

本文将介绍以下内容:

通过wmi获取当前系统中已安装程序的列表

wmi查询结果不完整的原因

获取完整节目单的实现思路

0x02 获取当前系统已安装的程序列表

1、使用powershell调用wmi

代码如下:

get-wmio object-class Win32 _ Product

过滤输出结果,只显示程序名,代码如下:

get-wmio Object-class Win32 _ Product | Select-Object-Property name

结果如下

2-1.png

2、使用wmic调用wmi

代码如下:

wmic/命名空间:“\\root\CIMV2”路径Win32_Product

过滤输出结果,只显示程序名,代码如下:

wmic/命名空间:“\\root\CIMV2”路径Win32 _ Product get name/FORMAT:table

结果如下

2-2.png

3、使用WMI Explorer调用wmi

下载地址:

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

接口wmi查询工具,可以用来查询wmi支持的类,是研究WMI的好工具。

首先单击“连接”来连接这台机器。

选择ROOT\CIMV2-Query。

输入查询命令:

SELECT * FROM Win32_Product

结果如下

2-3.png

4、通过控制面板查询已安装的程序

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

发现的一些程序无法通过wmi查询获得,比如Google Chrome。比较结果如下。

2-4.png

0x03 wmi查询结果不完整的原因

通过WMI查询Win32_Product只能得到特定的程序列表。

这些程序有一个共同的特点:安装包由Windows Installer制作,安装过程中调用Windows Installer服务。

说明:

windows installer:windows操作系统的一个组件,是安装和卸载软件的标准基础。

Windows Installer服务:添加、修改和删除作为Windows Installer软件包提供的应用程序。

除了微软的Windows Installer,还可以使用EasySetup、Setup2Go、Advanced Installer、Qt installer framework、WinRAR制作安装包。

Chrome在安装过程中不调用微软Windows Installer组件,所以无法通过WMI查询Win32_Product找到Chrome。

0x04 获取完整程序列表的实现思路

我们知道通过控制面板-程序-程序和功能得到的程序列表是比较完整的,列表对应的是注册表键值:

HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \当前版本\卸载\

每个孩子代表列表中的一个程序。

因此,通过枚举注册表项可以获得完整的程序列表。

值得注意的是,在64位系统下,注册表有重定向的问题,也会影响程序列表的显示。

32位程序列表对应于注册表项HKEY _本地_机器\软件\ wow6432node节点\微软\ windows \当前版本\卸载\

64位程序列表对应于注册表项HKEY _本地_机器\软件\微软\ windows \当前版本\卸载

注:

这个问题在之前的文章《关于32位程序在64位系统下运行中需要注意的重定向问题》里整理过。

编写powershell脚本来枚举注册表并获得程序的完整列表。

关键代码:

1、枚举指定注册表项下的子项

目录注册表:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ Uninstall-Name

如下图

4-1.png

2、查询指定注册表项的注册表键值

(Get-item property-Path ' Registry:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ Uninstall \ { 4f 3742 e 0-700E-431d-BF19-5b 27 ed 98 E8 f 1 } ')。显示名称

如下图

4-2.png

3、加入foreach循环实现枚举

$ RegPath=' Registry:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ Uninstall '

$QueryPath=dir $RegPath -Name

foreach($Name in $QueryPath)

{

(Get-item property-Path $ RegPath $ Name)。显示名称

}

4、加入判断系统位数,自动判断注册表重定向

完整代码请参考以下地址:

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

0x05 补充

通常,已安装的程序会创建快捷方式,因此您可以通过尝试枚举快捷方式文件来获得程序的完整列表。

通过wmic获取所有快捷方式:

wmic路径Win32_ShortcutFile获取名称/格式:表

0x06 小结

介绍了无法通过wmi获取当前系统中已安装程序的完整列表的原因,编写powershell脚本,通过枚举注册表项来实现程序的完整列表。作为一篇介绍基础知识的文章,希望能给新人带来启发。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...