找回密码
 加入
搜索
查看: 13319|回复: 19

[系统综合] 如何注册表封U盘,又不会被手动更改?

 火.. [复制链接]
发表于 2010-3-9 13:29:17 | 显示全部楼层 |阅读模式
最近想封U盘,但是苦于要用USB键盘不能封BIOS只能注册表下手,但是有些人可以记下来注册表的键值。所以有什么办法能封住USB,又能防止手动改注册表的键值呢?
发表于 2010-3-9 13:35:48 | 显示全部楼层
USB鼠标键盘在BIOS中设置时分开的吧,可以单独设置

在WINDOWS中,USB可移动磁盘也是可以查出来的,具体可以看pursole发的UDF,有专门的例子,包括检查是否有USB设备和卸载之,更简单的AU3自带函数查移动磁盘,有则杀之。。

修改注册表停用U盘,然后禁用注册表,太容易被破了
发表于 2010-3-9 13:36:38 | 显示全部楼层
禁用U盘的父设备就好了啊~
 楼主| 发表于 2010-3-9 14:21:47 | 显示全部楼层
禁用U盘的父设备就好了啊~
pusofalse 发表于 2010-3-9 13:36


能详细说明一下吗?
 楼主| 发表于 2010-3-9 14:23:30 | 显示全部楼层
我现在想把regedit.exe这个文件删除,但发现WIN会自己把这个文件恢复... 请问有什么办法吗?
 楼主| 发表于 2010-3-9 14:25:56 | 显示全部楼层
还有 没有regedit.exe 会不会影响winxp和office的正常运行?
发表于 2010-3-9 14:26:48 | 显示全部楼层
本帖最后由 pusofalse 于 2010-3-9 14:28 编辑
#include <SetupApi.au3>

Local $sDrive, $sDescr, $sDescr1, $sClassGuid, $sDevicePath
Local $hDevInst, $hDevs, $tDevInfo, $tDevIfInfo, $iIndex, $iMask, $iDisk

$sDrive = "H:" ; 要禁用的U盘。
$iDisk = _CM_Get_Drive_Disk_Number($sDrive) ; 获取U盘所在物理磁盘序号。

$sClassGuid = $GUID_DEVINTERFACE_DISK
$iMask = bitOR($DIGCF_PRESENT, $DIGCF_DEVICEINTERFACE)
$hDevs = _SetupDiGetClassDevs($iMask, $sClassGuid) ; 获取包含所有磁盘的设备集合句柄。

; 枚举系统中的所有物理磁盘,并找到指定物理磁盘的设备句柄。
While _SetupDiEnumDeviceInterfaces($hDevs, 0, $sClassGuid, $iIndex, $tDevIfInfo)
        $iIndex += 1

        ; 获取物理磁盘的物理路径。
        $sDevicePath = _SetupDiGetDeviceInterfaceDetail($hDevs, $tDevIfInfo, $tDevInfo)
        $sDevicePath = StringTrimLeft($sDevicePath, 4)

        ; 获取磁盘序号,判断是否是U盘所在的磁盘。
        If (_CM_Get_Drive_Disk_Number($sDevicePath) <> $iDisk) Or (@extended <> 7) Then
                ContinueLoop
        EndIf

        ; 获取设备描述。
        $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, 0xC)
        If ($sDescr = "") Then
                $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, 0)
        EndIf

        ; 设置寻找标识并跳出循环。
        ExitLoop _CM_Assign_Var($sDevicePath, "\\?" & $sDevicePath, 1)
WEnd

; 销毁信息集合句柄。
_SetupDiDestroyDeviceInfoList($hDevs)
_SetupDiApiBufferFree($tDevIfInfo)

; 判断是否找到指定物理磁盘的设备句柄。
If (StringLeft($sDevicePath, 4) <> "\\?") Then Exit

; 获取设备句柄。
$hDevInst = DllStructGetData($tDevInfo, "DevInst")

; 获取父设备句柄。
$hDevInst = _CM_Get_Parent($hDevInst)

; 获取设备DevNode标识。
$iMask = _CM_Get_DevNode_Status($hDevInst)

; 获取设备描述名称。
$sDescr1 = _CM_Get_DevNode_Registry_Property($hDevInst, 1)
If ($sDescr1 = "") Then
        $sDescr1 = _CM_Get_DevNode_Registry_Property($hDevInst, 0xD)
EndIf

; 判断父设备是否支持禁用操作。
If bitAnd($iMask, $DN_DISABLEABLE) <> $DN_DISABLEABLE Then
        Exit(Msgbox(48, $sDescr1, "Not support to disable~"))
EndIf

; 确认。
$iMask = Msgbox(49, $sDrive & " (" & $sDescr & ")", "Are you sure to disable '" & $sDescr1 & "'?")
If ($iMask = 2) Then Exit

