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

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

Типы данных

Ответ
Поиск в этой теме
Непрочитано 12.08.2007, 19:46 #1
Типы данных
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))
  )
Просмотров: 11776
 
Непрочитано 12.08.2007, 22:11
#2
Кулик Алексей aka kpblc
Moderator

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


А попробовать выполнить обратное, то есть itoa не пробовал? Число 20070812 превышает предельный размер целых чисел. Попробуй для преобразования в строку числа использовать (vl-princ-to-string) - результат будет гарантированно верный.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.08.2007, 23:19
#3
Holon

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


Честно говоря я хода мысли непонял, можно поподробней пожалуйста.
Holon вне форума  
 
Непрочитано 12.08.2007, 23:59
#4
Кулик Алексей aka kpblc
Moderator

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


Сорри, 2 дня были очень тяжелыми, мозги работают через раз. Ограничение на величину integer не превышено (судя по документации). Но я бы либо "разбивал" дату на отдельные части - год, месяц, день, и сравнивал уже их, либо попробовал бы нечто типа:
Код:
[Выделить все]
(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* "d:\\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
          (setq file_handle
                 (open (findfile (strcat *lic-path* *lic-file*)) "a")
                ) ;_ end of setq
          (write-line
            (strcat "LicenseManager_" *lic-path* *lic-file*)
            file_handle
            ) ;_ end of write-line
          (close file_handle)
          ) ;_ end of progn
        (progn
          (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
Вроде бы корректно работает (сравниваются строки, а не числа).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 09:05
#5
Holon

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


Проверял неработает результат следующий если в файл "license.lic" прописываю
20070812 то функсия (test) выдает алерт на экран (alert "Licensed time expired!")и выходит не прописывая в "license.lic" ничего, в конце функция возврасщает
_$ (test)
quit / exit abort


теперь если я прописываю в ручную в "license.lic" 20070817 заметим что сегодня
(20070813), функция возврачает
_$ (test)
nil
Незапуская мою функцию (c:Glass) Я в принципе ничего неменял кроме диск D: на диск U: к знаку "<" добавил "<=" и добавил строку для запуска моей функции
(if (> cdate lic)(c:Glass))
Код:
[Выделить все]
(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 
          (setq file_handle 
                 (open (findfile (strcat *lic-path* *lic-file*)) "a") 
                ) ;_ end of setq 
          (write-line 
            (strcat "LicenseManager_" *lic-path* *lic-file*) 
            file_handle 
            ) ;_ end of write-line 
          (close file_handle) 
          ) ;_ end of progn 
        (progn 
          (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
  (if (> cdate lic)(c:Glass))
  ) ;_ end of defun
Holon вне форума  
 
Непрочитано 13.08.2007, 09:08
#6
Кулик Алексей aka kpblc
Moderator

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


Я не понял, c:glass должна запускаться в каком случае? Если лицензия еще не кончилась?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 09:15
#7
Holon

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


Да конечно
Holon вне форума  
 
Непрочитано 13.08.2007, 09:19
#8
Кулик Алексей aka kpblc
Moderator

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


Дык ента...
Код:
[Выделить все]
(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
          (setq file_handle
                 (open (findfile (strcat *lic-path* *lic-file*)) "a")
                ) ;_ end of setq
          (write-line
            (strcat "LicenseManager_" *lic-path* *lic-file*)
            file_handle
            ) ;_ end of write-line
          (close file_handle)
          (c:glass)
          ) ;_ end of progn
        (progn
          (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
Кто мешает делать так? Или я чего-то не учитываю?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 09:35
#9
Holon

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


Этот вариант работает,только лицензионный файл незатирается
Holon вне форума  
 
Непрочитано 13.08.2007, 09:44
#10
Кулик Алексей aka kpblc
Moderator

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


Ээээ... А с какого перепугу оно должно затираться-то? Сначала файл открывается в режиме чтения, потом - добавления в конец. Между прочим, взято с исходного кода
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 09:57
#11
Holon

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


Цитата:
Сообщение от Кулик Алексей aka kpblc
Ээээ... А с какого перепугу оно должно затираться-то? Сначала файл открывается в режиме чтения, потом - добавления в конец. Между прочим, взято с исходного кода
нет добавления в конец
Holon вне форума  
 
Автор темы   Непрочитано 13.08.2007, 10:02
#12
Holon

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


Кстати хорочая идея я поменяю "a" на "W", чтобы затирала правильную строку.
Holon вне форума  
 
Непрочитано 13.08.2007, 10:27
#13
Кулик Алексей aka kpblc
Moderator

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


Все добавляется. Чтобы был автоматический перевод строк, замени
Код:
[Выделить все]
(write-line
            (strcat "LicenseManager_" *lic-path* *lic-file*)
            file_handle
            )
на
Код:
[Выделить все]
(write-line
            (strcat "\nLicenseManager_" *lic-path* *lic-file*)
            file_handle
            )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 10:46
#14
Holon

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


Нет проблема не в этом, я сейчас сделал анимацию на функцию то место где делается (write-line) обходится стороной, и перескакивает сразу на (alert "Licensed time expired!")
(exit)
Проблема по вложению (if и (progn
Holon вне форума  
 
Непрочитано 13.08.2007, 10:51
#15
Кулик Алексей aka kpblc
Moderator

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


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

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


20070812
Holon вне форума  
 
Автор темы   Непрочитано 13.08.2007, 10:59
#17
Holon

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


Анимация показивает, что до строки write-line дело даже недоходит, проблема в структуре ИМХО
Holon вне форума  
 
Непрочитано 13.08.2007, 10:59
#18
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Holon
20070812
А если сделать
Код:
:?:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.08.2007, 11:03
#19
Holon

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


а в чем разница ?
Holon вне форума  
 
Автор темы   Непрочитано 13.08.2007, 11:17
#20
Holon

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


Да ошибка в структуре программы, когда лицензия правильная, 20070817 то добавляется строка
20070817

LicenseManager_u:\lisp\lic\license.lic
Holon вне форума  
 
Непрочитано 13.08.2007, 11:26
#21
Кулик Алексей aka kpblc
Moderator

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


Фффуф...
Есть предложение: разобрать конкретный пример. Ок?
Создаем 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,451


Ага, а на повторном сравнении что будет?
__________________
Моя библиотека 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,451


Какая строка остается открытой?
Кстати, зачем вообще добавлять в 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,451


А если втупую зашифровать строку даты?
Прямое "шифрование":
Код:
[Выделить все]
(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,451


Естественно! О чем я и говорю: кому понадобится - сломают все равно. Слово "шифрование" не зря взято в кавычки в моем предыдущем высказывании
__________________
Моя библиотека 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,451


Защитой программ (особенно компилированных), насколько мне известно, в свое время очень плотно занимался Евгений Елпанов, если не вру, его резюме было: "на лиспе написать работающую защиту практически невозможно".
Даже 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


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

Я не хочу показать что всё ломается легко, а лишь хочу показать, что защита - это творческий процесс, даже наверное война с хакером, которого можно победить только хитростью. А для этого надо сначала изучить его возможности.
Евгений А. вне форума  
 
Непрочитано 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 вне форума  
 
Автор темы   Непрочитано 14.09.2007, 13:49
#61
Holon

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


Объясните пожалуйста почему выдает ошибку, есть некоторая функция (y_month_d) возвращающая строку,
эту строку я хочу присвоить списку строк, что я делаю неправильно?
Код:
[Выделить все]
_$ (y_month_d)
"14.9.2007"
_$ (setq all ((y_month_d) "aaaaaa" "bbbbbb" "cccccc"))
; error: bad function: "14.9.2007"
_$
Holon вне форума  
 
Непрочитано 14.09.2007, 14:11
#62
Кулик Алексей aka kpblc
Moderator

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


(setq all (list (y_month_d) "aaaaaa" "bbbbbb" "cccccc"))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.09.2007, 15:09
#63
Holon

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


Да уж
Holon вне форума  
 
Непрочитано 14.09.2007, 15:30
#64
Кулик Алексей aka kpblc
Moderator

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


:?: Чего, и так не сработало?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.09.2007, 16:58
#65
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Как бы не и тему, просто тут заикались
насчет работы с Экселем...
http://dwg.ru/forum/viewtopic.php?t=9468

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 15.09.2007, 18:47
#66
Holon

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


Цитата:
Сообщение от Кулик Алексей aka kpblc
:?: Чего, и так не сработало?
Конечно сработало просто я был подуставший, начал тупить :?
Holon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Типы данных

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск