Python 获取注册表、U盘历史痕迹和回收站文件

一.获取Windows主机信息

WMI(Windows Management Instrumentation) 是一项核心的Windows管理技术,WMI模块可用于获取Windows内部信息。WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程;设定一个在特定日期和时间运行的进程;远程启动计算机;获得本地或远程计算机的已安装程序列表;查询本地或远程计算机的Windows事件日志等等。

本文使用Python获取Windows系统上相关的信息可以使用WMI接口,安装调用PIP工具即可。

  • pip install wmi
  • import wmi

 

下面的代码是获取Windows主机相关信息。

import wmi
import osimport socketw = wmi.WMI()#获取电脑使用者信息for CS in w.Win32_ComputerSystem():
    #print(CS)
    print("电脑名称: %s" %CS.Caption)
    print("使用者: %s" %CS.UserName)
    print("制造商: %s" %CS.Manufacturer)
    print("系统信息: %s" %CS.SystemFamily)
    print("工作组: %s" %CS.Workgroup)
    print("机器型号: %s" %CS.model)
    print("")
#获取操作系统信息for OS in w.Win32_OperatingSystem():
    #print(OS)
    print("操作系统: %s" %OS.Caption)
    print("语言版本: %s" %OS.MUILanguages)
    print("系统位数: %s" %OS.OSArchitecture)
    print("注册人: %s" %OS.RegisteredUser)
    print("系统驱动: %s" %OS.SystemDevice)
    print("系统目录: %s" %OS.SystemDirectory)
    print("")
#获取电脑IP和MAC信息for address in w.Win32_NetworkAdapterConfiguration(ServiceName = "e1dexpress"):
    #print(address)
    print("IP地址: %s" % address.IPAddress)
    print("MAC地址: %s" % address.MACAddress)
    print("网络描述: %s" % address.Description)
    print("")
#获取电脑CPU信息for processor in w.Win32_Processor():
    #print(processor)
    print("CPU型号: %s" % processor.Name.strip())
    print("CPU核数: %s" % processor.NumberOfCores)
    print("")
#获取BIOS信息for BIOS in w.Win32_BIOS():
    #print(BIOS)
    print("使用日期: %s" %BIOS.Description)
    print("主板型号: %s" %BIOS.SerialNumber)
    print("当前语言: %s" %BIOS.CurrentLanguage)
    print("")
#获取内存信息for memModule in w.Win32_PhysicalMemory():
    totalMemSize = int(memModule.Capacity)
    print("内存厂商: %s" %memModule.Manufacturer)
    print("内存型号: %s" %memModule.PartNumber)
    print("内存大小: %.2fGB" %(totalMemSize/1024**3))
    print("")
#获取磁盘信息for disk in w.Win32_DiskDrive():
    diskSize = int(disk.size)
    print("磁盘名称: %s" %disk.Caption)
    print("硬盘型号: %s" %disk.Model)
    print("磁盘大小: %.2fGB" %(diskSize/1024**3))
#获取显卡信息for xk in w.Win32_VideoController():
    print("显卡名称: %s" %xk.name)
    print("")
       #获取计算机名称和IPhostname = socket.gethostname()ip = socket.gethostbyname(hostname)print("计算机名称: %s" %hostname)
print("IP地址: %s" %ip)

输出结果如下图所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 


二.获取Windows注册表信息

1.注册表基本结构

注册表(Registry)是Windows系统中一个重要的数据库,它用于存储有关应用程序、用户和系统信息。注册表的结构就像一颗树,树的顶级节点(hive)不能添加、修改和删除,如下图所示是Windows注册表的顶级节点。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

在C#中对注册表进行操作,需要引用命名空间using Microsoft.Win32。

  • RegistryKey类:表示注册表中的顶级结点,此类是注册表的封装。
  • Registry类:提供表示Windows注册表中的根项RegistryKey对象,并提供访问项/值的static方法。常用的Registry对象的顶级节点(蜂窝,hive)的属性如下表所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

注册表中常用的数据类型有:

  • REG_SZ:字符串数据的主要类型,用于存储固定长度的字符串或其他短文本值。我们在实际程序中常用这种数据类型,如果要保存布尔值时,将它表示成0或1。
  • REG_BINARY:用于存储二进制数据。
  • REG_EXPAND_SZ:可扩展的字符串值,可以保存在运行时才解析的系统变量。
  • REG_MULTI_SZ:以数组的格式保存多个文本字符串,每个字符串"元素"都以null字符结束。

 


2.注册表基本操作

Python注册表操作主要调用winreg扩展包。官方文档如下:

  • https://docs.python.org/3.0/library/winreg.html

基本操作函数如下:

(1) 创建操作

  • winreg.ConnectRegistry(computer_name, key)
    与计算机的预定义注册表句柄建立连接
  • winreg.CreateKey(key, sub_key)
    创建或打开指定的键

例如在HKEY_CURRENT_USER下创建键Eastmount,其中我们最常用的是在\Software这个键下创建程序产品键,保存一些程序的配置在注册表中。如果Software中没有Eastmount键,则会先创建这个键及其子键,如果存在就不会重写。

import winreg as wg
#创建键subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)wg.CreateKey(key_test, 'Eastmount')
wg.CloseKey(key_test)

运行结果如下:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

(2) 检索键值操作

  • winreg.QueryInfoKey(key)
    以元组形式返回键的信息
  • winreg.QueryValue(key, sub_key)
    以字符串形式检索键的未命名值
  • winreg.QueryValueEx(key, value_name)
    检索与打开注册表项关联的指定值名称的类型和数据

在Eastmount下面新建一个值yxz,内容为“hello na”,然后编写代码读取相关的内容。

#获取键值数据项值
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Eastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
value,type_ = wg.QueryValueEx(key_test,'yxz')
print(value)
print(type_)

输出结果如下图所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

(3) 创建键值操作

  • winreg.SetValue(key, sub_key, type, value)
    将值与指定的键关联
  • winreg.SetValueEx(key, value_name, reserved, type, value)
    将数据存储在打开的注册表项Value字段中

创建键值代码如下,但会提示PermissionError: [WinError 5] 拒绝访问错误。

#创建键值数据项
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Eastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)print(key_test)
#PermissionError: [WinError 5] 拒绝访问
wg.SetValueEx(key_test,'data','',wg.REG_SZ,'0') 
wg.CloseKey(key_test)

(4) 删除键值操作

  • winreg.DeleteKey(key, sub_key)
    删除指定的键
  • winreg.DeleteValue(key, value)
    从注册表项中删除值
#删除键值数据项
subDir = r"Software\Microsoft\Windows\CurrentVersion\Explorer\Eastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER,subDir,0,wg.KEY_WRITE)
wg.DeleteValue(key_test,'yxz')
wg.CloseKey(key_test)

成功删除键值,如下图所示。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

(5) 其他操作

  • winreg.EnumKey(key, index)
    枚举打开注册表的键
  • winreg.EnumValue(key, index)
    枚举打开注册表项的值
  • winreg.OpenKey(key, sub_key,sam=KEY_READ)
    打开指定键
  • winreg.FlushKey(key)
    刷新注册表
  • winreg.LoadKey(key, sub_key, file_name)
    在指定键下创建一个子键,并将注册信息从指定文件存储到该子键中

 


3.获取用户账户信息

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

获取用户名称的代码如下:

# encoding:utf-8
from winreg import *
import sys
#连接注册表根键 以HKEY_LOCAL_MACHINE为例regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE)subDir = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
#获取指定目录下所有键的控制keyHandle = OpenKey(regRoot, subDir)#获取该目录下所有键的个数(0-下属键个数 1-当前键值个数)
count = QueryInfoKey(keyHandle)[0]
for i in range(count):
    #穷举键获取键名    subKeyName = EnumKey(keyHandle, i)    subDir_2 = r'%s\%s' % (subDir, subKeyName)
        #根据获取的键名拼接之前的路径作为参数 获取当前键下所属键的控制    keyHandle_2 = OpenKey(regRoot, subDir_2)    num = QueryInfoKey(keyHandle_2)[1]
    for j in range(num):
        name, value, type_ = EnumValue(keyHandle_2, j)        if('ProfileImagePath' in name and 'Users' in value):
            print(value)
    #读写操作结束后关闭键    CloseKey(keyHandle_2)    CloseKey(keyHandle)CloseKey(regRoot)

执行结果如下,我们可以通过读取含有Users字段的数据,从而间接获取用户账户信息。

C:\Users\xiuzhang

三.获取回收站内容

为什么我们要去获取回收站文件呢?因为很多情况下调查取证需要获取远程目标的历史痕迹,回收站是重要的一个目标。在Windows操作系统中,回收站是一个专门用来存放被删除文件的特色文件夹。

