- Сообщения
- 5,379
- Репутация
- 2,724
Хочу предложить свой способ привязать программу к определенному компьютеру, т.е. программа будет работать только на этом компьютере. Для запуска нижеприведенных примеров необходима библиотека WinAPIEx.au3.
Шаг 1
Вставляем в свой скрипт следующий код и компилируем его с именем MyProg.exe.
Если запустить этот скрипт, то он не пройдет проверку и завершит свою работу.
Шаг 2
Запустим следующий скрипт (теоретически это должен делать установщик вашей программы).
Теперь ваша программа (MyProg.exe) успешно запустится и выведет сообщение "OK". И самое главное, файл MyProg.exe будет работать ТОЛЬКО на том компьютере, на котором мы вызвали функцию _InjectUniqueID().
Шаг 1
Вставляем в свой скрипт следующий код и компилируем его с именем MyProg.exe.
Код:
#Include <WinAPIEx.au3>
If Not _ValidateScript() Then
MsgBox(16, ':-(', 'The program has not been installed on this computer.')
Exit
EndIf
MsgBox(0, ':-)', 'OK')
Func _ValidateScript()
Local $sID = _WinAPI_UniqueHardwareID(BitOR($UHID_MB, $UHID_BIOS))
If Not $sID Then
Return 0
EndIf
Local $hFile = _WinAPI_CreateFile(@ScriptFullPath, 2, 2)
If Not $hFile Then
Return 0
EndIf
Local $tData = DllStructCreate($tagGUID), $pData = DllStructGetPtr($tData)
Local $sData, $iByte, $Result = 0
Do
If Not _WinAPI_SetFilePointer($hFile, -16, 2) Then
ExitLoop
EndIf
If (Not _WinAPI_ReadFile($hFile, $pData, 16, $iByte)) Or ($iByte <> 16) Then
ExitLoop
EndIf
$sData = _WinAPI_StringFromGUID($pData)
If (Not $sData) Or ($sData <> $sID) Then
ExitLoop
EndIf
$Result = 1
Until 1
_WinAPI_CloseHandle($hFile)
Return $Result
EndFunc ;==>_ValidateScript
Если запустить этот скрипт, то он не пройдет проверку и завершит свою работу.
Шаг 2
Запустим следующий скрипт (теоретически это должен делать установщик вашей программы).
Код:
#Include <WinAPIEx.au3>
If Not _InjectUniqueID('MyProg.exe', _WinAPI_UniqueHardwareID(BitOR($UHID_MB, $UHID_BIOS))) Then
Switch @error
Case 2
MsgBox(16, 'Error', 'MyProg.exe already patched.')
Case Else
MsgBox(16, 'Error', 'Unable to patch file.')
EndSwitch
EndIf
Func _InjectUniqueID($sFile, $sID)
Local $tData = _WinAPI_GUIDFromString($sID)
If Not IsDllStruct($tData) Then
Return 0
EndIf
Local $hFile = _WinAPI_CreateFile($sFile, 2, 6)
If Not $hFile Then
Return 0
EndIf
Local $tSign = DllStructCreate('dword'), $pSign = DllStructGetPtr($tSign)
Local $iByte, $Error = 1
Do
If Not _WinAPI_SetFilePointer($hFile, -20, 2) Then
ExitLoop
EndIf
If (Not _WinAPI_ReadFile($hFile, $pSign, 4, $iByte)) Or ($iByte <> 4) Then
ExitLoop
EndIf
If DllStructGetData($tSign, 1) = 0x0144ADDA Then
$Error = 2
ExitLoop
EndIf
If Not _WinAPI_SetFilePointer($hFile, 0, 2) Then
ExitLoop
EndIf
DllStructSetData($tSign, 1, 0x0144ADDA)
If (Not _WinAPI_WriteFile($hFile, $pSign, 4, $iByte)) Or ($iByte <> 4) Then
ExitLoop
EndIf
If (Not _WinAPI_WriteFile($hFile, DllStructGetPtr($tData), 16, $iByte)) Or ($iByte <> 16) Then
ExitLoop
EndIf
$Error = 0
Until 1
_WinAPI_CloseHandle($hFile)
Return SetError($Error, 0, Number($Error = 0))
EndFunc ;==>_InjectUniqueID
Теперь ваша программа (MyProg.exe) успешно запустится и выведет сообщение "OK". И самое главное, файл MyProg.exe будет работать ТОЛЬКО на том компьютере, на котором мы вызвали функцию _InjectUniqueID().