Что нового

Как проверить, чтобы пользователь не отмотал время назад

Suppir

Продвинутый
Сообщения
967
Репутация
62
Скрипт рассчитан на работу в 2012 году. 1 января 2013 года я хочу, чтобы он перестал включаться (тогда я разошлю обновленный скрипт, который будет работать еще год).

У скрипта нет доступа к реестру и интернету (у многих пользователей нет интернета, антивирус блокирует доступ к реестру). Каким образом можно проверять, чтобы пользователь не отмотал время назад на начало 2012 года, чтобы пользоваться программкой?

Я думаю о нескольких вариантах:
1) записываем в свойства (атрибуты) exe-шника текущее время и проверяем, чтобы при последующих запусках оно было не меньше. Но тогда пользователь просто может изначальный экзешник взять, отмотать время назад и продолжить им пользоваться.

2) проверяем системную папку windows, атрибуты файлов, даты их последнего изменения. Правда, мне кажется, что при этом касперский может запросто удалить мою программу.

3) ваш вариант?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Программа должна уметь считать дни самостоятельно.
Ищи файл - который меняется каждый день. Храни эту дату в файле с лицензией (можешь зашифровать). Если вдруг оказывается что проверяемый файл имеет дату меньшую чем ту, которая записана в лицензии - значит дату перенастраивали.


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

Относительное время еще можешь получить - получая какие нибудь параметры железа. Например для дисков это - время проведенное во включенном состоянии: Power-On Hours (POH). Может быть в биосе что нибудь можно найти.


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

Можно еще читать журнал событий. Последнее событие по дате не может быть меньше предпоследнего.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
inververs

Представьте, что человек пользуется программой весь 2012 год. Программа исправно отсчитывает время, записывает его в файл лицензии. В конце года пользователь просто удаляет программу с лицензией, перематывает время на начало года и устанавливает изначальный вариант программы (я ее рассылаю по email). "Нулячая" программа будет думать, что сейчас начало года и еще год будет работать.

Выходит, что нужно делать пометки о времени вне программы. В какой-нибудь файл, который пользователь не сможет найти.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Тогда, мне кажеться, программа помимо контроля времени еще должна знать, что она раньше уже была установлена.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Suppir
Проверяй дату создания файла. Если она 2012 года - то все в порядке, нет - завершай.
Обычный смертный не сможет изменить дату создания файла, максимум дату последнего изменения.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Medic84 [?]
Проверяй дату создания файла. Если она 2012 года - то все в порядке, нет - завершай.

ok, дата создания файла = 2012. Мне нужно, чтобы программа работала в 2012 году. Когда наступит календарный 2013 год (а пользователь перемотает системное время назад в 2012), программа и дальше будет работать, ведь дата создания файла = 2012.




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

А, вот, думаю "лицензию" запихнуть в атрибуты какого-нибудь скрытого файла windows. Чтобы даже если пользователь удалит программу и заново ее перепишет, новая программа знала, который сейчас год, читая эту лицензию.


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

+ саму информацию о дате можно зашифровать с паролем.
+ дописывать такую же дату в атрибуты самого экзешника (но с другим шифрованием) и при запуске сверять эти две даты.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Можно как - то так:

Код:
#include <WinAPIEx.au3>
#include <String.au3>

OnAutoItExitRegister('__timer_destroy')
Global $__t_Timer, $__i_Timer, $__ScriptTimer[5] = [0, 0, 0, 0, @ScriptFullPath & '.time']

HotKeySet('{ESC}', '_Exit')

TimerInitialize() ;~ Инициализируем работу таймера

$hForm = GUICreate('')
$iLabel = GUICtrlCreateLabel('', 20, 20, 100, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
	GUICtrlSetData($iLabel, GetDays() & ':' & GetHours() & ':' & GetMinutes() & ':' & GetSeconds())
Wend

Func _Exit()
	Exit
EndFunc

Func TimerInitialize()
	If FileExists($__ScriptTimer[4]) Then
	    $hFile = FileOpen($__ScriptTimer[4])
	    $sRead = _StringEncrypt(0, _StringToHex(FileRead($hFile)), 123)
	    FileClose($hFile)
	    If StringLen($sRead) > 0 Then
		    $sSplit = StringSplit($sRead, '|')
		    If (IsArray($sSplit) And ($sSplit[0] = 4)) Then
			    $__ScriptTimer[3] = $sSplit[1]
			    $__ScriptTimer[2] = $sSplit[2]
			    $__ScriptTimer[1] = $sSplit[3]
			    $__ScriptTimer[0] = $sSplit[4]
		    EndIf
        EndIf
	EndIf
	$__t_Timer = DllCallbackRegister('__timer_service', 'int', '')
	$__i_Timer = _WinAPI_SetTimer(0, 0, 1000, DllCallbackGetPtr($__t_Timer))
EndFunc

Func GetDays()
	Return $__ScriptTimer[3]
EndFunc

Func GetHours()
	Return $__ScriptTimer[2]
EndFunc

Func GetMinutes()
	Return $__ScriptTimer[1]
EndFunc

Func GetSeconds()
	Return $__ScriptTimer[0]
EndFunc

Func SetFileTime($sFile)
	$__ScriptTimer[4] = $sFile
EndFunc

Func __timer_destroy()
	DllCallbackFree($__t_Timer)
	_WinAPI_KillTimer(0, $__i_Timer)
EndFunc

Func __timer_service()
	Select
		Case $__ScriptTimer[0] >= 59
			$__ScriptTimer[0] = 0
			$__ScriptTimer[1] += 1
		Case $__ScriptTimer[1] >= 59
            $__ScriptTimer[1] = 0
			$__ScriptTimer[2] += 1
		Case $__ScriptTimer[2] >= 24
            $__ScriptTimer[2] = 0
            $__ScriptTimer[3] += 1
		Case $__ScriptTimer[0] < 59
			$__ScriptTimer[0] += 1
	EndSelect
	If $__ScriptTimer[4] Then
		Local $hFile = FileOpen($__ScriptTimer[4], 2)
        FileWrite($hFile, _HexToString(_StringEncrypt(1, $__ScriptTimer[3] & '|' & $__ScriptTimer[2] & '|' & $__ScriptTimer[1] & '|' & $__ScriptTimer[0], 123)))
        FileClose($hFile)
	EndIf
EndFunc
 
Верх