usbsacn实现了监控设备是否有非法接入,如果有usb设备非法接入,则会报警,向目标账户发送邮件,并且在log中记录日志。

利用usb设备的一些固定信息,比如PID,VID检测指定USB设备或者所有USB设备的插入与拔出状态。同时加入消息提醒和日志功能,做了一个简易的Windows版的usbscan。

代码实现:

VC提供了WM_DEVICECHANGE消息,但还需要RegisterDeviceNotification()注册要检测的“Device Interface Class GUID”才能获取到有用信息。

设备相关的GUID有 Device Class GUID、Device Interface Class GUID、 Interface GUID。

·Device Class GUID 是INF文件中Verison Section中指名的设备类GUID,它标志着此设备图标,此设备出现在哪一栏,电压电流等各种信息。

·Interface GUID是指驱动程序中的GUID,用于使用API打开此设备进行一系列读写操作。

·Device Interface Class GUID是Microsoft定义用来调用RegisterDeviceNotification()时所使用的一类GUID。

本次要使用的是GUID_DEVINTERFACE_USB_DEVICE,GUID(A5DCBF10-6530-11D2-901F-00C04FB951ED)写成代码为static const GUID x_guid = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED }。

窗口初始化函数为:

外联设备检测和目标信息读取:

消息通知函数:

效果展示:

在插入u盘设备之后,我的邮箱会受到一封提示信息,提示查看日志信息。

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 14 14:55:58 2022
​
@author: wangzhaolin
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from ctypes.wintypes import MSG
import time
import ctypes
from ctypes.wintypes import MSG
import ctypes.wintypes as wintypes
import smtplib
from email.mime.text import MIMEText
def send_mail(Alert):msg = MIMEText(Alert,'plain','utf-8')sender = ''password = ''receiver = ''mailto_list=['']smtp_server = 'smtp.qq.com'msg['From'] = ''msg['To'] = msg['Subject'] = 'security information'server = smtplib.SMTP(smtp_server,25)server.login(sender, password)server.set_debuglevel(1)server.sendmail(sender, receiver, msg.as_string())server.quit()NULL = 0
INVALID_HANDLE_VALUE = -1
DBT_DEVTYP_DEVICEINTERFACE = 5
DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000
DBT_DEVICEREMOVECOMPLETE = 0x8004
DBT_DEVICEARRIVAL = 0x8000
WM_DEVICECHANGE = 0x0219
WM_KEYDOWN = 0x0100user32 = ctypes.windll.user32
RegisterDeviceNotification = user32.RegisterDeviceNotificationW
UnregisterDeviceNotification = user32.UnregisterDeviceNotification
class GUID(ctypes.Structure):_pack_ = 1_fields_ = [("Data1", ctypes.c_ulong),("Data2", ctypes.c_ushort),("Data3", ctypes.c_ushort),("Data4", ctypes.c_ubyte * 8)]class DEV_BROADCAST_DEVICEINTERFACE(ctypes.Structure):_pack_ = 1_fields_ = [("dbcc_size", wintypes.DWORD),("dbcc_devicetype", wintypes.DWORD),("dbcc_reserved", wintypes.DWORD),("dbcc_classguid", GUID),("dbcc_name", ctypes.c_wchar * 260)]class DEV_BROADCAST_HDR(ctypes.Structure):_fields_ = [("dbch_size", wintypes.DWORD),("dbch_devicetype", wintypes.DWORD),("dbch_reserved", wintypes.DWORD)]GUID_DEVCLASS_PORTS = GUID(0x4D36E978, 0xE325, 0x11CE,(ctypes.c_ubyte * 8)(0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18))
GUID_DEVINTERFACE_USB_DEVICE = GUID(0xA5DCBF10, 0x6530, 0x11D2,(ctypes.c_ubyte * 8)(0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED))class MainWindow(QMainWindow):def __init__(self):QMainWindow.__init__(self)self.setupNotification()#注册usb插拔通知def setupNotification(self):dbh = DEV_BROADCAST_DEVICEINTERFACE()dbh.dbcc_size = ctypes.sizeof(DEV_BROADCAST_DEVICEINTERFACE)dbh.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACEdbh.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE  # GUID_DEVCLASS_PORTSself.hNofity = RegisterDeviceNotification(int(self.winId()),ctypes.byref(dbh),DEVICE_NOTIFY_WINDOW_HANDLE)if self.hNofity == NULL:print(ctypes.FormatError(), int(self.winId()))print("RegisterDeviceNotification failed")else:print("RegisterDeviceNotification success")def nativeEvent(self, eventType, msg):message = MSG.from_address(int(msg))#message = ctypes.wintypes.MSG.from_address(msg.__int__())if message.message == WM_DEVICECHANGE:  # 设备消息来了dev_name = '' #设备的名称if DBT_DEVICEARRIVAL == message.wParam or DBT_DEVICEREMOVECOMPLETE == message.wParam:dbh = DEV_BROADCAST_HDR.from_address(message.lParam)if dbh.dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE:dbd = DEV_BROADCAST_DEVICEINTERFACE.from_address(message.lParam)dev_name = dbd.dbcc_nameif message.wParam == DBT_DEVICEARRIVAL:  # 有设备接入print("device in:",dev_name)send_mail("设备插入,请查看日志信息")fo = open("log.txt","a")localtime = time.asctime( time.localtime(time.time()) )fo.write(localtime)fo.write("device in :")fo.write(dev_name)fo.write('\n')fo.close()elif message.wParam == DBT_DEVICEREMOVECOMPLETE:  # 有设备拔出send_mail("设备拔出,请查看日志信息")fo = open("log.txt","a")localtime = time.asctime( time.localtime(time.time()) )fo.write(localtime)fo.write("device out :")fo.write(dev_name)fo.write('\n')fo.close()return True, id(message)if message.message == WM_KEYDOWN:#按键消息来了print('有按键被按下了,key:',hex(message.wParam),message.wParam)return True, id(message)return False, id(message)app = QApplication(sys.argv)
​
window = MainWindow()
window.show()
sys.exit(app.exec_())

