Что нового

Привязка к железу через DriveGetSerial, легко обойти! Есть ли аналоги?

Centurion

Новичок
Сообщения
23
Репутация
0
Привязал программу к железу по SN через DriveGetSerial. Но это все легко обходиться через создание и копирование образа.. Есть ли какие нибудь альтернативные способы привязки?


Добавлено:
Сообщение автоматически объединено:

Привязка происходит к съемным флешь накопителям
 

edward_freedom

Осваивающий
Сообщения
200
Репутация
44
OffTopic:
Любую защиту можно убрать с помощью декомплиятора, который свободно лежит в интернете
 
Автор
C

Centurion

Новичок
Сообщения
23
Репутация
0
Это понятно, но меня интересует именно привязка к железу.
 
Автор
C

Centurion

Новичок
Сообщения
23
Репутация
0
Эти темы я видел, там рассматривается когда программа привязывается к конкретному ПК, а мне надо именно к съемному накопителю, что бы она запускалась только с него.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
VladUs
Зачем повторять тему которую уже запостил edward_freedom? :smile:
 
Автор
C

Centurion

Новичок
Сообщения
23
Репутация
0
Видимо мне нужно получить SN самого устройства а не тома т.к. SN устройства не копируется через образ (насколько я понял). А как узнать этот SN
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Попробуйте поиграться с этим:

Код:
$oService = ObjGet('winmgmts:\\.\root\cimv2')
$oItem = $oService.ExecQuery('SELECT InterfaceType,PnPDeviceID FROM Win32_DiskDrive')
For $Property In $oItem
	If $Property.InterfaceType = 'USB' Then
		ConsoleWrite($Property.PnPDeviceID & @CR)
	EndIf
Next


После выполнения этого кода вы получите примерно следующую строку:

USBSTOR\DISK&VEN_JETFLASH&PROD_TS4GJFV30&REV_8.07\7QAIJQ2O&0

То, что выделено красным, не должно меняться от порта к порту и одинаково для флешек одной модели. Серийного номера, как такового, обычные фешки не имеют (?), только жесткие диски.

Если помножить эту информацию на серийный номер тома и взять не очень популярную флешку, то вы получите достаточно уникальный ID для привязки программы к флешке.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Yashied, а сигнатура не подойдёт в качестве уникального номера?
После форматирования сигнатура остаётся неизменной.
Код:
;...
ConsoleWrite($Property.Signature & @CR)
;...
 
Автор
C

Centurion

Новичок
Сообщения
23
Репутация
0
Garrett - а при копировании через образ?


Yashied - Если помножить эту информацию на серийный номер тома - можно пример если не затруднит
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Garrett

Сигнатуру генерирует Windows при первом подключении...

Centurion

Код:
#Include  <Crypt.au3>

ConsoleWrite(_UniqueUSBFlashID('E:') & @CR)

