Об авторстве и защите.


Поводом для написания этой статьи послужило письмо от человека. Смысл его был такой:

"У нас на предприятии имеется постпроцессор для станка <такого-то>. Постпроцессор был куплен у фирмы <такой-то>. Но работа постпроцессора нас не устраивала. Во-первых, он был привязан к компьютерам, а во-вторых, постпроцессор постоянно требует ввод не понятных команд, которых нет в этом УЧПУ. Чтобы избавиться от него, мы сами разработали постпроцессор на котором сейчас и работаем. Не мог бы я посмотреть, что за странный файл 'postkinematics.exe', лежащий в системной папке Windows, который был привязан к покупному постпроцессору? Не вложена ли в него скрытая кинематика постпроцессора, которую мы не учли.?..."

Знакомая ситуация, не правда ли?

Первое беглое знакомство с присланным постпроцессором вызвало у меня нервный смешок. При дальнейшем глубоком изучении смех усиливался.
    во-первых, выяснилось что первоначально постпроцессор был разработан для ЧПУ систем Fanuc или Mazatrol, естественно со своей спецификой свойственной этим системам.
    во-вторых, присланный вместе с постпроцессором файл на проверку оказался всего лишь старой утилитой (скомпилированным очень старым компилятором) для получения информации о компьютере: Имя компьютера, номер сетевой карты (MAC), IP - сетевой карты, номер винта, IPX, .......
   в-третьих, сразу возникли вопросы: Кто принимал пп? Тесты? Акты? (Ведь бухгалтер должен был как то оплатить)?   .....

  Файл для исследования: postkinematics.zip

Суть работы можно описать примерно так:
в событии [Start_of_program] вызывается ниже показанная процедура, суть которой заключается в том, чтобы получить MAC-адрес сетевой карты и проверить - входит ли она в список разрешенной для запуска постпроцессора или нет.
  Код ниже мне прислали уже обрезанным, но и так было все понятно..

#=============================================================
proc PB_CMD_kin_set { } {
#=============================================================
 catch {
   exec postkinematics.exe
 } data
 set buffer [split $data \n]
 set adres {}
 foreach line $buffer {
   if [regexp -nocase {Ethernet} $line] {
    set val [string trim [lindex [split $line :] end]]
    regsub -all {\-} $val : val
    lappend adres [string tolower $val]
   }
 }

## .......
## Проверка на размер и время создания файла.
## .......

global mom_warning_info
set realadres(0) "\60\60\61\63\144\64\141\144\61\62\62\64"
set realadres(1) "\062\062\143\063\061\061\146\141\145\142\063\141"
set realadres(2) "\67\62\70\142\145\145\71\62\141\143\141\71"
set realadres(3) "\60\60\145\60\61\70\146\144\65\143\146\61"
set realadres(4) "\60\60\61\63\67\67\62\66\143\62\66\62"
set realadres(5) "\60\60\61\67\63\61\66\145\143\141\63\66"
set realadres(6) "\60\60\61\63\67\67\62\71\144\66\71\62"
set realadres(7) "\60\60\61\66\145\66\70\71\70\66\144\60"
set realadres(8) "\60\60\61\66\145\66\70\141\70\70\66\62"
set realadres(9) "\60\60\61\66\145\66\70\60\64\67\63\65"
set realadres(10) "\60\60\61\66\145\66\70\143\70\143\143\143"
set realadres(11) "\60\60\61\66\145\66\70\141\70\142\62\61"
set realadres(12) "\60\60\61\66\145\66\70\61\65\145\142\64"
set adres_on 0

##.........


}

 Сейчас Это Все - фирма делает через Tcl. Подсоединяя к постпроцессору MOM - расширение в виде библиотеки *.dll или *.so .
 

   Рассмотрим немного механизм работы данного MOM-расширения. Подробно он нам не известен, я пользуюсь независимыми источниками. Если у Вас имеется возможность, просим Вас, ознакомить с творчеством, выслав мне *.dll.

 2-ой вариант

 Фирма, занимающая защитой подобным образом, понимала, что их первый механизм далек от "идеала", и по этому 2-ым развитием защиты стало упрятывание механизма в МОМ - расширение Tcl интерпретатора UG.

  "под каждый станок они делают свою dll так, что ее функционал состоит из 2 частей:

  1. проверочная "свой-чужой";
  2. расчетная часть (набор функций MOM_output_literal с выводом некоторых кадров).

 Если тупо отключить вызов dll в tcl, то без второй части нормальную УП не получишь... И если первая часть у них стандартна, то вторая весьма разнообразна для разных заказчиков и станков.

 Старую защиту уже пол-страны научились обходить, даже не трогая dll, т.к. привязка шла к серийному номеру тома или MAC-адресу сетевой карты. Как его перебить любым редактором секторов - дело абсолютно нехитрое..."  

     1. Проверка серийного номера диска на основе WinApi: GetVolumeInformation
 Пример исходника 
 2. Проверка ликвидности запуска пп на основе UGOpen: UF_ask_system_info
 Пример исходника 
 3-ий вариант

  "Идя навстречу "пожеланиям трудящихся" :) года полтора-два назад" (получается в 2008-2009 гг), "фирма сменила метод защиты. Теперь у них более цивильно, с увязкой UG на компе - снимается CID, и защита завязана на него." Новый метод защиты был связан с выпуском NX5 и появлением в его дистрибутиве утилиты ugs_composite.exe.

 Данная утилита предназначена для создания уникального компьютерного идентификатора и не только. Идентификатор, по заявлением UG,  создается на основе сетевых параметров компьютера и характеристики его железа.


