Типы данных - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Типы данных

Типы данных

Ответ
Поиск в этой теме
Непрочитано 12.08.2007, 19:46
Типы данных
Holon
 
CNC
 
Israel
Регистрация: 07.07.2007
Сообщений: 302

Судя повсему проблемма заключается в типе данных в
Код:
[Выделить все]
(if ( >= cdate lic)
игнорируется сравнение, вот для наглядности в функцию добавил,
Код:
[Выделить все]
(list lic cdate (type lic) (type cdate))
что-бы внести ясность. Я впринципе хотел создать функцию
для ограничения своих функций по времени, к примеру приходит определенное число
функция обращается к файлу сравнивает его с данными в файле и если дата совпала
или больше то функция перестает запускать остальные функции загруженнуе с ней в одном файле, и в добавок в файл прописывает всякий бред
Код:
[Выделить все]
(write-line(strcat "License Manager" "_" licpath licfile) test_lic)
для того,что-бы нельзя было перевести дату назад. В самом файле прописано 20070812 Вот пример кода
Код:
[Выделить все]
(defun tmp_lic (/ test_lic cdate lic basepath licpath licfile)
  (setq	cdate	 (fix(getvar "cdate"))
	basepath "U:\\lisp\\"
	licpath	 (strcat basepath "lic\\")
	licfile	 "License.lic"
  )
  (setq	test_lic (open (strcat licpath licfile) "r")
	lic	 (read-line test_lic)
        lic (atoi lic)
	)
  (close test_lic)
  (if ( >= cdate lic)
  (progn
  (setq test_lic (open (strcat licpath licfile) "a"))
	   (write-line(strcat "License Manager" "_" licpath licfile) test_lic)
	   (close test_lic)
  );end progn
  );end if
  (if (< cdate lic)(c:Glass))
  (list lic cdate (type lic) (type cdate))
  )
Просмотров: 11766
 
Непрочитано 13.08.2007, 11:26
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Фффуф...
Есть предложение: разобрать конкретный пример. Ок?
Создаем 2 файла, один c:\1.txt, второй c:\2.txt. В первый закидываем строку "string", во второй - "string" и один раз жмем <Enter>.
И на обоих попробуй открыть их в режиме "a" и добавить строку "string_add". Результат?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 11:33
#22
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Вот теперь все работает, только я в добавок сделал затерку файла
Код:
[Выделить все]
(defun test (/ *error* file_handle lic cdate)
  (defun *error* (msg)
    (vl-catch-all-apply '(lambda () (close file_handle)))
    (princ msg)
    (princ)
  ) ;_ end of defun 
  (or *lic-path* (setq *lic-path* "u:\\lisp\\lic\\"))
  (or *lic-file* (setq *lic-file* "license.lic"))
  (if (findfile (strcat *lic-path* *lic-file*))
    (progn
      (setq file_handle	(open (findfile (strcat *lic-path* *lic-file*)) "r")
	    lic		(read-line file_handle)
	    cdate	(vl-princ-to-string (fix (getvar "cdate")))
      ) ;_ end of setq 
      (close file_handle)
      (if (<= cdate lic)
	(progn
	  (c:glass)
	) ;_ end of progn 
	(progn
	  (setq	file_handle
		 (open (findfile (strcat *lic-path* *lic-file*)) "w")
	  ) ;_ end of setq 
	  (write-line
	    (strcat "LicenseManager_" *lic-path* *lic-file*)
	    file_handle
	  ) ;_ end of write-line 
	  (close file_handle)
	  (alert "Licensed time expired!")
	  (exit)
	) ;_ end of progn
      ) ;_ end of if 
    ) ;_ end of progn 
    (progn
      (alert "Can't locate license file!")
      (exit)
    ) ;_ end of progn 
  ) ;_ end of if 
) ;_ end of defun
Holon вне форума  
 
Непрочитано 13.08.2007, 11:48
#23
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Ага, а на повторном сравнении что будет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 12:13
#24
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Да ты прав при повторном сравнении опять заработало
Holon вне форума  
 
Автор темы   Непрочитано 13.08.2007, 12:26
#25
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Да придется делать только так, жалко строка остается открытой, может присоеденить файл "license.lic" и сделать вместо *.fas *.vlx
Код:
[Выделить все]
(defun tmp_lic (/ *error* file_handle lic cdate)
  (defun *error* (msg)
    (vl-catch-all-apply '(lambda () (close file_handle)))
    (princ msg)
    (princ)
  ) ;_ end of defun 
  (or *lic-path* (setq *lic-path* "u:\\lisp\\lic\\"))
  (or *lic-file* (setq *lic-file* "license.lic"))
  (if (findfile (strcat *lic-path* *lic-file*))
    (progn
      (setq file_handle	(open (findfile (strcat *lic-path* *lic-file*)) "r")
	    lic		(read-line file_handle)
	    cdate	(vl-princ-to-string (fix (getvar "cdate")))
      ) ;_ end of setq 
      (close file_handle)
      (if (<= cdate lic)
	(progn
	  (c:glass)
	) ;_ end of progn 
	(progn
	  (setq	file_handle
		 (open (findfile (strcat *lic-path* *lic-file*)) "a")
	  ) ;_ end of setq
	  (write-line 
            (strcat "\nLicenseManager_" *lic-path* *lic-file*) 
            file_handle 
            ) ;_ end of write-line 
	  (close file_handle)
	  (alert "Licensed time expired!")
	  (exit)
	) ;_ end of progn
      ) ;_ end of if 
    ) ;_ end of progn 
    (progn
      (alert "Can't locate license file!")
      (exit)
    ) ;_ end of progn 
  ) ;_ end of if 
) ;_ end of defun
Holon вне форума  
 
Непрочитано 13.08.2007, 12:39
#26
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Какая строка остается открытой?
Кстати, зачем вообще добавлять в lic-файл одну и ту же строчку ("LicenseManager_u:\\lisp\\lic\\licanse.lic")? Просто так?
Она ж не меняется вообще ни в каком виде...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 12:54
#27
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Это строка 20070815 в начале я подразумевал затирать ее для того, чтобы любопытные глаза немогли понять логику работы license.lic файла, зная логику работы license.lic файла каждыиь может продливать себе лицензию сколько угодно.
Holon вне форума  
 
Непрочитано 13.08.2007, 13:09
#28
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


А если втупую зашифровать строку даты?
Прямое "шифрование":
Код:
[Выделить все]
(vl-list->string (mapcar '(lambda(x) (+ x 62)) (vl-string->list (vl-princ-to-string 20070816))))
вернет нечто типа "pnnunvot"
Для сравнения надо сделать обратную операцию:
Код:
[Выделить все]
(atoi (vl-list->string (mapcar '(lambda(x) (- x 62)) (vl-string->list "pnnunvot"))))
Вернет 20070816
И сравнивай на здоровье. А еще можно засунуть данные в реестр, куда подальше, например, в (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles") ну или вообще в LOCAL_MACHINE (но туда запись выполнять уже только с админскими правами). Выбирать минимальную дату и сравнивать по ней.
Вариантов масса, но все они не выдерживают никакой критики. Рано или поздно, кому надо, все равно сломают.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.08.2007, 13:47
#29
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Какой-то замок из песка делается!
Такая защита - от лохов, но не более!!!
Евгений А. вне форума  
 
Непрочитано 13.08.2007, 13:53
#30
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Естественно! О чем я и говорю: кому понадобится - сломают все равно. Слово "шифрование" не зря взято в кавычки в моем предыдущем высказывании
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 18:44
#31
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Цитата:
Сообщение от Кулик Алексей aka kpblc
А если втупую зашифровать строку даты?
Прямое "шифрование":
Код:
[Выделить все]
(vl-list->string (mapcar '(lambda(x) (+ x 62)) (vl-string->list (vl-princ-to-string 20070816))))
вернет нечто типа "pnnunvot"
Для сравнения надо сделать обратную операцию:
Код:
[Выделить все]
(atoi (vl-list->string (mapcar '(lambda(x) (- x 62)) (vl-string->list "pnnunvot"))))
Вернет 20070816
И сравнивай на здоровье. А еще можно засунуть данные в реестр, куда подальше, например, в (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles") ну или вообще в LOCAL_MACHINE (но туда запись выполнять уже только с админскими правами). Выбирать минимальную дату и сравнивать по ней.
Вариантов масса, но все они не выдерживают никакой критики. Рано или поздно, кому надо, все равно сломают.
прямое шифрование тоже непомогает, я в шутку добавил к "pnnunvoo" еще одно "o"
и вот результат
Код:
[Выделить все]
; 10 forms loaded from #<editor "U:/LISP/PL/Glass_Project.LSP">
_9$ (test)
(200708111 20070813 INT INT)
_9$
Holon вне форума  
 
Непрочитано 13.08.2007, 23:13
#32
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


-> Holon
Так тебе чего надо-то?
Защита?
Не рановато-ли?
Видно, что знаний в области программирования ещё мало, а о защите - нулевые!
Есть довольно много простых способов обхода гораздо более изощрённых защит. В интернете не проблема найти множество статей на эту тему - почитай хотябы одну-две.
Надо сначала изучать предмет, чтобы самому потом не было смешно.
Похожая кстати тема http://www.autocad.ru/cgi-bin/f1/board.cgi?t=28001gj
Евгений А. вне форума  
 
Автор темы   Непрочитано 14.08.2007, 09:43
#33
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Уважаемый Евгений А. в указанном топике я ничего особенного не нашел, да
вы конечно правы я не професионал хотелось бы научится у профи как вы, чему-нибудь стоящему, если вам не тяжело представьте собственный пример решения проблемы.
Holon вне форума  
 
Непрочитано 14.08.2007, 10:34
#34
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


А я вам именно это и предложил - учиться, учиться и ... причём глобально, а не выхватывать урывками какие-то конкретные вопросы. Всегда интересно помогать, но нет желания учить! (самому ещё есть чему учиться)
А в вопросах защиты в первую очередь надо изучать методы взлома, только тогда можно понять насколько сложно сделать серьёзную защиту и насколько несерьёзна ваша идея. Мне кажется, что защитой просто глупо заниматься на вашем уровне, так как тут должна быть только проблема в методах, но никак не в реализации!
Евгений А. вне форума  
 
Непрочитано 14.08.2007, 10:45
#35
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Защитой программ (особенно компилированных), насколько мне известно, в свое время очень плотно занимался Евгений Елпанов, если не вру, его резюме было: "на лиспе написать работающую защиту практически невозможно".
Даже fas / vlx можно обратно развернуть (я уже не говорю о шифрованных лиспах). Имея наметанный глаз, прочитать код особого труда не составит, скорее всего.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.08.2007, 11:20
#36
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Цитата:
vlx можно обратно развернуть
- сомневаюсь, что это возможно без потери логичности кода, а поэтому и
Цитата:
Имея наметанный глаз, прочитать код особого труда не составит, скорее всего.
- сильно преувеличено!
То же (условно конечно) можно сказать про защиту на любом другом языке программирования, так как всё можно представить в дизассемблированном виде и имея "намётанный глаз" в ассемблере прочитать код. Но это всё с очень большим трудом - запутать хакера в коде - это не самая сложная задача, если всерьёз этим заниматься. Но взломы програм дизассемблированием и прочим ковырянии в коде - это самый сложный способ, до которого обычно дело не доходит, так как есть более простые и быстрые методы мониторинга системы.
Евгений А. вне форума  
 
Непрочитано 14.08.2007, 11:50
#37
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


На простейшем уровне, задача состоит из 2-х частей. Первая - привязаться к аппаратной части (иначе систему защиты просто можно перенести на другую машину вместе со всеми её "замками") и вторая - предотвращение подделки ключа (возможно ограниченного по времени действия).

Первая задача решается (более или менее пристойно) путям привязки к уникальным ключам в реестре (это отдельная тема, так что пример будет на первом ключе из реестра моей машины, который пришёл на ум).

Вторая задача решается шифрованием даты (в каком либо её представлении) уникальным ключом, как раз тем, что извлечён из реестра (например).

В самом простом демоварианте это может выглядеть так:
Код:
[Выделить все]
;;; ******************** only for me *************************
(defun demo:generateKEY (date / keyfile)
  (if (setq keyfile (open "C:\\Test\\license.dat" "w"))
    (progn (write-line
             (apply (function strcat)
                    (mapcar (function (lambda (a b) (itoa (+ 185 (boole 6 a b)))))
                            (demo:get-volGUID)
                            (vl-string->list
                              (strcat "Key for my programm "
                                      (vl-string-translate "0123456789" "ZFtEgYJdlO" date)
                                      " EOF"
                              )
                            )
                    )
             )
             keyfile
           )
           (close keyfile)
    )
  )
)

;;; ********************* for users **************************
(defun demo:KEYer ()
  (if (>= (demo:get-validateKEY) (fix (getvar "cdate")))
    (alert "All right!")
    (alert "All bad!")
  )
)

(defun demo:get-volGUID (/ regtr)
  (setq regtr "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\STORAGE\\Volume\\")
  (vl-remove 45
             (vl-string->list
               (vl-string-trim
                 "{}"
                 (vl-registry-read
                   (strcat regtr (car (vl-registry-descendents regtr)))
                   "ClassGUID"
                 )
               )
             )
  )
)

(defun demo:get-validateKEY (/ keyfile res)
  (if (setq keyfile (findfile "C:\\Test\\license.dat"))
    (progn (setq keyfile (open keyfile "r")
                 res     (read-line keyfile)
           )
           (close keyfile)
           (atoi (vl-string-translate
                   "ZFtEgYJdlO"
                   "0123456789"
                   (substr (vl-list->string
                             (mapcar (function (lambda (a b) (boole 6 (- (atoi a) 185) b)))
                                     (demo:str-by-3 res)
                                     (demo:get-volGUID)
                             )
                           )
                           21
                           8
                   )
                 )
           )
    )
  )
)

(defun demo:str-by-3 (str)
  (if (/= "" str)
    (cons (substr str 1 3) (demo:str-by-3 (substr str 4)))
  )
)
Функция: (demo:generateKEY "20170815") создаст ключевой файл - "C:\\Test\\license.dat" содержащий дату в псевдозашифрованом виде. Эта функция не должна оставаться на компьютере жертвы.

Функция: (demo:KEYer) сверит текущую дату с записаной в файле и выдаст сообщение об успехе или неудаче.

* Код написан очень спешно и почти без проверок - это только ДЕМО.
Alaspher вне форума  
 
Непрочитано 14.08.2007, 13:59
#38
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


->Alaspher
Ломается, к сожалению, банально - удаляем файл с ключём "C:\\Test\\license.dat" (а в идеале вообще все записи которые делает программа - реестр, файлы, сектора на диске) и теперь программа думает что её запускают впервый раз и она тупо создаёт заново этот файл с текущей временной меткой. Когда время выйдет - повторяем процедуру. Можно написать патчик, который будет когда надо сам всё удалять!
Евгений А. вне форума  
 
Непрочитано 14.08.2007, 14:12
#39
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


> Евгений А.
Это простейшее ДЕМО (но даже оно не ломается описанным способом ). Естественно, для сколь-нибудь вразумительной защиты нужно проводить определённые процедуры, как то - не оставлять функцию генерации ключа на клиентской машине (либо не передавать её вовсе, а запрашивать ключ для шифрования даты через почту или веб-форму - для этого в приведённом ДЕМО надо изменить 2-3 стороки), привязываться к ключам изменение которых затруднено и ещё ряд "мелочей"... Ну и собственно, защита должна затруднять нелегальное использование настолько, что бы сделать нелегальное использование разумно затруднённым, но делать абсолютную защиту - бессмысленно.
Alaspher вне форума  
 
Непрочитано 14.08.2007, 15:19
#40
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Так конечно красивее, но тогда просто отматываю дату на момент получения временной метки от Вас, и если надо удаляю все метки которые делает программа, чтобы это предотвратить. Вот и всё. Почти на каждое действие уже давно есть противодействие...

Я не хочу показать что всё ломается легко, а лишь хочу показать, что защита - это творческий процесс, даже наверное война с хакером, которого можно победить только хитростью. А для этого надо сначала изучить его возможности.
Евгений А. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Типы данных