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

Вернуться   Форум 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))
  )
Просмотров: 11702
 
Непрочитано 14.08.2007, 16:15
#41
Alaspher


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


Против отката системной даты, такая защита, конечно бессильна (и не только так можно обойти), но сам откат, для многих пользователей весьма неудобен - это ведь придётся всё время держать дату машины некорректной, когда используется защищаемый софт (для доменных машин вообще не годится). Для серьёзного софта, наверное это не те издежки, которые отвратят от воровства, а для мелких утилей на ЛИСПе... ну лично я не стал бы дату компа менять, даже еслиб мог - просто купил бы или отказался от использования, если неадекватно дорого. Очистка от "меток", как метод взлома, в данном случае не работает - отсутствие корректной "метки" (файл или запись в реестре - всё равно), это уже критерий нарушения защиты.
Alaspher вне форума  
 
Непрочитано 14.08.2007, 18:20
#42
Евгений А.

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


Такой подход к защите как у вас не выживет. Очень неудобно то, что только чтобы посмотреть на работу програмы, пользователю необходимо связаться с вами по интернету, разрешить программе послать вам неизвестные данные со своего компьютера (!!! это ведь может быть какой-нибудь важный пороль или ещё чего), дождаться от вас ключ, и только после всего этого опробовать программу. Это, извините, антиреклама, которая всех только отпугнёт. Это уже не нужно никому. Без открытого демо-режима очень сложно что-то раскрутить.
Самый надёжный из простых методов защиты на мой взгляд - это физическая привязка кода программы к конкретному "железу" и ограничение в демо-режиме на определённые функции (к примеру размер обрабатываемого файла - тут по вкусу любой вариант). Если это на лиспе, то компилировать всё в один Vlx файл, с использованием собственного именного пространства, оптимизации и связывания. То есть свести взлом программы к использованию дизассемблирования. Остаётся только грамотно организовать в коде лабиринт с ловушками для хаккера, чтобы ему было не сладко, а заказчику - очень дорого!
Недостатки конечно тоже есть, но если продавать не по1000 програм в день ( ), то неплохой вариант.
Евгений А. вне форума  
 
Непрочитано 14.08.2007, 21:39
#43
Alaspher


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


Цитата:
Сообщение от Евгений А.
Такой подход к защите как у вас не выживет...
О чём это вообще? :shock:
Alaspher вне форума  
 
Непрочитано 14.08.2007, 22:26
#44
Евгений А.

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


Согласен - понесло!
Евгений А. вне форума  
 
Автор темы   Непрочитано 19.08.2007, 11:50
#45
Holon

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


я добавил одну строку к коду программы для того чтобы нельзя было отматывать дату назад, и еще вопрос, пути привязки к уникальным ключам в реестре машины, это
означает, что "Ключ" сделанный на другом компьютере небудет работать?
Код:
[Выделить все]
;;; ********************* for users ************************** 
(defun demo:KEYer () 
  (if (>= (demo:get-validateKEY) (fix (getvar "cdate"))) 
    (alert "All right!") 
    (progn
      (alert "All bad!")
      (setq	keyfile
		(open "C:\\Test\\license.dat" "w")
	  ) ;_ end of setq
	  (write-line
	    (strcat "Licensed time expired!")
	    keyfile
	  ) ;_ end of write-line 
	  (close keyfile))
  );_end if 
)
Holon вне форума  
 
Непрочитано 19.08.2007, 15:03
#46
Alaspher


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


Цитата:
Сообщение от Holon
пути привязки к уникальным ключам в реестре машины, это означает, что "Ключ" сделанный на другом компьютере небудет работать?
Да, если только это не полные клоны (т.е. если инсталляция не производилась клонированием образов). Совпадает-ли этот ключ в случае клонировния - не знаю, сечас проверить не на чем.

* То, что я выложил, это только демка для показа принципов - на реальную защиту она похожа очень условно.
Alaspher вне форума  
 
Автор темы   Непрочитано 20.08.2007, 10:51
#47
Holon

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


