PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Запрет на автозапуск флешки


Запрет на автозапуск флешки

Сообщений 1 страница 19 из 19

1

Смотрите, столкнулся с проблемой, что в мой компьютер суються отнюдь не белые и пушистые флехи. Хотелось бы сделать их доступ к ним по паролю. Реализуемо ли такое. Если да, то как?

0

2

Можно в реестре полностью заблокировать автозапуск с флешки.
А программно наверное можно это сделать, но нужно подумать как.

0

3

ну вот я ж о том же.

0

4

Как то пытался написать что то подобное, только без пароля. Вот некоторые наработки. Программа блокирует сменные носители. При выходе из программы всё разблокируется. Так и не довел до ума, так что дерзайте!

Код:
Global DeviceEvent
#WM_DEVICECHANGE=$219
#DBT_DEVICEARRIVAL=$8000 ;A device has been inserted
#DBT_DEVICEREMOVECOMPLETE=$8004 ;A device has been removed.

Procedure RemoveDevice(DriveLetter.s)
  #DIGCF_PRESENT = $2
  #DIGCF_ALLCLASSES = $4
 
  ; Constantes pour SetupDiGetDeviceRegistryProperty
  #SPDRP_ADDRESS = $1C
  #SPDRP_BUSNUMBER = $15
  #SPDRP_BUSTYPEGUID = $13
  #SPDRP_CAPABILITIES = $F
  #SPDRP_CHARACTERISTICS = $1B
  #SPDRP_CLASS = $7
  #SPDRP_CLASSGUID = $8
  #SPDRP_COMPATIBLEIDS = $2
  #SPDRP_CONFIGFLAGS = $A
  #SPDRP_DEVICEDESC = $0
  #SPDRP_DEVTYPE = $19
  #SPDRP_DRIVER = $9
  #SPDRP_ENUMERATOR_NAME = $16
  #SPDRP_EXCLUSIVE = $1A
  #SPDRP_FRIENDLYNAME = $C
  #SPDRP_HARDWAREID = $1
  #SPDRP_LEGACYBUSTYPE = $14
  #SPDRP_LOCATION_INFORMATION = $D
  #SPDRP_LOWERFILTERS = $12
  #SPDRP_MAXIMUM_PROPERTY = $1C
  #SPDRP_MFG = $B
  #SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $E
  #SPDRP_SECURITY = $17
  #SPDRP_SECURITY_SDS = $18
  #SPDRP_SERVICE = $4
  #SPDRP_UI_NUMBER = $10
  #SPDRP_UI_NUMBER_DESC_FORMAT = $1E
  #SPDRP_UNUSED0 = $3
  #SPDRP_UNUSED1 = $5
  #SPDRP_UNUSED2 = $6
  #SPDRP_UPPERFILTERS = $11
 
  ; Caracteristiques du device
  #CM_DEVCAP_LOCKSUPPORTED  = $1
  #CM_DEVCAP_EJECTSUPPORTED  = $2
  #CM_DEVCAP_REMOVABLE  = $4
  #CM_DEVCAP_DOCKDEVICE  = $8
  #CM_DEVCAP_UNIQUEID  = $10
  #CM_DEVCAP_SILENTINSTALL  = $20
  #CM_DEVCAP_RAWDEVICEOK  = $40
  #CM_DEVCAP_SURPRISEREMOVALOK  = $80
  #CM_DEVCAP_HARDWAREDISABLED  = $100
  #CM_DEVCAP_NONDYNAMIC  = $200
 
  Structure SP_DEVINFO_DATA
    cbSize.l
    ClassGuid.GUID
    DevInst.l
    reserved.l
  EndStructure
 
  #Memoire_Taille = 200
 
  Protected DeviceInfoData.SP_DEVINFO_DATA, DeviceCapabilities.l
  Protected *Memoire, Index
 
  DeviceInfoData\cbSize = SizeOf(DeviceInfoData)
 
  hDeviceInfoSet = SetupDiGetClassDevs_(0, 0, 0, #DIGCF_PRESENT | #DIGCF_ALLCLASSES)
  If hDeviceInfoSet <>#INVALID_HANDLE_VALUE
    Library = OpenLibrary(#PB_Any, "setupapi.dll")
    If Library
     
      *SetupDiGetDeviceInstanceId = GetFunction(Library, "SetupDiGetDeviceInstanceIdA")
      *SetupDiGetDeviceRegistryProperty = GetFunction(Library, "SetupDiGetDeviceRegistryPropertyA")
      *CM_Locate_DevNode = GetFunction(Library, "CM_Locate_DevNodeA")
      *CM_Request_Device_Eject = GetFunction(Library, "CM_Request_Device_Eject_ExA")
      *CM_Get_DevNode_Registry_Property = GetFunction(Library, "CM_Get_DevNode_Registry_PropertyA")
     
      While SetupDiEnumDeviceInfo_(hDeviceInfoSet, Index, @DeviceInfoData)
       
        *DeviceService = AllocateMemory(#Memoire_Taille)
        *DevicePhysicalName = AllocateMemory(#Memoire_Taille)
        *DeviceName = AllocateMemory(#Memoire_Taille)
        *DeviceDescription = AllocateMemory(#Memoire_Taille)
       
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_SERVICE, 0, *DeviceService, #Memoire_Taille, 0)
        ;Debug PeekS(*DeviceService)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_LOCATION_INFORMATION, 0, *DevicePhysicalName, #Memoire_Taille, 0)
        ;Debug PeekS(*DevicePhysicalName)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_FRIENDLYNAME, 0, *DeviceName, #Memoire_Taille, 0)
        ;Debug PeekS(*DeviceName)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_DEVICEDESC, 0, *DeviceDescription, #Memoire_Taille, 0)
        ;Debug PeekS(*DeviceDescription)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_CAPABILITIES, 0, @DeviceCapabilities, 4, 0)
       If UCase(PeekS(*DeviceService)) = "USBSTOR"
          *DeviceId = AllocateMemory(#Memoire_Taille)
          CallFunctionFast(*SetupDiGetDeviceInstanceId, hDeviceInfoSet, DeviceInfoData, *DeviceId, #Memoire_Taille, 0)
          DD$=PeekS(*DeviceId)
          If CallFunctionFast(*CM_Locate_DevNode, @DevInst.l, @DD$, 0) = 0
            CallFunctionFast(*CM_Request_Device_Eject, DevInst, 0, 0, 0, 0, 0)
          EndIf
          FreeMemory(*DeviceId)
        EndIf
       
        FreeMemory(*DeviceService)
        FreeMemory(*DevicePhysicalName)
        FreeMemory(*DeviceName)
        FreeMemory(*DeviceDescription)
        Index + 1
      Wend
     
      CloseLibrary(Librairie)
    EndIf
    SetupDiDestroyDeviceInfoList_(hDeviceInfoSet)
  EndIf
 
EndProcedure


Procedure GetDeviceEvent(WindowID,Message,wParam,lParam)
  ;Callback procedure to catch a removable device event
  result = #PB_ProcessPureBasicEvents
  If Message=#WM_DEVICECHANGE
    result = #True
    Select wParam
      Case #DBT_DEVICEARRIVAL
        ;MessageRequester("","Inserted",#PB_MessageRequester_Ok)
        RemoveDevice("i:\") 
      Case #DBT_DEVICEREMOVECOMPLETE
        MessageRequester("","Устройство USB деактивировано",#PB_MessageRequester_Ok)
    EndSelect
  EndIf
  ProcedureReturn result 
EndProcedure




SystemPath.s=Space(255) 
Result=GetSystemDirectory_(SystemPath.s,255) 
Window_Form1=OpenWindow(0,80,80,100,100,"DVD_USB_Look",#PB_Window_Invisible)
; окно программы у нас невидимое, но зато есть иконка в трее и меню.

CreatePopupMenu(0)
  MenuItem(1, "Выход")
  MenuItem(2, "О программе")
  MenuItem(3, "Заблокировать\Разблокировать")
; иконка программы в трее берётся из системной DLL - что зря её с собой таскать, если есть готовая...
AddSysTrayIcon(1, WindowID(0),ExtractIcon_(0,SystemPath+"\SetupAPI.dll",29)) ; 25 -я иконка DVD Lock
SysTrayIconToolTip(1, "DVD_USB_Look - разблокировано")

SetWindowCallback(@GetDeviceEvent())

Repeat

    EventID = WaitWindowEvent()
          
 If EventID = #PB_Event_SysTray
    Select EventType()
      Case #PB_EventType_RightClick ; Обработка правой кнопки мышки
      DisplayPopupMenu(0, WindowID(0)) ; показ вспывающего меню
      EndSelect
  EndIf
  
  If EventID = #PB_Event_Menu
    Select EventMenu()
      Case 1 
         Quit = 1
      Case 3
          ChangeSysTrayIcon(1,ExtractIcon_(0,SystemPath+"\SetupAPI.dll",25))
          SysTrayIconToolTip(1, "DVD_USB_Look - заблокировано")
      Case 2 
          MessageRequester("DVD_USB_Look", "Делает все внешние носители недоступными..", #PB_MessageRequester_Ok)
      EndSelect
  EndIf
    If EventID = #PB_Event_CloseWindow  ; Выходим из программы
      Quit = 1
    EndIf
Delay(10)
  Until Quit = 1
  
End

0

5

а запуск по паролю я знаю только как сделать консолью, а можно вот консольный input перенести в оконный.

идея с паролем:

Код:
Open Console()
p$=Input()
If p$="" ;в кавычках пишется пароль
;сама программа
Else
End
EndIf

или можно поместить пароль в файл

Код:
pt$=include('pass.ini')
Open Console()
p$=Input()
If p$=pt$
;сама программа
Else
End
EndIf

0

6

Сергей написал(а):

можно вот консольный input перенести в оконный

Можно так сделать:

Код:
String.s = InputRequester("Запрос пароля","Введите пароль","")
Debug String

0

7

Да, но когда я пишу условные операторы, то не получаются процедуры.

Код:
If string.s="11643"
;действия, действия, действия
Else
End
EndIf

даже, если я переношу в процедуры в конец бывают сбои

Отредактировано Сергей (24.03.2011 00:03:20)

0

8

Сергей написал(а):

Да, но когда я пишу условные операторы, то не получаются процедуры.

Всмысле?
Как одно мешает другому?

0

9

просто когда процедуры внутри условного оператора оно выдает ошипку

0

10

Сергей написал(а):

просто когда процедуры внутри условного оператора

А зачем туда засовывать сами процедуры?
Размести их выше по коду, а внутри условных операторов, вызывай.

0

11

ну я до этого уже и сам догадался.

0

12

наконецто додумал вариант выхода по паролю.
при нажатии на слове выход выскакивает консоль, куда надо ввести пароль, чтобы флешку не заблокировало.

Код:
Global DeviceEvent
#WM_DEVICECHANGE=$219
#DBT_DEVICEARRIVAL=$8000 ; носитель вставлен
#DBT_DEVICEREMOVECOMPLETE=$8004 ;носитель блокирован

Procedure RemoveDevice(DriveLetter.s)
  #DIGCF_PRESENT = $2
  #DIGCF_ALLCLASSES = $4
 
  ; Constantes pour SetupDiGetDeviceRegistryProperty
  #SPDRP_ADDRESS = $1C
  #SPDRP_BUSNUMBER = $15
  #SPDRP_BUSTYPEGUID = $13
  #SPDRP_CAPABILITIES = $F
  #SPDRP_CHARACTERISTICS = $1B
  #SPDRP_CLASS = $7
  #SPDRP_CLASSGUID = $8
  #SPDRP_COMPATIBLEIDS = $2
  #SPDRP_CONFIGFLAGS = $A
  #SPDRP_DEVICEDESC = $0
  #SPDRP_DEVTYPE = $19
  #SPDRP_DRIVER = $9
  #SPDRP_ENUMERATOR_NAME = $16
  #SPDRP_EXCLUSIVE = $1A
  #SPDRP_FRIENDLYNAME = $C
  #SPDRP_HARDWAREID = $1
  #SPDRP_LEGACYBUSTYPE = $14
  #SPDRP_LOCATION_INFORMATION = $D
  #SPDRP_LOWERFILTERS = $12
  #SPDRP_MAXIMUM_PROPERTY = $1C
  #SPDRP_MFG = $B
  #SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $E
  #SPDRP_SECURITY = $17
  #SPDRP_SECURITY_SDS = $18
  #SPDRP_SERVICE = $4
  #SPDRP_UI_NUMBER = $10
  #SPDRP_UI_NUMBER_DESC_FORMAT = $1E
  #SPDRP_UNUSED0 = $3
  #SPDRP_UNUSED1 = $5
  #SPDRP_UNUSED2 = $6
  #SPDRP_UPPERFILTERS = $11
 
  ; Caracteristiques du device
  #CM_DEVCAP_LOCKSUPPORTED  = $1
  #CM_DEVCAP_EJECTSUPPORTED  = $2
  #CM_DEVCAP_REMOVABLE  = $4
  #CM_DEVCAP_DOCKDEVICE  = $8
  #CM_DEVCAP_UNIQUEID  = $10
  #CM_DEVCAP_SILENTINSTALL  = $20
  #CM_DEVCAP_RAWDEVICEOK  = $40
  #CM_DEVCAP_SURPRISEREMOVALOK  = $80
  #CM_DEVCAP_HARDWAREDISABLED  = $100
  #CM_DEVCAP_NONDYNAMIC  = $200
 
  Structure SP_DEVINFO_DATA
    cbSize.l
    ClassGuid.GUID
    DevInst.l
    reserved.l
  EndStructure
 
  #Memoire_Taille = 200
 
  Protected DeviceInfoData.SP_DEVINFO_DATA, DeviceCapabilities.l
  Protected *Memoire, Index
 
  DeviceInfoData\cbSize = SizeOf(DeviceInfoData)
 
  hDeviceInfoSet = SetupDiGetClassDevs_(0, 0, 0, #DIGCF_PRESENT | #DIGCF_ALLCLASSES)
  If hDeviceInfoSet <>#INVALID_HANDLE_VALUE
    Library = OpenLibrary(#PB_Any, "setupapi.dll")
    If Library
     
      *SetupDiGetDeviceInstanceId = GetFunction(Library, "SetupDiGetDeviceInstanceIdA")
      *SetupDiGetDeviceRegistryProperty = GetFunction(Library, "SetupDiGetDeviceRegistryPropertyA")
      *CM_Locate_DevNode = GetFunction(Library, "CM_Locate_DevNodeA")
      *CM_Request_Device_Eject = GetFunction(Library, "CM_Request_Device_Eject_ExA")
      *CM_Get_DevNode_Registry_Property = GetFunction(Library, "CM_Get_DevNode_Registry_PropertyA")
     
      While SetupDiEnumDeviceInfo_(hDeviceInfoSet, Index, @DeviceInfoData)
       
        *DeviceService = AllocateMemory(#Memoire_Taille)
        *DevicePhysicalName = AllocateMemory(#Memoire_Taille)
        *DeviceName = AllocateMemory(#Memoire_Taille)
        *DeviceDescription = AllocateMemory(#Memoire_Taille)
       
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_SERVICE, 0, *DeviceService, #Memoire_Taille, 0)
        ;Debug PeekS(*DeviceService)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_LOCATION_INFORMATION, 0, *DevicePhysicalName, #Memoire_Taille, 0)
        ;Debug PeekS(*DevicePhysicalName)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_FRIENDLYNAME, 0, *DeviceName, #Memoire_Taille, 0)
        ;Debug PeekS(*DeviceName)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_DEVICEDESC, 0, *DeviceDescription, #Memoire_Taille, 0)
        ;Debug PeekS(*DeviceDescription)
        CallFunctionFast(*SetupDiGetDeviceRegistryProperty, hDeviceInfoSet, DeviceInfoData, #SPDRP_CAPABILITIES, 0, @DeviceCapabilities, 4, 0)
       If UCase(PeekS(*DeviceService)) = "USBSTOR"
          *DeviceId = AllocateMemory(#Memoire_Taille)
          CallFunctionFast(*SetupDiGetDeviceInstanceId, hDeviceInfoSet, DeviceInfoData, *DeviceId, #Memoire_Taille, 0)
          DD$=PeekS(*DeviceId)
          If CallFunctionFast(*CM_Locate_DevNode, @DevInst.l, @DD$, 0) = 0
            CallFunctionFast(*CM_Request_Device_Eject, DevInst, 0, 0, 0, 0, 0)
          EndIf
          FreeMemory(*DeviceId)
        EndIf
       
        FreeMemory(*DeviceService)
        FreeMemory(*DevicePhysicalName)
        FreeMemory(*DeviceName)
        FreeMemory(*DeviceDescription)
        Index + 1
      Wend
     
      CloseLibrary(Librairie)
    EndIf
    SetupDiDestroyDeviceInfoList_(hDeviceInfoSet)
  EndIf
 
EndProcedure


Procedure GetDeviceEvent(WindowID,Message,wParam,lParam)
  ;Callback procedure to catch a removable device event
  result = #PB_ProcessPureBasicEvents
  If Message=#WM_DEVICECHANGE
    result = #True
    Select wParam
      Case #DBT_DEVICEARRIVAL
        ;MessageRequester("","Inserted",#PB_MessageRequester_Ok)
        RemoveDevice("i:\") 
      Case #DBT_DEVICEREMOVECOMPLETE
        MessageRequester("","Устройство USB деактивировано",#PB_MessageRequester_Ok)
    EndSelect
  EndIf
  ProcedureReturn result 
EndProcedure


SystemPath.s=Space(255) 
Result=GetSystemDirectory_(SystemPath.s,255) 
Window_Form1=OpenWindow(0,80,80,100,100,"Khome USB Block",#PB_Window_Invisible)
; окно программы у нас невидимое, но зато есть иконка в трее и меню.

CreatePopupMenu(0)
  MenuItem(1, "Выход")
  MenuItem(2, "О программе")
  MenuItem(3, "Заблокировать\Разблокировать")
; иконка программы в трее берётся из системной DLL - что зря её с собой таскать, если есть готовая...
AddSysTrayIcon(1, WindowID(0),ExtractIcon_(0,SystemPath+"\SetupAPI.dll",25)) ; 25 -я иконка DVD Lock
SysTrayIconToolTip(1, "Khome USB Block - разблокировано")

SetWindowCallback(@GetDeviceEvent())

Repeat

    EventID = WaitWindowEvent()
          
 If EventID = #PB_Event_SysTray
    Select EventType()
      Case #PB_EventType_RightClick ; Обработка правой кнопки мышки
      DisplayPopupMenu(0, WindowID(0)) ; показ вспывающего меню
      EndSelect
  EndIf
  
  If EventID = #PB_Event_Menu
    Select EventMenu()
      Case 1 
  OpenConsole()
        pass1$=Input()
        If pass1$="11647"
          Quit = 1
        Else
          
        EndIf
        CloseConsole()
      Case 3
          ChangeSysTrayIcon(1,ExtractIcon_(0,SystemPath+"\SetupAPI.dll",25))
          SysTrayIconToolTip(1, "Khome USB Block - заблокировано")
      Case 2 
          MessageRequester("Khome USB Block", "Блокирует внешние носители", #PB_MessageRequester_Ok)
      EndSelect
  EndIf
    If EventID = #PB_Event_CloseWindow  ; Выходим из программы
      Quit = 1
    EndIf
Delay(10)
  Until Quit = 1
  
  End

0

13

Сергей написал(а):

наконецто додумал вариант выхода по паролю.

К стати, вот эта строчка

Код:
RemoveDevice("i:\")

Это потому, что у меня он "i", а на других компах какой угодно может быть! Просто код этот я не дописал, и экспериментировал конкретно с диском i. А в реалии надо определять какой диск вставили. Вот сегодня мусолим эту тему тут:

http://pbasic.spb.ru/phpBB2/viewtopic.p … highlight=

Советую прочитать, там есть как определить путь к флешке.

К стати, я забросил этот проект т.к. если в компьютере не отключен автозапуск флешек, то он срабатывает быстрее, чем флешка определяется и блокируется. Т.е. вначале вирус записывается в компьютер, а уж потом мы её сможем деакивировать. А если отключен автозапуск, то зачем мне вообще нужны какие то программы лишние в памяти? Короче, бесполезная это хрень...

0

14

ВиниПур написал(а):

я забросил этот проект т.к. если в компьютере не отключен автозапуск флешек, то он срабатывает быстрее, чем флешка определяется и блокируется. Т.е. вначале вирус записывается в компьютер, а уж потом мы её сможем деакивировать. А если отключен автозапуск, то зачем мне вообще нужны какие то программы лишние в памяти? Короче, бесполезная это хрень...

спасибо за прояснение. отключю подручными средствами автозапуск и все.

0

15

Зря вы относитесь к этой идее только как к антивирусной, есть такой комерческий продукт, не помню как название. Там у них реализована защита внутри корпоративной сети всех устройств внешнего доступа, точнее USB и DVDRW только по паролю или только от администратора. Продается за нехилые деньги. Играют ребята на страхе руководителей перед действиями подчиненных. Но там еще и лог есть кто, когда, куда, что, записал (если было открыт доступ).
Так что расти есть куда, да и рынок есть...))

0

16

а как програмка называется

0

17

Я имел в виду стоимость лицензий Zlock. Но есть и другие Devicelock, Filecontrol, Deviceinspector и еще можешь посмотреть http://www.infobezpeka.com/products/insider/. Там тоже есть повод для размышлений..))

0

18

Свежие вести с полей доказывают, что борьба с USB этими средствами бесполезна:

В этом докладе Джан Лаример представил несколько новых тех-
ник, которые может использовать малварь для автоматического
выполнения зловредной загрузки с USВ-накопителей и при этом
вообще не зависеть от системы AutoRun винды. Где тут секрет?
Существует большое количество кода, который выполняется между
USВ-драйверами и десктопными программами, которые, к примеру,
рендерят иконки и превьюшки для документов. Это открывает
sесuгitу-исследователям большое количество целей для эксплуатирования.
Причем поскольку обычные пейлоады (вроде открытия
шелла] здесь не всегда полезны, в докладе предложено несколько
альтернативных нагрузок , которые немедленно предоставляют
хакерам доступ к системе . Проблема касается не только Windows,
что продемонстрировал ресерчер, когда сумел разблокировать
экран Linux, вставив USВ-флешку в ноутбук.

Из последнего ][акера статья.

0

19

Код:
    Select EventMenu()
      Case 1 
  OpenConsole()
        pass1$=Input()
        If pass1$="11647"
          Quit = 1
        Else
          
        EndIf
        CloseConsole()

Я бы заменил на это:

Код:
    Select EventMenu()
      Case 1 
        pass1$=InputRequester("Запрос пороля", "Введите пароль", "",#PB_InputRequester_Password)
        If pass1$="11647"
          Quit = 1
        EndIf

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Запрет на автозапуск флешки