usb插入检测系统、支持实时日志记录、邮箱报警
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插入检测系统、支持实时日志记录、邮箱报警相关推荐
- 基于神经网络的目标检测论文之目标检测系统:实时路况检测系统的设计与实现
第五章 实时路况检测系统的设计与实现 物体识别技术被广泛应用于人们的生产生活中.随着深度学习与云计算的飞速发展,带动了物体识别技术产生质的飞跃.高分辨率图像和检测的实时性要求越来越高. 从本章开始,我 ...
- 论文系统Step1:从日志记录中提取特定信息
论文系统Step1:从日志记录中提取特定信息 前言 论文数据需要,需要实现从服务器日志中提取出用户的特定交互行为信息.日志内容如下: 自己需要获取"请求数据包一行的信息"及&quo ...
- 2分钟学会一个简单USB插入检测电路
便携式设备经常会存在USB供电和锂电池供电并存的情况,那么当USB插入供电的时候如何实现系统自动识别并切断电池供电的呢?带着这个问题我们来看下今天的分享内容. 如下电路主要是实现USB插入自动检测的功 ...
- 一个简单USB插入检测电路
便携式设备经常会存在USB供电和锂电池供电并存的情况,那么当USB插入供电的时候如何实现系统自动识别并切断电池供电的呢?带着这个问题我们来看下今天的分享内容. 如下电路主要是实现USB插入自动检测的功 ...
- 利用SpringMVC的AOP来实现后台系统的操作日志记录
最近在项目中要求把后台的一些关键操作记录下来,想了好半天能想到的也就那两三种方式,要么就是写一个拦截器,然后再web.xml里面进行配置,要么就是就是在每个需要记录操作日志的代码里面进行拦截,最后我选 ...
- ElastAlert对ELK日志进行邮箱报警
运行ElastAlert前提 要求 Elasticsearch ISO8601或Unix带时间戳的数据 Python 2.7 pip, 查看 requirements.txt Ubuntu 14.x上 ...
- otg usb 定位_USB OTG插入检测识别
一 USB引脚一般四根线,定义如下: 为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚) A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时 B设 ...
- USB OTG插入检测识别
一 USB引脚一般四根线,定义如下: 为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚) A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时 B设 ...
- 美团高性能终端实时日志系统建设实践
你是否经常遇到线上需要日志排查问题但迟迟联系不上用户上报日志的情况?或者是否经常陷入由于存储空间不足而导致日志写不进去的囧境?本文介绍了美团是如何从0到1搭建高性能终端实时日志系统,从此彻底解决日志丢 ...
最新文章
- C++标准库math
- stm32采集脉冲信号_STM32 TIM 编码器模式采集编码器信号
- 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型
- Tcpdump抓包工具的使用
- 具有可执行Tomcat的独立Web应用程序
- 解决: This application has no explicit mapping for /error, so you are seeing this as a fallback.
- 计算机丢失i4m.dll,ntd.dll难住机器人发烧友
- select a method for export 选项
- android studio 单元测试用法,基于Android Studio2.1.1 进行单元测试完整教程
- 读《探索需求-设计前的质量》有感三
- 三菱plc pwm指令_学会了这27条基本逻辑指令,你离熟练编程三菱PLC又近了一步!...
- P2495 [SDOI2011]消耗战(虚树+DP)
- 生成PDF的几种方式
- Infor SyteLine ERP 安装后中文语言设置
- 从0开始实现一个合成大西瓜
- HZAU毕设之装订边边距32 mm、非装订边边距25 mm的操作
- 这次的PION的总结
- html中如何访问ftp中的图片,CSS FTP上传网页图解教程
- 电脑知识:笔记本电脑边充电边用,对电池有损害吗?
- 在国企的日子(第四章 团建)