usb插入检测系统、支持实时日志记录、邮箱报警相关推荐

  1. 基于神经网络的目标检测论文之目标检测系统:实时路况检测系统的设计与实现

    第五章 实时路况检测系统的设计与实现 物体识别技术被广泛应用于人们的生产生活中.随着深度学习与云计算的飞速发展,带动了物体识别技术产生质的飞跃.高分辨率图像和检测的实时性要求越来越高. 从本章开始,我 ...

  2. 论文系统Step1:从日志记录中提取特定信息

    论文系统Step1:从日志记录中提取特定信息 前言 论文数据需要,需要实现从服务器日志中提取出用户的特定交互行为信息.日志内容如下: 自己需要获取"请求数据包一行的信息"及&quo ...

  3. 2分钟学会一个简单USB插入检测电路

    便携式设备经常会存在USB供电和锂电池供电并存的情况,那么当USB插入供电的时候如何实现系统自动识别并切断电池供电的呢?带着这个问题我们来看下今天的分享内容. 如下电路主要是实现USB插入自动检测的功 ...

  4. 一个简单USB插入检测电路

    便携式设备经常会存在USB供电和锂电池供电并存的情况,那么当USB插入供电的时候如何实现系统自动识别并切断电池供电的呢?带着这个问题我们来看下今天的分享内容. 如下电路主要是实现USB插入自动检测的功 ...

  5. 利用SpringMVC的AOP来实现后台系统的操作日志记录

    最近在项目中要求把后台的一些关键操作记录下来,想了好半天能想到的也就那两三种方式,要么就是写一个拦截器,然后再web.xml里面进行配置,要么就是就是在每个需要记录操作日志的代码里面进行拦截,最后我选 ...

  6. ElastAlert对ELK日志进行邮箱报警

    运行ElastAlert前提 要求 Elasticsearch ISO8601或Unix带时间戳的数据 Python 2.7 pip, 查看 requirements.txt Ubuntu 14.x上 ...

  7. otg usb 定位_USB OTG插入检测识别

    一 USB引脚一般四根线,定义如下: 为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚) A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时 B设 ...

  8. USB OTG插入检测识别

    一 USB引脚一般四根线,定义如下: 为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚) A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时 B设 ...

  9. 美团高性能终端实时日志系统建设实践

    你是否经常遇到线上需要日志排查问题但迟迟联系不上用户上报日志的情况?或者是否经常陷入由于存储空间不足而导致日志写不进去的囧境?本文介绍了美团是如何从0到1搭建高性能终端实时日志系统,从此彻底解决日志丢 ...

最新文章

  1. C++标准库math
  2. stm32采集脉冲信号_STM32 TIM 编码器模式采集编码器信号
  3. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型
  4. Tcpdump抓包工具的使用
  5. 具有可执行Tomcat的独立Web应用程序
  6. 解决: This application has no explicit mapping for /error, so you are seeing this as a fallback.
  7. 计算机丢失i4m.dll,ntd.dll难住机器人发烧友
  8. select a method for export 选项
  9. android studio 单元测试用法,基于Android Studio2.1.1 进行单元测试完整教程
  10. 读《探索需求-设计前的质量》有感三
  11. 三菱plc pwm指令_学会了这27条基本逻辑指令,你离熟练编程三菱PLC又近了一步!...
  12. P2495 [SDOI2011]消耗战(虚树+DP)
  13. 生成PDF的几种方式
  14. Infor SyteLine ERP 安装后中文语言设置
  15. 从0开始实现一个合成大西瓜
  16. HZAU毕设之装订边边距32 mm、非装订边边距25 mm的操作
  17. 这次的PION的总结
  18. html中如何访问ftp中的图片,CSS FTP上传网页图解教程
  19. 电脑知识:笔记本电脑边充电边用,对电池有损害吗?
  20. 在国企的日子(第四章 团建)

热门文章

  1. c语言char a 4,char a:4;是什么意思C++
  2. 【cocos2d-x 大型ARPG手游研发2----精灵的八面玲珑】
  3. 物联网还有哪些创业机会?
  4. 多边形套索及魔棒工具
  5. Django MVT简单实例
  6. 随心所欲Do whatever you want——Minecraft
  7. cassandra实战--物化视图(Materialized View)
  8. 【图解数据结构与算法】数据结构与算法知识点整理 Data Structures and Algorithms
  9. iOS8完美越狱在路上了吗?
  10. 虚拟电厂可视化大屏,深挖痛点精准减碳