在使用FAT文件系统的Windows98系统中,回收站目录通常是C:\Recycled;在Windows NT2000、Windows XP在内支持的NTFS操作系统中,C:\Recycler;在Windows Vista和Windows7中,回收站目录是C:\$Recycle.Bin。如下图所示,回收站中包含两个文件,分别位于桌面和D盘目录。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

第一步,检测回收站目录是否存在。

import os
def returnDir():    #定义回收站目录    dirs = ['C:\\Recycler\\', 'C:\\Recycled', 'C:\\$Recycle.Bin\\']
    for recycleDir in dirs:
        if os.path.isdir(recycleDir):
            return recycleDir
    return None
#调用函数res = returnDir()print(res) #C:\$Recycle.Bin\

Windows10操作系统输出结果如下图所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

第二步,找到回收站之后,检测其中的内容,如下图所示,字符串SID与用户账户名是对应的,比如1001结尾的SID。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

第三步,编写代码获取回收站文件夹所在目录。

import os
#判断回收站目录是否存在def returnDir():    dirs = ['C:\\Recycler\\', 'C:\\Recycled', 'C:\\$Recycle.Bin\\']
    for recycleDir in dirs:
        if os.path.isdir(recycleDir):
            return recycleDir
    return None
#获取回收站内容def findRecycle(recycleDir):    dirList = os.listdir(recycleDir)
    for sid in dirList:
        print(sid)
        files = os.listdir(recycleDir+sid)
        print(files,"\n")
#主函数def main():    res = returnDir()    print(res) #C:\$Recycle.Bin\
    findRecycle(res)    if __name__ == '__main__':
    main()

输出结果如下图所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

第四步,用python将用户的SID关联起来,使用Windows注册表将SID转化为一个准确的用户名。

  • 通过检查Windows注册表键值
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfileImagePath

编写一个函数来将每一个SID转化为用户名,这个函数将打开注册便检查ProfileImagePath键值,找到其值并从中找到用户名。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

如下图所示,用户名为“xiuzhang”。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

第五步,获取回收站所有内容。
完整代码:

import os
import winreg#判断回收站目录是否存在def returnDir():    dirs = ['C:\\Recycler\\', 'C:\\Recycled', 'C:\\$Recycle.Bin\\']
    for recycleDir in dirs:
        if os.path.isdir(recycleDir):
            return recycleDir
    return None
#通过sid获取用户名信息def sid2user(sid):    try:        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,                                "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\\" + sid)
        #获取该目录下所有键的个数: 0-下属键个数; 1-当前键值个数
        count = winreg.QueryInfoKey(key)[1] 
        for j in range(count):
            #FileNotFoundError: [WinError 2] 系统找不到指定的文件
            #(value, type) = winreg.QueryValue(key, 'ProfileImagePath')
            name, value, type = winreg.EnumValue(key, j)
            if('ProfileImagePath' in name):
                user = value.split('\\')[-1]
                #print(user)
        return user
    except:        return sid
#获取回收站内容def findRecycle(recycleDir):    dirList = os.listdir(recycleDir)
    for sid in dirList:
        print(sid)
        files = os.listdir(recycleDir+sid)
        print(files)
        user = sid2user(sid)        print('[*]Listing Files For User:' + str(user))
        for file in files:
            print('[+]Found File:' + str(file))
        print("")
#主函数def main():    res = returnDir()    print(res)             #C:\$Recycle.Bin
    findRecycle(res)    if __name__ == '__main__':
    main()

输出结果如下图所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

对应的回收站内容如下,但非常可惜获取的值无法对应,why?后续作者会继续深入挖掘。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

 

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 


如果我们想把文件删除到回收站,又怎么解决呢?Python删除文件一般使用os.remove,但这样是直接删除文件,不删到回收站的,那么想删除文件到回收站怎么办?

(1) 安装pypiwin32扩展包(含win32api)。

 

(2) 调用SHFileOperation函数实现删除文件至回收站。

在Windows的shellapi文件中定义了一个名为SHFileOperation的外壳函数,用它可以实现各种文件操作,如文件的拷贝、删除、移动等,该函数使用起来非常简单,它只有一个指向SHFILEOPSTRUCT结构的参数。

from win32com.shell import shell,shellcon
import osdebug = Falsedef deltoreCyclebin(filename):    #直接删除文件,不经过回收站    #os.remove(filename) 
    if not debug:
        #删除文件到回收站        res = shell.SHFileOperation((0,
                                     shellcon.FO_DELETE,                                     filename,                                     None,                                     shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION,                                     None,                                     None))        print(res)
        if not res[1]:
            os.system('del '+ filename)