; 根据设备句柄创建设备集合,并返回其句柄。
_CM_Create_Device_Devs($hDevInst, $hDevs, $tDevInfo)

; 禁用。
If _SetupDiDisableDevice($hDevs, $tDevInfo, 1) Then
        Msgbox(64, "Succeeded~", "Done~")
Else
        Msgbox(48, "Failed~", "Error code: " & @error)
EndIf

; 销毁设备集合。
_SetupDiDestroyDeviceInfoList($hDevs)
_SetupDiApiBufferFree($tDevInfo)
发表于 2010-3-9 14:41:11 | 显示全部楼层
regedit.exe 你要不用可以删除,应该没问题,删了自动恢复估计是系统文件保护所为,删了DLLCACHE里的REGEDIT试试

不过要达到你的目的,最好如楼上所为
发表于 2010-3-9 14:41:19 | 显示全部楼层
regedit.exe 你要不用可以删除,应该没问题,删了自动恢复估计是系统文件保护所为,删了DLLCACHE里的REGEDIT试试

不过要达到你的目的,最好如楼上所为
 楼主| 发表于 2010-3-10 09:56:04 | 显示全部楼层
最近想封U盘,但是苦于要用USB键盘不能封BIOS只能注册表下手,但是有些人可以记下来注册表的键值。所以有什么办法能封住USB,又能防止手动改注册表的键值呢?因为这个需求才想到写这个的,如果有更好的办法请告诉我。因为这个办法是下策。
运行程序后,你的regedit.exe(注册表管理器)会被改名,输入密码123会进行正常的U盘开关。输入1234会将regedit.exe(注册表管理器)的名字改回来。

文件在 http://www.autoitx.com/thread-13439-1-1.html

        脚本功能:利用密码判定的方式开关U盘,利用更改regedit.exe(注册表管理器)名称的方式禁止手动更改注册表设置
        工作原理:
        1.程序驱动
        2.更改regedit.exe的名称造成用户找不到regedit.exe文件
        3.判定密码
        4.通过密码来设定不同的注册表和是否还原regedit.exe
        计划完善
        1.测试可行性
        2.win会自行报错
        3.360会报危险
#NoTrayIcon 
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=..\..\..\图标\优化图标\winxp\toolbar\Toolbar _ Delete.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Fileversion=1.0.0.2
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
#Obfuscator_Parameters=123
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#Region AutoIt3Wrapper 预编译参数(常用参数)
;#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%                ;自定义资源段
;#AutoIt3Wrapper_Run_Tidy=                                                   ;脚本整理
;#AutoIt3Wrapper_Run_Obfuscator=                                                      ;代码迷惑
;#AutoIt3Wrapper_Run_AU3Check=                                                                 ;语法检查
;#AutoIt3Wrapper_Run_Before=                                                                 ;运行前
;#AutoIt3Wrapper_Run_After=                                                                        ;运行后
#EndRegion AutoIt3Wrapper 预编译参数(常用参数)
#cs ____________________________________
        
        AutoIt 版本: 3.2.12.0 (第一版)
        脚本作者:
        Email:
        QQ/TM:
        脚本版本:
        脚本功能:利用密码判定的方式开关U盘,利用更改regedit.exe(注册表管理器)名称的方式禁止手动更改注册表设置
        工作原理:
        1.程序驱动
        2.更改regedit.exe的名称造成用户找不到regedit.exe文件
        3.判定密码
        4.通过密码来设定不同的注册表和是否还原regedit.exe
        计划完善
        1.测试可行性
        2.win会自行报错
        3.360会报危险
        
#ce _______________脚本开始_________________




Select
        Case FileExists(@WindowsDir&"\regedit.exe") = 1
    ;MsgBox(4096, @WindowsDir&"\regedit.exe 文件", "存在")
        FileMove(@WindowsDir&"\regedit.exe", @WindowsDir&"\reg.iog")
        DirCreate(@WindowsDir&"\regedit.exe")
        
        ;MsgBox(4096, @SystemDir&"\dllcache\regedit.exe", "存在")
        
        FileMove(@SystemDir&"\dllcache\regedit.exe", @SystemDir&"\dllcache\reg.iog")
        DirRemove(@WindowsDir&"\regedit.exe", 1)
        Case FileExists(@WindowsDir&"\regedit.exe") = 0
    ;MsgBox(4096, @WindowsDir&"\regedit.exe 文件", "不存在")
        Case Else
    ;MsgBox(4096, @WindowsDir&"\regedit.exe 文件", "错误")
EndSelect

Dim $var,$state,$issue
$var = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR", "Start")
Select
        Case $var = 3
                $state = "保护现在处于关闭状态"
                $issue = "打开"
        Case $var = 4
                $state = "保护现在处于打开状态"
                $issue = "关闭"
        Case Else
                $state = "保护现在处于未知错误状态"
                $issue = "关闭"