Если есть желание проверить ключ сделанный на другой машине, вот ключ сделанный на моей рабочей машине
[ATTACH]1187592664.rar[/ATTACH]
Holon вне форума  
 
Непрочитано 20.08.2007, 13:36
#48
Alaspher


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


Цитата:
Сообщение от Holon
вот ключ сделанный на моей рабочей машине
К сожалению, похоже поторопился я с выбором ключика в реестре - он видимо не уникален. Ключи, которые использует сама система для определения уникальности, Автолиспу недоступны - нужно читать от имени системы, а он работает от имени юзера. Как альтернативу, можно попробовать вязаться к guid профиля пользователя (т.е. в домене, на всех машинах, где работает юзер, у него будет работать и защищаемая программа). Для привязки к юзеру, можно использовать примерно такой вариант:
Код:
[Выделить все]
(defun demo:get-volGUID (/ regtr ppath)
  (setq regtr "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\"
        ppath (getenv "homepath")
  )
  (vl-remove
    45
    (vl-string->list
      (vl-string-trim
        "{}"
        (vl-registry-read
          (strcat
            regtr
            (car
              (vl-remove-if-not
                (function
                  (lambda (k)
                    (= ppath
                       (substr (cdr (vl-registry-read (strcat regtr k) "ProfileImagePath")) 14)
                    )
                  )
                )
                (vl-registry-descendents regtr)
              )
            )
          )
          "Guid"
        )
      )
    )
  )
)
Другие функции в при этом не изменятся.

PS: Писать в файл лицензии чтото отличное от ключа, конечно можно, но тогда надо обрабатывать и ошибку получения ключа.
Alaspher вне форума  
 
Автор темы   Непрочитано 20.08.2007, 14:33
#49
Holon

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


В этом месте выдает ошибку
Код:
[Выделить все]
(car 
              (vl-remove-if-not 
                (function 
                  (lambda (k) 
                    (= ppath 
                       (substr (cdr (vl-registry-read (strcat regtr k) "ProfileImagePath")) 14) 
                    ) 
                  ) 
                ) 
                (vl-registry-descendents regtr) 
              ) 
            )
5 forms loaded from #<editor "U:/LISP/TEST_PRG/for_me.LSP">
_$ (demo:generateKEY "20170815")
; error: bad argument type: stringp nil
_1$
Holon вне форума  
 
Непрочитано 20.08.2007, 15:14
#50
Alaspher


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


Цитата:
Сообщение от Holon
выдает ошибку
Как оказывается трудно найти уникальный строковый ключ в реестре, чтоб он точно был везде...

Попробуй это:
Код:
[Выделить все]
(defun demo:get-volGUID (/ regtr ppath)
  (setq regtr "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\"
        ppath (getenv "homepath")
  )
  (reverse
    (vl-remove
      45
      (vl-string->list
        (substr
          (car
            (vl-remove-if-not
              (function
                (lambda (k)
                  (= ppath (substr (cdr (vl-registry-read (strcat regtr k) "ProfileImagePath")) 14))
                )
              )
              (vl-registry-descendents regtr)
            )
          )
          3
        )
      )
    )
  )
)
Alaspher вне форума  
 
Автор темы   Непрочитано 20.08.2007, 15:28
#51
Holon

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


; 5 forms loaded from #<editor "U:/LISP/TEST_PRG/for_me.LSP">
_$ (demo:generateKEY "20170815")
; error: bad argument type: stringp nil
_$
Holon вне форума  
 
Непрочитано 20.08.2007, 16:15
#52
Alaspher


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


Цитата:
Сообщение от Holon
; 5 forms loaded from #<editor "U:/LISP/TEST_PRG/for_me.LSP">
_$ (demo:generateKEY "20170815")
; error: bad argument type: stringp nil
_$
А так:
Код:
[Выделить все]
(defun demo:get-volGUID ()
  (vl-remove 45
             (vl-string->list
               (vl-registry-read
                 "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\"
                 "MachineGuid"
               )
             )
  )
)
:?:
Alaspher вне форума  
 
