u1timate
Published on 2021-06-04 / 229 Visits
0

获取系统安装软件版本

0x01 Linux

通过RPM获取

rpm -q --qf  "%{VERSION}\n" python   //获取python的版本号

可通过rpm —querytags查看可用的tag

获取包名,版本号, 创建日期, 架构, 操作系统, BASENAMES, 配置文件位置
rpm -q --qf  "%{NAME} \t%{VERSION}\t%{BUILDTIME}\t%{ARCH}\t%{OS}\t%{BASENAMES}\t%{INSTFILENAMES}\n" -a
 结果如下
  vim-common      7.4.629 1565320657      x86_64  linux   vimrc   /etc/vimrc
sysstat         10.1.5  1585715797      x86_64  linux   sysstat /etc/cron.d/sysstat
ntp     4.2.6p5 1592926706      x86_64  linux   dhclient.d      /etc/dhcp/dhclient.d
selinux-policy-targeted         3.13.1  1593531032      noarch  linux   targeted        /etc/selinux/targeted
NetworkManager-wifi     1.18.4  1585713456      x86_64  linux   libnm-device-plugin-wifi.so     /usr/lib64/NetworkManager/1.18.4-3.el7/libnm-device-plugin-wifi.so
dnsmasq         2.76    1571414466      x86_64  linux   dnsmasq.conf    /etc/dbus-1/system.d/dnsmasq.conf
  。。。。

0x02 Windows

基于注册表获取信息

windows将软件卸载信息放在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall之下,我们可以通过枚举这个键相关的数据来获取已安装的软件信息
2DD4B543380B447C951B5BCF02EFD363.png

DisplayName:显示名称,这是我们看到的该软件的名字,例如: 		 
Adobe Acrobat 5.0
DisplayVersion : 显示版本,软件的版本号
InstallLocation : 软件安装目录
InstallSource : 该软件从哪个位置安装(例如网络共享或者安装光盘)
Publisher : 发布该软件的厂商
URLinfoabout : 介绍该软件的网页
UrlUpdateInfo : 网络更新该软件的位置

示例代码

package godemo

import (
	"fmt"
	"log"

	"golang.org/x/sys/windows/registry"
)

var p = `SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`

func GetSoftInfo(fullKey string) {
	k, err := registry.OpenKey(registry.LOCAL_MACHINE,
		fullKey, registry.QUERY_VALUE)
	if err != nil {
		log.Fatal(err)
	}
	defer k.Close()
	value, _, err := k.GetStringValue("DisplayName")
	if err != nil {
		return
	}
	fmt.Printf("DisplayName:%+v\t", value)
	value, _, err = k.GetStringValue("DisplayVersion")
	if err != nil {
		log.Print("DisplayVersion" + err.Error())
	}
	fmt.Printf("DisplayVersion:%+v\t", value)
	value, _, _ = k.GetStringValue("InstallLocation")

	fmt.Printf("InstallLocation:%+v\t", value)
	value, _, _ = k.GetStringValue("Publisher")
	fmt.Printf("Publisher:%+v\t", value)
	value, _, _ = k.GetStringValue("InstallDate")
	fmt.Printf("InstallDate:%+v\t", value)
	fmt.Printf("\n")
}

func Reg() {
	k, err := registry.OpenKey(registry.LOCAL_MACHINE,
		p, registry.QUERY_VALUE|registry.ENUMERATE_SUB_KEYS)
	if err != nil {
		log.Fatal(err)
	}
	defer k.Close()
	//获取该Key下的所有子键
	subNames, err := k.ReadSubKeyNames(-1)
	if err != nil {
		log.Fatal(err)
	}
	for _, each := range subNames {
		// println(p + `\` + each)
		GetSoftInfo(p + `\` + each)
	}
}