EndSelect
#Region --- CodeWizard generated code Start ---
;InputBox features: Title=Yes, Prompt=Yes, Default Text=No
If Not IsDeclared("sInputBoxAnswer") Then Local $sInputBoxAnswer
$sInputBoxAnswer = InputBox("移动设备安全开关", $state & ",如果要" & $issue & "请输入安全密码.", "", "*", "-1", "-1", "-1", "-1")
Select
        Case @error = 0 ;OK - The string returned is valid
                 if $sInputBoxAnswer = "1234" Then
                        FileMove(@SystemDir&"\dllcache\reg.iog", @SystemDir&"\dllcache\regedit.exe")
                        Sleep(2000)
                        FileMove(@WindowsDir&"\reg.iog", @WindowsDir&"\regedit.exe")
                        MsgBox(0,"","注册表加密保护已经卸载")
                        EndIf
                If $sInputBoxAnswer = "123" Then
                        Select
                                Case $var = 3
                                        RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR", "Start", "REG_DWORD", "00000004")
                                        Sleep(200)
                                        $var1 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR", "Start")
                                        If $var1 <> 4 Then
                                                MsgBox(0, "错误", "操作失败")
;### Tidy Error: If/ElseIf statement without a then..
                    ElseIf         $var1 = 4 Then
                                                        MsgBox(0, "成功", "保护已打开")
                                                EndIf
                                        Case $var = 4
                                                RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR", "Start", "REG_DWORD", "00000003")
                                        $var1 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR", "Start")
                                        If $var1 <> 3 Then
                                                MsgBox(0, "错误", "操作失败")
;### Tidy Error: If/ElseIf statement without a then..
                    ElseIf         $var1 = 3 Then
                                                        MsgBox(0, "成功", "保护已关闭")
                                                EndIf
                                        Case Else
                                                RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR", "Start", "REG_DWORD", "00000004")
;### Tidy Error -> "endselect" is closing previous "case"
                                EndSelect
;### Tidy Error -> "elseif" is closing previous "select"
                        ElseIf $sInputBoxAnswer <> "ootc" Then
                                MsgBox(4096, "", "密码错误,操作未被执行")
;### Tidy Error -> "endif" is closing previous "select"
                        EndIf
                Case @error = 1 ;The Cancel button was pushed

                Case @error = 3 ;The InputBox failed to open

;### Tidy Error -> "endselect" is closing previous "case"
        EndSelect
        #EndRegion --- CodeWizard generated code Start ---
发表于 2010-3-11 22:05:52 | 显示全部楼层
本帖最后由 shqf 于 2010-3-11 22:11 编辑

  一方要禁用,一方要启用,双方比的是智慧。技术很重要,有时换个思路也能取到不错的效果。10楼的方法我曾用过,但插入U盘后会在设备管理器中出现一个问号,只要重新安装一下就可启用USB移动存储设备,所以很快被人破解了。还有他人或从网上下个regedit.exe,或从网上邻居拷一个,再在注册表相应位置把4改成3就行了。7楼的代码对我而言有点深了,看不大懂,而我的系统把硬盘是当作一个移动盘的,不敢试。还有要禁用的U盘盘符是固定的? 如果是的话,那要是有多台电脑要禁就不方便了,或插入两个U盘会怎样呢?。
  以下是我用AU3编的一个USB移动存储设备管理程序,不影响USB鼠标、键盘、打印机等设备的接入。就技术而言比以上两个程序要简单多,只是改注册表两处。要是你能找到这二个修改处,就破解了,不过你能找到吗?或化多少时间才能找到?不要用反编译的方法,因为谁要是需要,我可以公开思路或源码的(注意禁用后重启系统再看看禁用的效果,启用的口令是456789,郁闷的是360杀毒最近把它报为Gen:Trojan.Heur.AutoIT.Oq3@b4tlMcbj木马了)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-3-11 22:11:44 | 显示全部楼层
..如果只是注册表操作禁用USB的话,用监控注册表的办法,不就直接找到修改过的地方了么。。
发表于 2010-3-11 23:14:26 | 显示全部楼层
这个程序是菜鸟编的,用来对付菜鸟。找到答案的人是我这个菜鸟眼中的高手,但要等真正找到以后。从思路到找到答案有时也不是一帆风顺的。
发表于 2010-3-11 23:44:12 | 显示全部楼层
回复 13# shqf


    O-0 3-4 呵呵
发表于 2010-3-12 00:07:22 | 显示全部楼层
回复 2# llztt


    pursole - -||| 这果真算是一个无聊的名字,但比起pusofalse,离“至极”的境界还差得远。无聊至极的人总该有一个无聊至极的名称相配,我决定无视pursole~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-20 01:58 , Processed in 0.083595 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表