Автор темы   Непрочитано 20.08.2007, 16:31
#53
Holon

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



[ATTACH]1187613097.rar[/ATTACH]
Holon вне форума  
 
Непрочитано 20.08.2007, 18:32
#54
Alaspher


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


На моей домашней машине последний ключ не работает, при том, что сгенерированые на ней самой работают нормально. Думаю и на других будет так же. НО в функции demo:get-validatekey по завершению работы vl-string-translate перед применением atoi надо бы делать проверку на содержимое (формат) строки иначе, теоретически может и пройти.
Alaspher вне форума  
 
Автор темы   Непрочитано 20.08.2007, 19:47
#55
Holon

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


Немного непонятно для меня
PS: Писать в файл лицензии чтото отличное от ключа, конечно можно, но тогда надо обрабатывать и ошибку получения ключа.
Holon вне форума  
 
Непрочитано 20.08.2007, 23:37
#56
Alaspher


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


Сейчас, при получении из файла лицензии чегото отличного от ожидаемого (например, строки символов выходящих из определённого диапазона или длинны строки) функции могут возвражать неожиданные результаты. Т.е. прочитав строку из файла, по хорошему, надо бы убедиться, что прочитан именно ключ, а не что попало (юзер добрался и отредактировал или вообще стёр файл или всё папку...).
Alaspher вне форума  
 
Автор темы   Непрочитано 21.08.2007, 09:14
#57
Holon

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


Хотел сделать чтото вроде этого,
Код:
[Выделить все]
(defun demo:KEYer () 
  (if (>= (demo:get-validateKEY) (fix (getvar "cdate"))) 
    (alert "All right!") 
    (progn 
     (alert "All bad!")
     (setq keyfile (findfile "C:\\Test\\license.dat")
           keyfile (open keyfile "r")
           res     (read-line keyfile))
           (close keyfile)
     (if (= 96 (strlen res))
     (progn
     (setq   keyfile  (open "C:\\Test\\license.dat" "w")) ;_ end of setq 
     (write-line (strcat "Licensed time expired!") keyfile ) ;_ end of write-line 
     (close keyfile)
      );_end progn
       );_end if
    (setq   keyfile  (open "C:\\Test\\license.dat" "a")) ;_ end of setq 
     (write-line (strcat "Licensed file not curent") keyfile ) ;_ end of write-line 
     (close keyfile) 
    );_end progn# 
  );_end if# 
)
но до этого дело недоходит
Код:
[Выделить все]
(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 
                   )
Я убрал последнюю цифру из строки лицензии
1$ (demo:KEYer)
; error: bad char code in list: -173
_2$
Holon вне форума  
 
Непрочитано 21.08.2007, 12:23
#58
Alaspher


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


> Holon
То, что я выложил, это простейшая демка практически без проверок. Таких проверок должно быть несколько, как на наличие файла (или записи в реестре) лицензии, так и на наличие уникального ключа, которым производится шифрование, потом проверка формата лицензионного ключа, а возможно и не только... Переделывать демку в рабочую программу - неправильно. Быстрее и проще написать своё, а от демки использовать только принципы, может быть какието приёмы... Например, проверка формата должна быть сразу после чтения лицензионного файла и только при её успешности должны производится дальнейшие действия. При неуспешной проверке, функция аналог demo:get-validateKEY должна возвращать какойто осмысленный результат, например nil, или 0, или -1.., а не вылетать с ошибкой. Возвращённый результат, должен перед основной проверкой проверяться на тип или диапазон и только потом на соответствие дат...да и шифровать можно-бы попричудливее, чем сделано в демке, а то бОльшая часть ключа сейчас незначима. Что-нить типа:

