USBDeview

某个刑侦专家说过,走过必定留下痕迹,所以在一台电脑上,存在过的USB记录也是可以获取的。当然想法去解析记录可以,也可以直接使用USBDeview,解析软件最终结果。USBDeview 是一款可以列出当前连接到你的计算机上或者曾经连接到你的计算机上的所有 USB 设备的小型实用工具。

实现

检查并终止指定进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
pe_name = "USBDeview.exe"
for process in psutil.process_iter():
try:
name = process.name()
except:
name = ""
try:
if name == pe_name:
setting.log.error("检测到%s已在运行, 正在终止重启" % name)
process.terminate()
except Exception as e:
setting.log.error("终止失败,原因: %s" % str(e))
return

这部分代码首先定义了一个要检查的进程名 pe_name,然后遍历所有正在运行的进程。如果发现进程名为 USBDeview.exe,则尝试终止该进程,并记录日志。如果终止失败,也会记录日志并返回。

执行外部程序获取USB设备信息:

1
2
3
pe_path = os.path.join(setting.PROJ_PATH, pe_name)
save_path = os.path.join(setting.PROJ_PATH, "tmp.xml")
os.system("%s /sxml %s" % (pe_path, save_path))

这部分代码拼接了外部程序 USBDeview.exe 的路径和保存XML文件的路径,然后执行命令行命令,使用 USBDeview.exe 生成USB设备信息的XML文件。

解析XML文件:

1
2
3
4
5
6
if not os.path.exists(save_path):
setting.log.error("获取usb信息失败")
return

tree = ET.parse(save_path)
root = tree.getroot()

这部分代码检查XML文件是否存在,如果不存在则记录日志并返回。如果存在,则使用 ElementTree 模块解析XML文件,获取根节点。

遍历XML文件中的每个 item 节点:

1
2
3
for item in root.iter('item'):
# 解析每个item节点中的各个子节点,获取相应的信息
...

这部分代码遍历XML文件中的每个 item 节点,解析每个节点中的各个子节点,获取相应的信息。如果某个子节点不存在,则将相应的变量设置为空字符串。

构建源数据字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
source_data = {
"DeviceName": device_name,
"Description": description,
"DeviceType": device_type,
"Connected": connected,
"Disabled": disabled,
"ConnectTime": connect_time,
"DisconnectTime": disconnect_time,
"ServiceDescription": service_description,
"DriveLetter": drive_letter,
"RegisterTime1": registry_time_1,
"RegisterTime2": registry_time_2,
"InstallTime": install_time,
"FirstInstallTime": first_install_time
}

这部分代码将获取到的USB设备信息封装成一个字典。

处理数据并写入文件:

1
2
3
clean_data = get_line(self, source_data, self.display)
data = json.dumps(clean_data, ensure_ascii=False)
write_file(self.file, data)

这部分代码调用 get_line 方法处理 source_data,并将处理后的数据转换为 JSON 格式,然后写入到输出文件中。

删除临时XML文件:

1
os.remove(save_path)

这部分代码在处理完成后删除临时生成的XML文件。