栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

[2021-10-02]信息安全实验8——USB操作

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[2021-10-02]信息安全实验8——USB操作

信息安全实验8——USB操作
      • 实验内容1:操作实验
      • 实验内容2:编程获取U盘信息(PID、VID)
      • 实验内容3:编程拷贝U盘文件

侵删~

获取PID和VID的实验参考了:Python 获取U盘的序列号 - 唐小沫 - 博客园 (cnblogs.com)和使用Python在Windows下获取USB PID&VID
拷贝U盘文件的实验参考了:Python实现识别U盘插入并复制其中数据

获取PID和VID的实验只能在插入一个U盘时停止运行并输出PID和VID,插入多个U盘时就一直输入PID和VID停不下来;拷贝U盘文件的实验只能覆盖文件,不能先对比文件,如果不同再复制。如果有大佬路过,球球教教我(菜鸡只会抄抄改改)~

实验内容1:操作实验

利用USB Dumper实现悄无声息地将U盘的数据拷贝到电脑上。

拷贝之前,U盘上的数据截图:

拷贝到电脑上的数据截图:

实验内容2:编程获取U盘信息(PID、VID)

通过百度搜索了解U盘的PID、VID等信息的意义,编程实现获取U盘中的PID、VID等信息的程序。编程语言不限、界面不限,提交源代码、可执行程序。可以使用工具ChipEasy或操作系统的设备管理器查看U盘的PID、VID等信息,验证自己写的程序是否正确。

编程语言:Python

开发工具:Python3.8 + PyCharm

运行截图:(打包时使用pyinstaller -F GetUSB.py,生成的可执行文件在执行时会自带一个运行窗口,方便查看U盘的PID和VID)

主要代码粘贴在下面(五号字体,不要粘贴全部代码,粘贴核心代码即可,代码不要超过6页):

import psutil
from io import StringIO
import win32com.client