Func _UniqueUSBFlashID($sDrive)

	Local $oService, $oItems, $Hash, $Text = ''

	$oService = ObjGet('winmgmts:\\.\root\cimv2')
	If Not IsObj($oService) Then
		Return SetError(1, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition')
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If StringInStr($Property.Dependent, '"' & $sDrive & '"') Then
			$Text = StringTrimLeft($Property.Antecedent, StringInStr($Property.Antecedent, '='))
			ExitLoop
		EndIf
	Next
	If Not $Text Then
		Return SetError(3, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition')
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If StringInStr($Property.Dependent, $Text) Then
			$Text = StringTrimLeft($Property.Antecedent, StringInStr($Property.Antecedent, '='))
			ExitLoop
		EndIf
	Next
	If Not $Text Then
		Return SetError(3, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_DiskDrive WHERE DeviceID = ' & $Text)
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If $Property.InterfaceType = 'USB' Then
			$Text = StringTrimLeft($Property.PnPDeviceID, StringInStr($Property.PnPDeviceID, '&VEN_'))
			$Text = StringStripWS(StringLeft($Text, StringInStr($Text, '\', 0, -1) - 1), 8)
			$Text &= DriveGetFileSystem($sDrive) & DriveGetSerial($sDrive)
			$Text &= $Property.TotalCylinders
			$Text &= $Property.TotalHeads
			$Text &= $Property.TotalSectors
			$Text &= $Property.TotalTracks
			ExitLoop
		EndIf
	Next
	If Not $Text Then
		Return SetError(3, 0, '')
	EndIf
	$Hash = StringTrimLeft(_Crypt_HashData($Text, $CALG_MD5), 2)
	If Not $Hash Then
		Return SetError(4, 0, '')
	EndIf
	Return '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}'
EndFunc   ;==>_UniqueUSBFlashID
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Yashied [?]
Сигнатуру генерирует Windows при первом подключении...
То есть в момент самого первого подключения? Я правильно понял?
Потому как я неоднократно менял флешки пока экспериментировал, и сигнатуры у них оставались неизменными. :scratch:
 
Автор
C

Centurion

Новичок
Сообщения
23
Репутация
0
Yashiled
Я написал так _UniqueUSBFlashID(StringLeft(@ScriptDir, 2))) и он работает и на обычном HDD
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Centurion сказал(а):
Я написал так _UniqueUSBFlashID(StringLeft(@ScriptDir, 2))) и он работает и на обычном HDD

Я там немного ошибся...

Код:
#Include  <Crypt.au3>

ConsoleWrite(_UniqueUSBFlashID('E:') & @CR)

Func _UniqueUSBFlashID($sDrive)

	Local $oService, $oItems, $Hash, $Disk = '', $Part = '', $Text = ''

	$oService = ObjGet('winmgmts:\\.\root\cimv2')
	If Not IsObj($oService) Then
		Return SetError(1, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition')
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If StringInStr($Property.Dependent, '"' & $sDrive & '"') Then
			$Part = StringTrimLeft($Property.Antecedent, StringInStr($Property.Antecedent, '='))
			ExitLoop
		EndIf
	Next
	If Not $Part Then
		Return SetError(3, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition')
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If StringInStr($Property.Dependent, $Part) Then
			$Disk = StringTrimLeft($Property.Antecedent, StringInStr($Property.Antecedent, '='))
			ExitLoop
		EndIf
	Next
	If Not $Disk Then
		Return SetError(3, 0, '')
	EndIf
	$oItems = $oService.ExecQuery('SELECT * FROM Win32_DiskDrive WHERE DeviceID = ' & $Disk)
	If Not IsObj($oItems) Then
		Return SetError(2, 0, '')
	EndIf
	For $Property In $oItems
		If $Property.InterfaceType = 'USB' Then
			$Text = StringTrimLeft($Property.PnPDeviceID, StringInStr($Property.PnPDeviceID, '&VEN_'))
			$Text = StringStripWS(StringLeft($Text, StringInStr($Text, '\', 0, -1) - 1), 8)
			$Text &= DriveGetFileSystem($sDrive) & DriveGetSerial($sDrive)
			$Text &= $Property.TotalCylinders
			$Text &= $Property.TotalHeads
			$Text &= $Property.TotalSectors
			$Text &= $Property.TotalTracks
			ExitLoop
		EndIf
	Next
	If Not $Text Then
		Return SetError(3, 0, '')
	EndIf
	$Hash = StringTrimLeft(_Crypt_HashData($Text, $CALG_MD5), 2)
	If Not $Hash Then
		Return SetError(4, 0, '')
	EndIf
	Return '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}'
EndFunc   ;==>_UniqueUSBFlashID
 
Автор
C

Centurion

Новичок
Сообщения
23
Репутация
0
Он работает с обычными HDD?


Добавлено:
Сообщение автоматически объединено:

Все, понял. первый вариант для HDD и Flash второй только для Flash
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Первый вариант неправильный! Не используй его!
 
Верх