MsgBox(0,"",_UniqueHardwareID(0x01 + 0x02))
$key = "FC2895A3EE73FF8B530927CDAA5EB96D";тут для примера указываешь свой ключ _UniqueHardwareID(0x01 + 0x02)
if StringRegExp($key, _UniqueHardwareID(0x01 + 0x02)) = 1 Then
MsgBox(0,"","ключ найден")
Else
MsgBox(0,"","ключ не найден")
EndIf
Func _UniqueHardwareID($iFlags = 0)
Local $oService = ObjGet('winmgmts:\\.\root\cimv2')
If Not IsObj($oService) Then
Return SetError(1, 0, '')
EndIf
Local $oItems, $Hash, $Text, $Hw = '', $Result = 0
$oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct')
If Not IsObj($oItems) Then
Return SetError(2, 0, '')
EndIf
For $Property In $oItems
$Hw &= $Property.IdentifyingNumber
$Hw &= $Property.Name
$Hw &= $Property.SKUNumber
$Hw &= $Property.UUID
$Hw &= $Property.Vendor
$Hw &= $Property.Version
Next
$Hw = StringStripWS($Hw, 8)
If Not $Hw Then
Return SetError(3, 0, '')
EndIf
If BitAND($iFlags, 0x0001) Then
$oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS')
If Not IsObj($oItems) Then
Return SetError(2, 0, '')
EndIf
$Text = ''
For $Property In $oItems
$Text &= $Property.IdentificationCode
$Text &= $Property.Manufacturer
$Text &= $Property.Name
$Text &= $Property.SerialNumber
$Text &= $Property.SMBIOSMajorVersion
$Text &= $Property.SMBIOSMinorVersion
Next
$Text = StringStripWS($Text, 8)
If $Text Then
$Result += 0x0001
$Hw &= $Text
EndIf
EndIf
If BitAND($iFlags, 0x0002) Then
$oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor')
If Not IsObj($oItems) Then
Return SetError(2, 0, '')
EndIf
$Text = ''
For $Property In $oItems
$Text &= $Property.Architecture
$Text &= $Property.Family
$Text &= $Property.Level
$Text &= $Property.Manufacturer
$Text &= $Property.Name
$Text &= $Property.ProcessorId
$Text &= $Property.Revision
$Text &= $Property.Version
Next
$Text = StringStripWS($Text, 8)
If $Text Then
$Result += 0x0002
$Hw &= $Text
EndIf
EndIf
$Hash = __MD5($Hw)
If Not $Hash Then
Return SetError(4, 0, '')
EndIf
Return SetError(0, $Result, $Hash)
Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}')
EndFunc
Func __MD5($sData)
Local $Ret, $hProv, $hHash, $tData, $Error = 1
$hProv = DllCall('advapi32.dll', 'int', 'CryptAcquireContextW', 'ptr*', 0, 'ptr', 0, 'ptr', 0, 'dword', 3, 'dword', 0xF0000000)
If (@error) Or (Not $hProv[0]) Then
Return ''
EndIf
Do
$hHash = DllCall('advapi32.dll', 'int', 'CryptCreateHash', 'ptr', $hProv[1], 'uint', 0x00008003, 'ptr', 0, 'dword', 0, 'ptr*', 0)
If (@error) Or (Not $hProv[0]) Then
$hHash = 0
ExitLoop
EndIf
$hHash = $hHash[5]
$tData = DllStructCreate('byte[' & BinaryLen($sData) & ']')
DllStructSetData($tData, 1, $sData)
$Ret = DllCall('advapi32.dll', 'int', 'CryptHashData', 'ptr', $hHash, 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1)
If (@error) Or (Not $Ret[0]) Then
ExitLoop
EndIf
$tData = DllStructCreate('byte[16]')
$Ret = DllCall('advapi32.dll', 'int', 'CryptGetHashParam', 'ptr', $hHash, 'dword', 2, 'ptr', DllStructGetPtr($tData), 'dword*', 16, 'dword', 0)
If (@error) Or (Not $Ret[0]) Then
ExitLoop
EndIf
$Error = 0
Until 1
If $hHash Then
DllCall('advapi32.dll', 'int', 'CryptDestroyHash', 'ptr', $hHash)
EndIf
If $Error Then
Return ''
EndIf
Return StringTrimLeft(DllStructGetData($tData, 1), 2)
EndFunc
MsgBox(0,"",_UniqueHardwareID(0x01 + 0x02))
$key = "FC2895A3EE73FF8B530927CDAA5EB96D";тут сам твой ключ полученный чреез _UniqueHardwareID(0x01 + 0x02)
;генерируем ключ через _GetKey(_UniqueHardwareID(0x01 + 0x02)
$key = _GetKey($key)
MsgBox(0,"",_GetKey(_UniqueHardwareID(0x01 + 0x02)))
if StringRegExp($key,_GetKey(_UniqueHardwareID(0x01 + 0x02))) = 1 Then
MsgBox(0,"","ключ найден")
Else
MsgBox(0,"","ключ не найден")
EndIf
Func _GetKey($userid)
$hash = __md5($userid)
Return StringMid($hash, 1, 7) & "-" & StringMid($hash, 9, 7) & "-" & StringMid($hash, 13, 7) & "-" & StringMid($hash, 17, 7) & "-" & StringMid($hash, 21, 7)
EndFunc
Func _UniqueHardwareID($iFlags = 0)
Local $oService = ObjGet('winmgmts:\\.\root\cimv2')
If Not IsObj($oService) Then
Return SetError(1, 0, '')
EndIf
Local $oItems, $Hash, $Text, $Hw = '', $Result = 0
$oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct')
If Not IsObj($oItems) Then
Return SetError(2, 0, '')
EndIf
For $Property In $oItems
$Hw &= $Property.IdentifyingNumber
$Hw &= $Property.Name
$Hw &= $Property.SKUNumber
$Hw &= $Property.UUID
$Hw &= $Property.Vendor
$Hw &= $Property.Version
Next
$Hw = StringStripWS($Hw, 8)
If Not $Hw Then
Return SetError(3, 0, '')
EndIf
If BitAND($iFlags, 0x0001) Then
$oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS')
If Not IsObj($oItems) Then
Return SetError(2, 0, '')
EndIf
$Text = ''
For $Property In $oItems
$Text &= $Property.IdentificationCode
$Text &= $Property.Manufacturer
$Text &= $Property.Name
$Text &= $Property.SerialNumber
$Text &= $Property.SMBIOSMajorVersion
$Text &= $Property.SMBIOSMinorVersion
Next
$Text = StringStripWS($Text, 8)
If $Text Then
$Result += 0x0001
$Hw &= $Text
EndIf
EndIf
If BitAND($iFlags, 0x0002) Then
$oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor')
If Not IsObj($oItems) Then
Return SetError(2, 0, '')
EndIf
$Text = ''
For $Property In $oItems
$Text &= $Property.Architecture
$Text &= $Property.Family
$Text &= $Property.Level
$Text &= $Property.Manufacturer
$Text &= $Property.Name
$Text &= $Property.ProcessorId
$Text &= $Property.Revision
$Text &= $Property.Version
Next
$Text = StringStripWS($Text, 8)
If $Text Then
$Result += 0x0002
$Hw &= $Text
EndIf
EndIf
$Hash = __MD5($Hw)
If Not $Hash Then
Return SetError(4, 0, '')
EndIf
Return SetError(0, $Result, $Hash)
Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}')
EndFunc
Func __MD5($sData)
Local $Ret, $hProv, $hHash, $tData, $Error = 1
$hProv = DllCall('advapi32.dll', 'int', 'CryptAcquireContextW', 'ptr*', 0, 'ptr', 0, 'ptr', 0, 'dword', 3, 'dword', 0xF0000000)
If (@error) Or (Not $hProv[0]) Then
Return ''
EndIf
Do
$hHash = DllCall('advapi32.dll', 'int', 'CryptCreateHash', 'ptr', $hProv[1], 'uint', 0x00008003, 'ptr', 0, 'dword', 0, 'ptr*', 0)
If (@error) Or (Not $hProv[0]) Then
$hHash = 0
ExitLoop
EndIf
$hHash = $hHash[5]
$tData = DllStructCreate('byte[' & BinaryLen($sData) & ']')
DllStructSetData($tData, 1, $sData)
$Ret = DllCall('advapi32.dll', 'int', 'CryptHashData', 'ptr', $hHash, 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1)
If (@error) Or (Not $Ret[0]) Then
ExitLoop
EndIf
$tData = DllStructCreate('byte[16]')
$Ret = DllCall('advapi32.dll', 'int', 'CryptGetHashParam', 'ptr', $hHash, 'dword', 2, 'ptr', DllStructGetPtr($tData), 'dword*', 16, 'dword', 0)
If (@error) Or (Not $Ret[0]) Then
ExitLoop
EndIf
$Error = 0
Until 1
If $hHash Then
DllCall('advapi32.dll', 'int', 'CryptDestroyHash', 'ptr', $hHash)
EndIf
If $Error Then
Return ''
EndIf
Return StringTrimLeft(DllStructGetData($tData, 1), 2)
EndFunc
Надеюсь вопрос с декомпиляцией решили?Хочу сделать привязку по "Железу" для скрипта, что бы я мог сделать запуск по ключу активации
Программа не сильно популярна, не думаю что люди станут заморачиватьсяНадеюсь вопрос с декомпиляцией решили?
Потому что если программа будет действительно востребованной, ее без труда декомпилируют и "вылечат от жадности".
А если программа мало кому нужна, то ее тоже декомпилируют и "вылечат от жадности", но не сразу и есть вероятность что программа не попадет в открытый доступ.
Если будет не сложно, я бы связался с тобой в Discord - NeverLoose#9192 либо Telegram - https://t.me/tsigunFДумаю, как простой вариант пойдет, а там уже допилишь базу для сверки
Код:MsgBox(0,"",_UniqueHardwareID(0x01 + 0x02)) $key = "FC2895A3EE73FF8B530927CDAA5EB96D";тут для примера указываешь свой ключ _UniqueHardwareID(0x01 + 0x02) if StringRegExp($key, _UniqueHardwareID(0x01 + 0x02)) = 1 Then MsgBox(0,"","ключ найден") Else MsgBox(0,"","ключ не найден") EndIf Func _UniqueHardwareID($iFlags = 0) Local $oService = ObjGet('winmgmts:\\.\root\cimv2') If Not IsObj($oService) Then Return SetError(1, 0, '') EndIf Local $oItems, $Hash, $Text, $Hw = '', $Result = 0 $oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf For $Property In $oItems $Hw &= $Property.IdentifyingNumber $Hw &= $Property.Name $Hw &= $Property.SKUNumber $Hw &= $Property.UUID $Hw &= $Property.Vendor $Hw &= $Property.Version Next $Hw = StringStripWS($Hw, 8) If Not $Hw Then Return SetError(3, 0, '') EndIf If BitAND($iFlags, 0x0001) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.IdentificationCode $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.SerialNumber $Text &= $Property.SMBIOSMajorVersion $Text &= $Property.SMBIOSMinorVersion Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0001 $Hw &= $Text EndIf EndIf If BitAND($iFlags, 0x0002) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.Architecture $Text &= $Property.Family $Text &= $Property.Level $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.ProcessorId $Text &= $Property.Revision $Text &= $Property.Version Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0002 $Hw &= $Text EndIf EndIf $Hash = __MD5($Hw) If Not $Hash Then Return SetError(4, 0, '') EndIf Return SetError(0, $Result, $Hash) Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}') EndFunc Func __MD5($sData) Local $Ret, $hProv, $hHash, $tData, $Error = 1 $hProv = DllCall('advapi32.dll', 'int', 'CryptAcquireContextW', 'ptr*', 0, 'ptr', 0, 'ptr', 0, 'dword', 3, 'dword', 0xF0000000) If (@error) Or (Not $hProv[0]) Then Return '' EndIf Do $hHash = DllCall('advapi32.dll', 'int', 'CryptCreateHash', 'ptr', $hProv[1], 'uint', 0x00008003, 'ptr', 0, 'dword', 0, 'ptr*', 0) If (@error) Or (Not $hProv[0]) Then $hHash = 0 ExitLoop EndIf $hHash = $hHash[5] $tData = DllStructCreate('byte[' & BinaryLen($sData) & ']') DllStructSetData($tData, 1, $sData) $Ret = DllCall('advapi32.dll', 'int', 'CryptHashData', 'ptr', $hHash, 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $tData = DllStructCreate('byte[16]') $Ret = DllCall('advapi32.dll', 'int', 'CryptGetHashParam', 'ptr', $hHash, 'dword', 2, 'ptr', DllStructGetPtr($tData), 'dword*', 16, 'dword', 0) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $Error = 0 Until 1 If $hHash Then DllCall('advapi32.dll', 'int', 'CryptDestroyHash', 'ptr', $hHash) EndIf If $Error Then Return '' EndIf Return StringTrimLeft(DllStructGetData($tData, 1), 2) EndFunc
Сообщение автоматически объединено:
Или можно сделать так, чтоб ключ хранился где то на компьютере, но тогда нужно будет делать что то вроде системы, тебе кинули ключ, ты его прогнал через программу и на выходе получил другой ключ, который уже отправляешь пользователю и он его указывает
грубо говоря тебе скидывают ключ полученный от _UniqueHardwareID(0x01 + 0x02)
ты этот ключ прогоняешь через _GetKey и высылаешь конечному пользователю
он этот ключ указывает и программа записывает где нибудь его хранение (к примеру реестр или ini файл) и далее уже сверяет в самом скрипте
p.s для проверки не забудь изменить $key на свой
Код:MsgBox(0,"",_UniqueHardwareID(0x01 + 0x02)) $key = "FC2895A3EE73FF8B530927CDAA5EB96D";тут сам твой ключ полученный чреез _UniqueHardwareID(0x01 + 0x02) ;генерируем ключ через _GetKey(_UniqueHardwareID(0x01 + 0x02) $key = _GetKey($key) MsgBox(0,"",_GetKey(_UniqueHardwareID(0x01 + 0x02))) if StringRegExp($key,_GetKey(_UniqueHardwareID(0x01 + 0x02))) = 1 Then MsgBox(0,"","ключ найден") Else MsgBox(0,"","ключ не найден") EndIf Func _GetKey($userid) $hash = __md5($userid) Return StringMid($hash, 1, 7) & "-" & StringMid($hash, 9, 7) & "-" & StringMid($hash, 13, 7) & "-" & StringMid($hash, 17, 7) & "-" & StringMid($hash, 21, 7) EndFunc Func _UniqueHardwareID($iFlags = 0) Local $oService = ObjGet('winmgmts:\\.\root\cimv2') If Not IsObj($oService) Then Return SetError(1, 0, '') EndIf Local $oItems, $Hash, $Text, $Hw = '', $Result = 0 $oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf For $Property In $oItems $Hw &= $Property.IdentifyingNumber $Hw &= $Property.Name $Hw &= $Property.SKUNumber $Hw &= $Property.UUID $Hw &= $Property.Vendor $Hw &= $Property.Version Next $Hw = StringStripWS($Hw, 8) If Not $Hw Then Return SetError(3, 0, '') EndIf If BitAND($iFlags, 0x0001) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.IdentificationCode $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.SerialNumber $Text &= $Property.SMBIOSMajorVersion $Text &= $Property.SMBIOSMinorVersion Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0001 $Hw &= $Text EndIf EndIf If BitAND($iFlags, 0x0002) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.Architecture $Text &= $Property.Family $Text &= $Property.Level $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.ProcessorId $Text &= $Property.Revision $Text &= $Property.Version Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0002 $Hw &= $Text EndIf EndIf $Hash = __MD5($Hw) If Not $Hash Then Return SetError(4, 0, '') EndIf Return SetError(0, $Result, $Hash) Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}') EndFunc Func __MD5($sData) Local $Ret, $hProv, $hHash, $tData, $Error = 1 $hProv = DllCall('advapi32.dll', 'int', 'CryptAcquireContextW', 'ptr*', 0, 'ptr', 0, 'ptr', 0, 'dword', 3, 'dword', 0xF0000000) If (@error) Or (Not $hProv[0]) Then Return '' EndIf Do $hHash = DllCall('advapi32.dll', 'int', 'CryptCreateHash', 'ptr', $hProv[1], 'uint', 0x00008003, 'ptr', 0, 'dword', 0, 'ptr*', 0) If (@error) Or (Not $hProv[0]) Then $hHash = 0 ExitLoop EndIf $hHash = $hHash[5] $tData = DllStructCreate('byte[' & BinaryLen($sData) & ']') DllStructSetData($tData, 1, $sData) $Ret = DllCall('advapi32.dll', 'int', 'CryptHashData', 'ptr', $hHash, 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $tData = DllStructCreate('byte[16]') $Ret = DllCall('advapi32.dll', 'int', 'CryptGetHashParam', 'ptr', $hHash, 'dword', 2, 'ptr', DllStructGetPtr($tData), 'dword*', 16, 'dword', 0) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $Error = 0 Until 1 If $hHash Then DllCall('advapi32.dll', 'int', 'CryptDestroyHash', 'ptr', $hHash) EndIf If $Error Then Return '' EndIf Return StringTrimLeft(DllStructGetData($tData, 1), 2) EndFunc
По ссылке "Привязка к железу. Некоторое время назад обсуждалось.
https://autoit-script.ru/threads/sistema-zaschity-i-privjazka-k-zhelezu.13582/
http://Как вариант
" даже не пытается заходить. я как раз видел эту тему и ничего не понял(По ссылке "http://Как вариант
" даже не пытается заходить.Лучше так. Впроочем, тот топик быстро прикрыли из-за того, что тема обсуждалась несколько раз.
Понимаю, но я все же прошу помощи.Надёжной защиты от взлома нет. Можно только попытаться повставлять палок в колёса. Это вечная борьба идей между взломщиками и обороняющимися от взлома. Идеального или наилучшего решения не существует.
Либо Просто сделайть один файл, который будет показывать серийник жд, я буду его вписывать код и отправлять готовый файл, который будет искать именно его серийник, и, если серийник совпадет, то программа запустится. Я думаю так даже проще для меня будетДумаю, как простой вариант пойдет, а там уже допилишь базу для сверки
Код:MsgBox(0,"",_UniqueHardwareID(0x01 + 0x02)) $key = "FC2895A3EE73FF8B530927CDAA5EB96D";тут для примера указываешь свой ключ _UniqueHardwareID(0x01 + 0x02) if StringRegExp($key, _UniqueHardwareID(0x01 + 0x02)) = 1 Then MsgBox(0,"","ключ найден") Else MsgBox(0,"","ключ не найден") EndIf Func _UniqueHardwareID($iFlags = 0) Local $oService = ObjGet('winmgmts:\\.\root\cimv2') If Not IsObj($oService) Then Return SetError(1, 0, '') EndIf Local $oItems, $Hash, $Text, $Hw = '', $Result = 0 $oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf For $Property In $oItems $Hw &= $Property.IdentifyingNumber $Hw &= $Property.Name $Hw &= $Property.SKUNumber $Hw &= $Property.UUID $Hw &= $Property.Vendor $Hw &= $Property.Version Next $Hw = StringStripWS($Hw, 8) If Not $Hw Then Return SetError(3, 0, '') EndIf If BitAND($iFlags, 0x0001) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.IdentificationCode $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.SerialNumber $Text &= $Property.SMBIOSMajorVersion $Text &= $Property.SMBIOSMinorVersion Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0001 $Hw &= $Text EndIf EndIf If BitAND($iFlags, 0x0002) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.Architecture $Text &= $Property.Family $Text &= $Property.Level $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.ProcessorId $Text &= $Property.Revision $Text &= $Property.Version Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0002 $Hw &= $Text EndIf EndIf $Hash = __MD5($Hw) If Not $Hash Then Return SetError(4, 0, '') EndIf Return SetError(0, $Result, $Hash) Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}') EndFunc Func __MD5($sData) Local $Ret, $hProv, $hHash, $tData, $Error = 1 $hProv = DllCall('advapi32.dll', 'int', 'CryptAcquireContextW', 'ptr*', 0, 'ptr', 0, 'ptr', 0, 'dword', 3, 'dword', 0xF0000000) If (@error) Or (Not $hProv[0]) Then Return '' EndIf Do $hHash = DllCall('advapi32.dll', 'int', 'CryptCreateHash', 'ptr', $hProv[1], 'uint', 0x00008003, 'ptr', 0, 'dword', 0, 'ptr*', 0) If (@error) Or (Not $hProv[0]) Then $hHash = 0 ExitLoop EndIf $hHash = $hHash[5] $tData = DllStructCreate('byte[' & BinaryLen($sData) & ']') DllStructSetData($tData, 1, $sData) $Ret = DllCall('advapi32.dll', 'int', 'CryptHashData', 'ptr', $hHash, 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $tData = DllStructCreate('byte[16]') $Ret = DllCall('advapi32.dll', 'int', 'CryptGetHashParam', 'ptr', $hHash, 'dword', 2, 'ptr', DllStructGetPtr($tData), 'dword*', 16, 'dword', 0) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $Error = 0 Until 1 If $hHash Then DllCall('advapi32.dll', 'int', 'CryptDestroyHash', 'ptr', $hHash) EndIf If $Error Then Return '' EndIf Return StringTrimLeft(DllStructGetData($tData, 1), 2) EndFunc
Сообщение автоматически объединено:
Или можно сделать так, чтоб ключ хранился где то на компьютере, но тогда нужно будет делать что то вроде системы, тебе кинули ключ, ты его прогнал через программу и на выходе получил другой ключ, который уже отправляешь пользователю и он его указывает
грубо говоря тебе скидывают ключ полученный от _UniqueHardwareID(0x01 + 0x02)
ты этот ключ прогоняешь через _GetKey и высылаешь конечному пользователю
он этот ключ указывает и программа записывает где нибудь его хранение (к примеру реестр или ini файл) и далее уже сверяет в самом скрипте
p.s для проверки не забудь изменить $key на свой
Код:MsgBox(0,"",_UniqueHardwareID(0x01 + 0x02)) $key = "FC2895A3EE73FF8B530927CDAA5EB96D";тут сам твой ключ полученный чреез _UniqueHardwareID(0x01 + 0x02) ;генерируем ключ через _GetKey(_UniqueHardwareID(0x01 + 0x02) $key = _GetKey($key) MsgBox(0,"",_GetKey(_UniqueHardwareID(0x01 + 0x02))) if StringRegExp($key,_GetKey(_UniqueHardwareID(0x01 + 0x02))) = 1 Then MsgBox(0,"","ключ найден") Else MsgBox(0,"","ключ не найден") EndIf Func _GetKey($userid) $hash = __md5($userid) Return StringMid($hash, 1, 7) & "-" & StringMid($hash, 9, 7) & "-" & StringMid($hash, 13, 7) & "-" & StringMid($hash, 17, 7) & "-" & StringMid($hash, 21, 7) EndFunc Func _UniqueHardwareID($iFlags = 0) Local $oService = ObjGet('winmgmts:\\.\root\cimv2') If Not IsObj($oService) Then Return SetError(1, 0, '') EndIf Local $oItems, $Hash, $Text, $Hw = '', $Result = 0 $oItems = $oService.ExecQuery('SELECT * FROM Win32_ComputerSystemProduct') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf For $Property In $oItems $Hw &= $Property.IdentifyingNumber $Hw &= $Property.Name $Hw &= $Property.SKUNumber $Hw &= $Property.UUID $Hw &= $Property.Vendor $Hw &= $Property.Version Next $Hw = StringStripWS($Hw, 8) If Not $Hw Then Return SetError(3, 0, '') EndIf If BitAND($iFlags, 0x0001) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_BIOS') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.IdentificationCode $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.SerialNumber $Text &= $Property.SMBIOSMajorVersion $Text &= $Property.SMBIOSMinorVersion Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0001 $Hw &= $Text EndIf EndIf If BitAND($iFlags, 0x0002) Then $oItems = $oService.ExecQuery('SELECT * FROM Win32_Processor') If Not IsObj($oItems) Then Return SetError(2, 0, '') EndIf $Text = '' For $Property In $oItems $Text &= $Property.Architecture $Text &= $Property.Family $Text &= $Property.Level $Text &= $Property.Manufacturer $Text &= $Property.Name $Text &= $Property.ProcessorId $Text &= $Property.Revision $Text &= $Property.Version Next $Text = StringStripWS($Text, 8) If $Text Then $Result += 0x0002 $Hw &= $Text EndIf EndIf $Hash = __MD5($Hw) If Not $Hash Then Return SetError(4, 0, '') EndIf Return SetError(0, $Result, $Hash) Return SetError(0, $Result, '{' & StringMid($Hash, 1, 8) & '-' & StringMid($Hash, 9, 4) & '-' & StringMid($Hash, 13, 4) & '-' & StringMid($Hash, 17, 4) & '-' & StringMid($Hash, 21, 12) & '}') EndFunc Func __MD5($sData) Local $Ret, $hProv, $hHash, $tData, $Error = 1 $hProv = DllCall('advapi32.dll', 'int', 'CryptAcquireContextW', 'ptr*', 0, 'ptr', 0, 'ptr', 0, 'dword', 3, 'dword', 0xF0000000) If (@error) Or (Not $hProv[0]) Then Return '' EndIf Do $hHash = DllCall('advapi32.dll', 'int', 'CryptCreateHash', 'ptr', $hProv[1], 'uint', 0x00008003, 'ptr', 0, 'dword', 0, 'ptr*', 0) If (@error) Or (Not $hProv[0]) Then $hHash = 0 ExitLoop EndIf $hHash = $hHash[5] $tData = DllStructCreate('byte[' & BinaryLen($sData) & ']') DllStructSetData($tData, 1, $sData) $Ret = DllCall('advapi32.dll', 'int', 'CryptHashData', 'ptr', $hHash, 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $tData = DllStructCreate('byte[16]') $Ret = DllCall('advapi32.dll', 'int', 'CryptGetHashParam', 'ptr', $hHash, 'dword', 2, 'ptr', DllStructGetPtr($tData), 'dword*', 16, 'dword', 0) If (@error) Or (Not $Ret[0]) Then ExitLoop EndIf $Error = 0 Until 1 If $hHash Then DllCall('advapi32.dll', 'int', 'CryptDestroyHash', 'ptr', $hHash) EndIf If $Error Then Return '' EndIf Return StringTrimLeft(DllStructGetData($tData, 1), 2) EndFunc