Документация: CID.pdf

Если запустить эту утилиту с ключом -v , то получим примерно такой ответ:

 /ugs_composite.exe -v
 Siemens PLM Composite HostID Tool v. 2.0

 Утилита прямо не зависит от библиотек UG. По своей внутренней структуре довольна таки запутанна. Разработана в  1999-2007 Macrovision Corporation и Certicom Corp. 1999Aug 7-2000 ( .\src\a16.c - ...- .\src\a486.c). 

  •  ? Утилита выдает следующие варианты ID :  ANY    SE_HWKEY_ID    UG_DEMO_ID    UG_HWKEY_ID    LM_A_VENDOR_ID_DECLARE.
  •  ? Формат выдачи SNH  для UGS:
     
    The UGS Licensing composite hostid is : "%s"
      "%s", "%s", "%d", "%d"
  • ? Меня смутил размер. А также наличие WinApi функций для графики. Что то тут не так.....
int main(int argc, char *argv[])
{
 int i; 
 int v4;
 int v6;
 int v7;

 for ( i = 1; i < argc; ++i )
 {
   if ( !strcmp(argv[i], "-v") )
   {
     printf("Siemens PLM Composite HostID Tool v. 2.0\n");
     exit(0);
   }
 }
 v6 = sub_410010(0, 0, &unk_582CC0, &dword_582F3C);
 v4 = sub_40FA00(dword_582F3C, &dword_51E000, dword_51E008);
 if ( v6 || v4 )
 {
   sub_40F62E(dword_582F3C, "Composite Hostid FAILED to initialize");
   printf("\n%d, %d\n", v6, v4);
 }
 v7 = sub_40EEE0(dword_582F3C, 2, Str1);
 argc = sub_40EEE0(dword_582F3C, -1, byte_536460);
 if ( strcmp(Str1, byte_536460) || v7 || argc != v7 )
 {
   printf("Error retrieving composite hostid. (SNH)\n");
   printf("\"%s\", \"%s\", \"%d\", \"%d\" \n ", Str1, byte_536460, v7, argc);
 }
 sub_40EEE0(dword_582F3C, dword_51E000, Str1);
 sub_40EEE0(dword_582F3C, dword_51E004, byte_536460);
 if ( sub_40EEE0(dword_582F3C, 31, (char *)&unk_538460) )
     sub_40EB77(dword_582F3C);
 else
     printf("The UGS Licensing composite hostid is :\n\"%s\"\n", &unk_538460);
 sub_40DEE2(dword_582F3C);
 printf("Press the ENTER key to continue...\n");
 getchar();
 exit(0);
}

  Образно, теперь процесс защиты можно представить следующим образом:

  • Для начала, фирма требует предоставить CID каждого компьютера используя утилиту ugs_composite.exe.
    Или встроенную библиотеку для постпроцессора : check_composite_16.zip
  • Затем этот CID они прошивают в *.dll (*.so).
  • Процесс проверки должен выглядеть примерно так: при запуске постпроцессора, интерпретатор подгружает  *.dll (*.so), который запускает ugs_composite.exe ( или ugs_composite должна быть интегрирована в dll c MOM) и проверяет его с зашитой в него, предварительно собранной выше, базой номеров CID.

  • Дополнительно, вводится расчетная часть (набор функций MOM_output_literal с выводом некоторых кадров).
     
 5-ый вариант ( будущего )
    Следующим этапом защиты построения постпроцессоров, я думаю может стать кодирование их, в так называемый формат *.tbc.
 Во всяком случае, к этому видны уже подвижки....

  Подвижки эти начали немецкие программисты в 2002-2004 гг.

 Что же такое формат *.tbc? Аббревиатуру tbc можно перевести как "tcl binary compile" или "tcl bytecode". Не путайте с файлом формы из почтовой программы The Bat! и другими программами.

 Свою историю этот формат начал с небезызвестной платной программы TclPro. Но в далеком 2000 году компания TclPro перевела свою разработку в режим ОпенСорс: http://sourceforge.net/projects/tclpro/ и участники разошлись по другим проектам. Её работы подхватила компания ActiveState, занимающая развитием ActiveTcl, TclDevKit,.. Данный программный продукт ( Tcl Dev Kit ) предоставляет компилятор, который компилирует tcl скрипты в байткод и преобразует его в файл с расширением .tbc. "Образно, tbc - файл, тоже самое что и tcl - скрипт, только "platform independent"." ( это слова с сайта производителя) Применение Tcl Dev Kit Compiler имеет ряд ограничений:

  • [incr Tcl] код не компилируется.
  • Код с динамическим созданием процедур не компилируется.
  • И процедуры, использующие пространство имен namespace eval - также не компилируются.

 Для выполнения *.tbc скрипта необходимо подключить run-time package - tbcload. Соответственно, при использовании его в постпроцессоре он должен идти в комплекте.

 Пример подключения.
