Что нового

Привязка программы к железу

Tsigun

Новичок
Сообщения
29
Репутация
0
/del
 
Последнее редактирование:

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Думаю, как простой вариант пойдет, а там уже допилишь базу для сверки
Код:
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
 
Последнее редактирование:

All2khoff

Продвинутый
Сообщения
351
Репутация
65
Привязка к железу. Некоторое время назад обсуждалось.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
Хочу сделать привязку по "Железу" для скрипта, что бы я мог сделать запуск по ключу активации
Надеюсь вопрос с декомпиляцией решили?
Потому что если программа будет действительно востребованной, ее без труда декомпилируют и "вылечат от жадности".
А если программа мало кому нужна, то ее тоже декомпилируют и "вылечат от жадности", но не сразу и есть вероятность что программа не попадет в открытый доступ.
 
Автор
T

Tsigun

Новичок
Сообщения
29
Репутация
0
Надеюсь вопрос с декомпиляцией решили?
Потому что если программа будет действительно востребованной, ее без труда декомпилируют и "вылечат от жадности".
А если программа мало кому нужна, то ее тоже декомпилируют и "вылечат от жадности", но не сразу и есть вероятность что программа не попадет в открытый доступ.
Программа не сильно популярна, не думаю что люди станут заморачиваться
Сообщение автоматически объединено:

Думаю, как простой вариант пойдет, а там уже допилишь базу для сверки
Код:
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
Если будет не сложно, я бы связался с тобой в Discord - NeverLoose#9192 либо Telegram - https://t.me/tsigunF
Просто я пока что мало понимаю как это сделать, если ты поможешь буду очень рад. Могу заплатить.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Привязка к железу. Некоторое время назад обсуждалось.
https://autoit-script.ru/threads/sistema-zaschity-i-privjazka-k-zhelezu.13582/
По ссылке "http://Как вариант" даже не пытается заходить. :smile: Лучше так. Впроочем, тот топик быстро прикрыли из-за того, что тема обсуждалась несколько раз.
 
Автор
T

Tsigun

Новичок
Сообщения
29
Репутация
0

Oki

Продвинутый
Сообщения
452
Репутация
62
Надёжной защиты от взлома нет. Можно только попытаться повставлять палок в колёса. Это вечная борьба идей между взломщиками и обороняющимися от взлома. Идеального или наилучшего решения не существует.
 
Автор
T

Tsigun

Новичок
Сообщения
29
Репутация
0
Надёжной защиты от взлома нет. Можно только попытаться повставлять палок в колёса. Это вечная борьба идей между взломщиками и обороняющимися от взлома. Идеального или наилучшего решения не существует.
Понимаю, но я все же прошу помощи.
Сообщение автоматически объединено:

Думаю, как простой вариант пойдет, а там уже допилишь базу для сверки
Код:
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
Либо Просто сделайть один файл, который будет показывать серийник жд, я буду его вписывать код и отправлять готовый файл, который будет искать именно его серийник, и, если серийник совпадет, то программа запустится. Я думаю так даже проще для меня будет
 
Последнее редактирование:
Верх