def run():
  uf = StringIO()
  while True:
      disk_list = []
      for item in psutil.disk_partitions(): # 获取磁盘信息
          # 判断是不是U盘
          if "removable" in item.opts:# U盘的opts值为 removable
              # 获取U盘的盘符
              disk_list.append(item.mountpoint)
      # 把盘符写入内存,为了不持续请求
      if disk_list != []:
          for pf in disk_list:
              if pf not in uf.getvalue():
                  print("U盘插入" + pf)
                  uf.write(disk_list[0])
                  wmi = win32com.client.GetObject("winmgmts:")
                  for usb in wmi.InstancesOf("Win32_USBHub"):
                      # 旁门左道找到的特征,就是 U盘 对应的 Caption 值是 USB 大容量存储设备,用来判断它是不是U盘
                      if usb.Caption == "USB 大容量存储设备":
                          str = usb.DeviceID  # 例如我自己U盘是 USBVID_0930&PID_654550E549C20249B240693D900E
                          out1 = str.split("\")  # 根据  分割,得到一个 list 列表out1 = ['USB', 'VID_0930&PID_6545', '50E549C20249B240693D900E']
                          out2 = out1[1].split("&")  # 拿到list中的第二元素 VID_0930&PID_6545,再根据 & 进行分割,又得到一个list列表out2 = ['VID_0930', 'PID_6545']
                          out3 = out2[0].split("_")  # 再拿到 list列表out2 中的第一个元素 'VID_0930',再根据 _ 进行分割,得到list列表 out3 = ['VID', '0930']
                          out4 = out2[1].split("_")  # 再拿到 list列表out2 中的第二个元素 'PID_6545',再根据 _ 进行分割,得到list列表 out4 = ['PID', '6545']
                          print(out3[0] + ": " + out3[1])
                          print(out4[0] + ": " + out4[1])
      else:
          # 拔出u盘初始化内存
          uf = StringIO('hello')
          print("U盘拔出")
if __name__ == "__main__":
  run()
实验内容3:编程拷贝U盘文件

编程实现类似于USB Dumper的功能,悄无声息地将U盘的文件和文件夹都拷贝到电脑上。编程语言不限、界面不限,提交源代码、可执行程序。

编程语言:Python

开发工具:Python3.8 + PyCharm

主要代码粘贴在下面(五号字体,不要粘贴全部代码,粘贴核心代码即可,代码不要超过6页):

截图:

import os
import time
import psutil
from threading import Thread

targetRoot = 'D:DesktopCopyFileRoot'  # 目标目录
oldDiskName = []  # 旧的磁盘列表
number = 0  # 磁盘数,判断是否为第一次运行
if os.path.exists(targetRoot) == False:# 判断 D:DesktopCopyFileRoot 是否存在,存在返回 True,不存在返回 False
    os.makedirs(targetRoot)# 创建 D:DesktopCopyFileRoot 文件夹
    print(targetRoot + "创建成功")
else:
    print(targetRoot + "已存在")
'''
从sourcepath复制文件和目录到targetPath
'''

def copyfile(sourcePath, targetPath, threadName):
    for f in os.listdir(sourcePath):
        if (f == 'System Volume Information'):  # 过滤系统文件夹
            continue
        f1 = os.path.join(sourcePath, f)  # 连接源文件(目录)名
        f2 = os.path.join(targetPath, f)  # 连接目标文件(目录)名
        if os.path.isfile(f1):  # 如果为文件,则进行复制操作
            file1 = open(f1, 'rb')
            file2 = open(f2, 'wb')
            print(threadName + '-%s文件正在复制!' % (f1))
            file2.write(file1.read())
            print(threadName + '-%s文件复制成功!' % (f1))
        else:  # 如果为目录,创建新一级的目标目录,并递归操作
            print(threadName + '-%s目录正在复制!' % (f1))
            print(threadName + '-%s目标目录创建成功!' % (f2))
            if os.path.exists(f2):
                pass
            else:
                os.mkdir(f2)
            copyfile(f1, f2, threadName)
            print(threadName + '-%s目录复制成功!' % (f1))

'''
获取磁盘信息,并与上次获取的信息进行比较,判断是否有新的磁盘添加进来
'''
def getDiskMessage():
    global oldDiskName  # 声明全局变量
    global number
    if number == 0:  # 第一次操作,先获取一遍磁盘数据,然后返回
        for disk in psutil.disk_partitions():
            number = number + 1
            oldDiskName.append(disk.device[:2])  # 获取盘符信息
        return
    newDiskName = []  # 保存新获取的磁盘信息
    for disk in psutil.disk_partitions():
        newDiskName.append(disk.device[:2])  # 获取新的磁盘信息
    newDiskList = arrayCompare(oldDiskName, newDiskName)  # 获取新增盘符列表
    oldDiskName.clear()  # 清除旧盘符列表
    oldDiskName = newDiskName[:]  # 复制新盘符列表给旧盘符列表
    return newDiskList

'''
比较两个磁盘盘符列表,并返回新盘符列表中旧盘符列表没有的盘符名列表
'''
def arrayCompare(oldDiskName, newDiskName):
    newDiskList = []
    for name in newDiskName:
        if name not in oldDiskName:  # 旧盘符中没有,则添加这个到新增盘符列表中
            newDiskList.append(name)
    return newDiskList

'''
复制盘符name中的文件到目标目录中
'''
def copy(name, threadName):
    targetPath = os.path.join(targetRoot, name[:1])
    if os.path.exists(targetPath):
        pass
    else:
        os.mkdir(targetPath)
    copyfile(name, targetPath, threadName)  # 复制文件
    print(threadName + '-新磁盘:%s盘 复制成功!' % (name[:1]))

def main():
    getDiskMessage()  # 获取初始数据
    threadCount = 0  # 线程计数
    while True:
        newDiskList = getDiskMessage()  # 获取新数据
        print('新磁盘列表:' + str(newDiskList))
        for name in newDiskList:  # 根据新获取到的数据去复制文件
            thread = Thread(target=copy, args=(name, 'thread_' + str(threadCount),))  # 创建线程去复制指定磁盘
            thread.start()  # 开启线程
            print('thread_' + str(threadCount) + '-开始复制%s盘文件...' % (name[:1]))
            threadCount = threadCount + 1  # 线程计数+1
        time.sleep(2)  # 延时两秒进行下一次数据获取
if __name__ == '__main__':
    main()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/286633.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号