set pplib "pplib_2.0.tcl"
set udelib ""
set std_pooldir [MOM_ask_env_var "UGII_CAM_POST_DIR"]

#_______________________________________________________________________________
# NX UGPost, uses tbcload TBC
#_______________________________________________________________________________
# 
package ifneeded tbcload 1.3 [list load [file join $std_pooldir/tbcload13.dll]]
regsub ".tcl" $pplib ".tbc" pplib_tbc 
regsub ".tcl" $udelib ".tbc" udelib_tbc

...
#_______________________________________________________________________________
# Source - Пример.
#_______________________________________________________________________________
if {$pplib != ""} {
 if {[string index $pplib 0] != " "} {
  if {$DEBUG} {puts "source $std_pooldir$pplib..."}
  if {[catch {source "${std_pooldir}$pplib"}]} {
   if {[catch {source "${std_pooldir}$pplib_tbc"}]} {
     MOM_output_to_listing_device \
       "ERROR: ***** $std_pooldir$pplib in $std_pooldir not found *****"
     break
    } else { 
     lappend std_config_data "using encoded TBC pplib ..."
    }
   } else { 
   lappend std_config_data "using development TCL pplib ..."
  }
 }
} 

 Сложность декомпиляции tbc - файлов заключается в том, что исходники компилятора и среды выполнения открыты. ( В случае указанного выше проекта). То-есть, никто не мешает провести изменения пакета tbcload и распространять его с постпроцессором. В другом случае, достаточно снова изменить пакет tbcload и компилятор, чтобы получить уже другой - tbcload2.

 Эта ситуация, в корне отличается, скажем от декомпилятора байт-кода для Java - знаменитого DJ Java Decompiler от Atanas Neshkov. И всё потому, что стандарт  Java принят официально и не меняется, для обеспечения совместимости всех производителей.
 