Код:
[Выделить все]
;;; ******************** only for me *************************
(defun demo:generateKEY (date / keyfile volGUID)
  (if (setq keyfile (open "C:\\Test\\license.dat" "w"))
    (progn
      (setq volGUID (demo:get-volGUID))
      (write-line
        (apply
          (function strcat)
          (mapcar
            (function
              (lambda (a b) (itoa (+ (/ (apply (function +) volGUID) 8) (boole 6 a b))))
            )
            volGUID
            (vl-string->list
              (apply (function strcat)
                     (mapcar (function (lambda (a) (vl-string-translate "0123456789" a date)))
                             '("ZF=Eg#JdlO" "Hfur*cKPm|" "IFyu-_d!q6" "y.m+(f)Qg,")
                     )
              )
            )
          )
        )
        keyfile
      )
      (close keyfile)
    )
  )
)

;;; ********************* for users **************************
(defun demo:KEYer (/ vKEY)
  (princ "\n")
  (setq vKEY (demo:get-validateKEY))
  (cond ((not vKEY) (alert (princ "License file not found!")))
        ((minusp vKEY) (alert (princ "License file isn't correct!")))
        ((>= vKEY (fix (getvar "cdate"))) (alert (princ "All right!")))
        (t
         (alert (princ "Pilferer! Help! Help! Police!\n\nPress OK and 6 seconds waiting!"))
         (demo:wait 6)
        )
  )
  (princ)
)

(defun demo:get-volGUID ()
  (vl-remove 45
             (vl-string->list
               (vl-registry-read
                 "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\"
                 "MachineGuid"
               )
             )
  )
)

(defun demo:get-validateKEY (/ keyfile res volGUID)
  (if (setq keyfile (findfile "C:\\Test\\license.dat"))
    (progn
      (setq keyfile (open keyfile "r")
            res     (read-line keyfile)
            volGUID (demo:get-volGUID)
      )
      (close keyfile)
      (if (and (= (strlen res) 96) (= (vl-string-trim "0123456789" res) ""))
        (if
          (< (apply (function max)
                    (setq
                      res (mapcar
                            (function (lambda (a b)
                                        (boole 6 (- (atoi a) (/ (apply (function +) volGUID) 8)) b)
                                      )
                            )
                            (demo:str-by-div res 3)
                            volGUID
                          )
                    )
             )
             256
          )
           (progn (setq res
                         (mapcar (function (lambda (a b) (atoi (vl-string-translate b "0123456789" a))))
                                 (demo:str-by-div (vl-list->string res) 8)
                                 '("ZF=Eg#JdlO" "Hfur*cKPm|" "IFyu-_d!q6" "y.m+(f)Qg,")
                         )
                  )
                  (if (apply (function =) res)
                    (car res)
                    0
                  )
           )
           -1
        )
        -1
      )
    )
  )
)

(defun demo:str-by-div (str div)
  (if (/= "" str)
    (cons (substr str 1 div) (demo:str-by-div (substr str (1+ div)) div))
  )
)

(defun demo:wait (sec / stop for)
  (setq stop (+ (getvar "date") (/ sec 86400.0)))
  (princ "\n")
  (while (not (minusp (setq for (- stop (getvar "date")))))
    (foreach i '("\\" "|" "/" "-")
      (princ
        (strcat "\r[" i "] Wait " (rtos (* 86400.0 (- for (fix for))) 2 1) " sec      ")
      )
    )
  )
  (princ "\r                                      \r")
  (princ)
)
Но опять же это, пусть и чуть более подробное, но демо. Но если всё же решишь использовать, то хоть строки преобразования поменяй.
Alaspher вне форума  
 
Автор темы   Непрочитано 21.08.2007, 13:21
#59
Holon

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


Все отлично работает мне очень нравится, вопрос есть ли ограничения по символам
в сртоке преобразования, естественно они должны быть эдентичны в функциях шифровки и дешифровки, я имею ввиду размер и тип.
Holon вне форума  
 
Непрочитано 21.08.2007, 13:28
#60
Alaspher


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


Цитата:
Сообщение от Holon
есть ли ограничения по символам в сртоке преобразования, естественно они должны быть эдентичны в функциях шифровки и дешифровки, я имею ввиду размер и тип.
Не должно быть. Често говоря, совсем детально не анализировал, но любые печатные символы, вроде бы, должны быть допустимы.

Откомпилировать не забудь, иначе всё бесполезно.
Alaspher вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Типы данных