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
之下,我们可以通过枚举这个键相关的数据来获取已安装的软件信息
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)
}
}