if __name__ == '__main__':
    filename = "C:\\Users\\xiuzhang\\Desktop\\require.rb"
    deltoreCyclebin(filename)

最终效果如下图所示,可以看到require.rb文件被成功删除。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

可能会遇到“PermissionError: [WinError 5] 拒绝访问”问题,我们需要设置Python.exe用户名完全控制,并且用管理员方式打开即可解决。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 


四.获取U盘痕迹

在Windows系统中,当一个USB移动存储设备插入时,就会在注册表中留下痕迹。当移动设备插入计算机时,即插即用管理器PnP(Plug and Play)接受该事件,并且在USB设备的固件(Firewre information)中查询有关该设备的描述信息(厂商、型号、序列号等)。当设备被识别后,在注册表中创建一个新的键值:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR

在这个键值下,会看到类似下面的结构子键,该子键代表设备类标示符,用来标识设备的一个特定类。

  • Disk&Ven_###&Prod_###&Rev_###

其中,子键中"###"代表区域由PnP管理器依据在USB设备描述符中获取的数据填写。如下图所示:

  • Disk&Ven_aigo&Prod_Miniking&Rev_8.07是Device class ID
  • Q0UKCH37&0是Unique instance ID(UID)

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

注意需要判断Service值为disk,即为磁盘的子项,光盘为cdrom。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

如果使用UVCView工具可以看见USB设备描述内容,其中的信息都是相互对应的。设备类ID一旦建立,就需要建立一个特定唯一的UID,它可以把具有同一设备类标识的多个存储设备区分。

完整实现代码如下:

# encoding:utf-8
from winreg import *
import sys
usb_name = []uid_flag = []usb_path = []#连接注册表根键 以HKEY_LOCAL_MACHINE为例regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE)#检索子项subDir = r"SYSTEM\CurrentControlSet\Enum\USBSTOR"
#获取指定目录下所有键的控制keyHandle = OpenKey(regRoot, subDir)#获取该目录下所有键的个数(0-下属键个数 1-当前键值个数)
count = QueryInfoKey(keyHandle)[0]
print(count)
#穷举USBSTOR键获取键名for i in range(count):
    subKeyName = EnumKey(keyHandle, i)    subDir_2 = r'%s\%s' % (subDir, subKeyName)
    #print(subDir_2)
    #根据获取的键名拼接之前的路径作为参数 获取当前键下所属键的控制    keyHandle_2 = OpenKey(regRoot, subDir_2)    num = QueryInfoKey(keyHandle_2)[0]
    #遍历子键内容    for j in range(num):
        subKeyName_2 = EnumKey(keyHandle_2, j)        #print(subKeyName_2)
        result_path = r'%s\%s' % (subDir_2, subKeyName_2)
        #获取具体键值内容并判断Service为disk        keyHandle_3 = OpenKey(regRoot, result_path)        numKey = QueryInfoKey(keyHandle_3)[1]
        for k in range(numKey):
            #获取USB名称            name, value, type_ = EnumValue(keyHandle_3, k)            if(('Service' in name) and ('disk'in value)):
                value,type_ = QueryValueEx(keyHandle_3,'FriendlyName')
                usb = value                uid = subKeyName_2                path = "USBSTOR" + "\\" + subKeyName + "\\" + subKeyName_2
                print(usb)
                print(uid)
                print(path)                
                print("")
    #关闭键值CloseKey(keyHandle)CloseKey(regRoot)

输出的USB记录键名如下图所示:

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

其中对应的注册表信息如下图所示,FriendlyName即是输出的“USB名称 Kingston DataTraveler 2.0 USB Device”,UID序号为“C860008862F1EE501A0F0105&0”,搜索的Service(服务)为disk(磁盘)的选项。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

简单总结:

个人感觉这方面的资料真心很少,文章博客也少,所以看起来操作似乎很简单,但真正实现起来还是令人深思的。然后就是其实存储USB记录的还有很多键值,如

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
    该键值中能看到厂商号(VID_)、厂商产品号(PID_),还有LocationInformation(端口号) Port_#0001.Hub_#0005等。

「Python黑帽」 获取注册表、U盘历史痕迹和回收站文件

 

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses
    该键值下有两个设备类:{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}{53F5630d-B6BF-11D0-94F2-00A0C91EFB8B},可以通过他们获取USB最后接入系统时间。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值