[защита ПО с полощью электронного ключа] Нужна хоть какаято идея(((

Тема в разделе "WASM.ZEN", создана пользователем a9d, 9 июл 2010.

  1. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    Задолбался гуглить. В интернете по теме инфы куча. Но то все теория, вода и реклама готовых решений. Никакой конкретики.

    Мне необходимо разработать комплект для защиты ПО.
    Как я понял самый надежный способ защиты - это выдрать часть из исполняемого файла и прошить ее в электронном ключе. Никакое дизассемблирование в этом случае не поможет.

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

    НО как найти в программе этот кусочек который можно вырезать???
    Да еще в это место нужно вставить проверочную функцию. Думал вирусология поможет с этим, но ведь существует ПО написанное на C#, VB, Java и т.п.

    Вопросов очень много(((
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    железо ключа то хоть какое для начала выбрал?
     
  3. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    a9d

    А не лучше позвонить поставщику понравившегося ключа для защиты ПО и попросить технической помощи? Кажись тех. специалистов из Aladdin(HASP) хвалили.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Гы-гы защищать таким способом программу не зная алгоритма и не имея исходников это забавно :))
    Выносить в ключ естественно самую жизненно важную часть, т.е. какое-то нетривиальное вычисление связанное либо с алгоритмом самой программы (что суперкруто но далеко не всегда возможно) либо с алгоритмом её защитного механизма, но во втором случае нужно рассматривать не просто ключ а комбинацию - "навороченная программная защита взаимодействующая с ключом + ключ"

    Если речь идёт об универсальном решении способном защитить любую чужую программу, то вариант
    полюбому не катит. Это только для проги которую писал сам или можешь тщательно проанализировать и то если в ней найдётся подходящий для выноса в ключ кусок, что скорее исключение чем правило.
    Для универсальности прикручивай собственный защитный механизм перерабатывающий исходную прогу в код для виртуальной машины собственного написания (это на васме много раз обсуждалось) а уже часть функций этой виртуальной машины выноси в ключ.

    ЗЫ: чужая готовая виртуальная мащина есно не подойдёт потому как без взаимодействия с её авторами ты опять не сможешь угадать, что же из неё нужно перенести в ключ. Как вариант можно брать опенсорцовую ВМ и её дошлифовывать, есно пряча в ключ именно собственные доработки а не готовые чужие куски, которые любой возьмёт из тех же исходников.
     
  5. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    Насколько мне известно компания www.guardant.ru занимается подобными услугами. Они в ПО вставляют свой драйвер, который работает только с их эл. ключем.
    Имхо идея не очень. Особенно в части доказательства надежности твоего способа. (Обоснование слабовато). Да и защита должна проверять как минимум контроль целостности, то есть перекрывать весь бинарный код, а не кусок.

    Но если очень хочется можно использовать http://forum.antichat.ru/thread32176.html
    "Splicing в переводе с английского - склеивание, сращивание. Суть этого метода перехвата функций заключается в замене первых байт функции на переход в функцию-перехватчик, которая сделает некоторые действия и вернет управление в программу. Функция-перехватчик может восстановить первые байты и запустить оригинальную функцию, обработав ее вывод перед возвращением в программу" _Great_. Таким образом ты можешь вырезать любой кусок, выполнять свои проверки, а потом возвращать код на место!
     
  6. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    В качестве железа предполагаться использовать пример:
    Atmega8,часы реального времени, + переходник uart<->usb.
    Изначально ключ пуст. На нем установлен только загрузчик с поддержкой шифрования. У каждого электронного ключа свой ключ шифрования. То есть, на один ключ можно установить прошивку скомпилированную только для этого ключа. Другой ключ ее просто не сможет установить.


    При покупке софта покупатель топает на сайт производителя и заказывает ключ-прошивку. Которую он устанавливает на свой электронный ключ. Ключ имеет срок годности.

    Все вышеперечисленное уже отработано и работает.

    Осталось самое сложное это защитить ПО с помощью этого ключа.

    Если вставлять функции проверки то придется их разрабатывать для каждого языка программирования. Тулить их в код, где их тупо могут занопить.
    Вырезать кусочек алгоритма вариант но не особо красиво. Придется для каждого языка программирования разрабатывать свои функции, да и описать какой код можно вырезать. Много мороки((
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    a9d
    смотри не перешифруй лишнего, а то с шифровальщиком на 16 MIPS и 8 бит, AMP Phenom х4 превратится в ZX-Spectrum )
     
  8. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    Шифруется данных очень мало. Сама прошивка только один раз. В дальнейшем шифровать, что то на мк смысла особо нет.

    Описание работы загрузчика.
    http://www.atmel.com/dyn/resources/prod_documents/doc2589.pdf
     
  9. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    Все, определился.
    Решено использовать то, что используют многие. Т.е. в ключ перенести небольшие куски кода с простыми математическими операциями а на их место вставить обращение к ключу.

    Вот теперь думаю, что лучше использовать Atmega8+ переходник usb<->uart или AT90usb162.

    PS: Если кто уже работал поделитесь опытом. Произошел сбой(или владелец ключа намудрил) в результате которого часы сбросились. Как лучше поступить?
     
  10. ruextra

    ruextra New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2009
    Сообщения:
    14
    если речь идёт об .ехе
    то гдето внутри этого ехе-шника ерть поле 'контрольная сумма'
    если это поле будет отлично от размера файла то прога ваще работать не будет.

    Еще можно использовать рабочую и нерабочую dlk
     
  11. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    a9d
    На самом деле это очень и очень непростая задача как кажется на первый взгляд :)) Ну например - если вы не автор алгоритма, то как вы узнаете в каком виде нужно передавать входные/выходные данные "вырезаемому" коду? Т.е. перед тем как вынести код куда-либо вам как минимум нужно будет корректно определить все входные данные для него (алгоритм может использовать не только параметры функции, но и глобальные переменные и API) ну и как максимум положить результат на правильное место. Также непонятно как будет решаться именно перенос кода из одной архитектуры в другую. Вобщем чем больше и больше думать над реализацией поставленной вами задачей, то возникает все больше и больше технических вопросов :))
    Вместо такого подхода можно предложить немного другой вариант - критичный код виртуализируется и промежуточные результаты работы ВМ проходят через донгл (что собственно и сделано в VMProtect SenseLock Edition). В этом случае для донгла можно сделать "универсальную" прошивку, на которой это будет все крутится.
     
  12. a9d

    a9d New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2006
    Сообщения:
    234
    Адрес:
    Zimbabwe
    2dermatolog: Проект готов.
    На микроконтроллере я реализовал:
    - упаковщик пакетов, который создает пакеты ответов с четкой структурой.
    - класс обвертку для вырезанных кусков кода. Позволяет не насиловать мозг при вынесении кусков кода.
    - диспетчер который по входному пакету определяет какой функции передать управление.
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    гы.а я бы не так сделал. я бы прошелся по релокам и составил карту переходов откуда и куда. все переходы (или часть их) заменил на переход к обращению к ключу. а в ключ залил саму карту. те обращаемся к ключу, а он на основании 'откуда' возвращает 'куда'.

    сила
    - не надо иметь исходников.
    - не надо иметь быстрого ключа (в плане - никаких вычислений)

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    qqwe
    Красивая идея ;)

    >> - прога должна быть с релоками (например, тело компилить в дллю, а в ехе только вызыватель длли)
    Переходы можно и дизасмом посмотреть

    >> - можно отследить ответы ключа и восстановить карту. правда, только уже пройденные переходы.
    Если защищает тот кто имеет имеет исходники то можно специально напихать редко срабатывающие переходы например где нибудь в обработчике исключений и т.п. чтобы при взломе запарились ждать пока он сработает, а недоломаная прога будет иногда подглючивать.
    И в ключе можно предусмотреть специальный переход который каждый раз меняется сохраняясь в eeprom контроллера. Естественно использовать его нужно редко и прога должа "знать" когда его использовать.

    >> - при частых переходах может тормозить (правда, переходы можно кэшиовать по частоте обращения)
    Можно при выносе в ключ сразу отсеять короткие переходы исходя из того что они могут соответсвовать коротким циклам, а если переход через много команд, то даже если это цикл не страшно.
     
  15. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Основная проблема красивой идеи, т.к. кроме отслеживания обращений проги к ключу, можно у ключа самому спросить всю карту )
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Можно ввести дополнительную защиту по соотношению времени или статистике обращений - если идёт просто запрос всего подряд то ключ блокируется, временно или навсегда. А статистика частых и редких переходов будет соблюдаться независимо от производительности компа.
     
  17. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    100gold
    и как? знаете способ 3х фалсев?
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    qqwe
    просто 3 фался маловато, поскольку найти в дизасме переходы на ключ и вытащить из них правильные запросы действительно легко. Тут нужен контроль по правильной последовательности и/или статистике запросов.

    100gold
    Ещё на этот случай можно предусмотреть набор фальшивых запросов на переход которые в работающей проге никогда не случаются а при попытке запросить всё подряд заблокируют контроллер по принципу 3 фалсев.
     
  19. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Y_Mur
    внутримодульные (.obj) переходы релоков не имеют. я имел ввиду вызова ртл. они вызываются часто. но даже если сделать кэш, и в него попадут частые переходы, то даже если его прочитать и восстановить эти переходы - ртл мало что даст.
    кроме того, это много ручной работы.
     
  20. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Y_Mur
    это тоже можно

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

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