К чему я?

   Мне довелось 2-а раза в жизни общаться с разработчиками САПР. Конечно, системы САПР были не ахти какого высокого уровня. Но. В обоих случаях, при разговоре о постпроцессорах и их роли - разработчики САПР махали руками и говорили: "Постпроцессоры? А что в них такого сложного? Там всё очень и очень просто.   ........ ".

   Вы знаете, мне всегда немного не понятна позиция таких вот разработчиков постпроцессоров. С одной стороны они создали и продали заведомо ущербный постпроцессор. Просто грубо, и даже очень, переделав его под другую систему ЧПУ, которая даже близко не стояла с первоначальной ЧПУ постпроцессора. С другой стороны, они предпринимают меры по защите, чтобы его не использовали на других предприятиях.

В мире существуют около 247 фирм из 14 стран являющихся крупными производителями станков. А сколько мелких?
  Из них только:
  Yamazaki Mazak Corp. (частная семейная компания, основанная в 1919 г.)  Входит в первую тройку мировых производителей станков, выпуская около 6 тыс. токарных станков с ЧПУ (марки Integrex) и обрабатывающих центров в год.
  Shenyаng Machine Tool (Group) Co Ltd. является акционерным обществом с контрольным пакетом акций в руках государства. Специализируется на массовом производстве станков низкого ценового сегмента. Создано в 1993 г. как объединение ряда станкостроительных заводов, способных производить ежегодно до 60 тыс. станков, в том числе 10 тыс. станков с ЧПУ.

Представьте - каждый год на планете появляется более 200-300 тыс. станков с ЧПУ разных видов. Производители станков модифицирует старые модели, выпускают новые, извращаются в проектировании,  в использовании разных новых материалах. Комплектуют станки новым дополнительным оборудованием. И что? Несмотря на обилие и разнообразие всего этого металлического зверинца, математически и физически - весь этот хлам попадает лишь под несколько кинематических схем.

  Также на рынке не так уж много производителей ЧПУ, которых различаются синтаксисом команд. Выходит, что каждый год люди (инженеры) делают одни и те же вещи, меняются только поколения. Так зачем изобретать велосипед или прятать, то, что до Вас уже кто то сделал ? Задумайтесь.
  Как Вы думаете, имея закодированный постпроцессор - сколько я или некто другой, потратить времени на воссоздание исходного кода постпроцессора ? День? Два? Максимум месяц, отвлекаясь только по вечерам.. В силу специфики самих постпроцессоров, их схемы работы, практически всегда можно приблизительно воссоздать их псевдокод. Сделать дубляж. Также задаться вопросом о профессионализме людей делающих подобные вещи. В конце концов, есть CAM - продукты где подобным действием не заморачиваются, и предоставляют ОГРОМНОЙ список уже готовых постпроцессоров.

По мимо всего прочего, еще в инете есть ресурс http://www.cadcamcae.ru/ - где каждый зарегистрированный желающий может выложить постпроцессор в свободный доступ.
 Еще в интернете гуляют статьи о том, как самому из подручных средств создать свой станок с ЧПУ.

Короче, при создании своего постпроцессора не заморачивайтесь всякого рода кодированием. Сосредотачивайте свое внимание на функциональности.

Copyright © 2001—2009 че