IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> [2021-10-02]信息安全实验8——USB操作 -> 正文阅读

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

侵删~

获取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盘上的数据截图:

img

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

img

实验内容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)

img

主要代码粘贴在下面(五号字体,不要粘贴全部代码,粘贴核心代码即可,代码不要超过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盘是 USB\VID_0930&PID_6545\50E549C20249B240693D900E
                          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页):

截图:

img

img

img

img

import os
import time
import psutil
from threading import Thread

targetRoot = 'D:\Desktop\CopyFileRoot'  # 目标目录
oldDiskName = []  # 旧的磁盘列表
number = 0  # 磁盘数,判断是否为第一次运行
if os.path.exists(targetRoot) == False:# 判断 D:\Desktop\CopyFileRoot 是否存在,存在返回 True,不存在返回 False
    os.makedirs(targetRoot)# 创建 D:\Desktop\CopyFileRoot 文件夹
    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()
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:15:42  更:2021-10-03 17:17:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/23 9:47:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计