Tuesday, January 11, 2011

Отголосок прошлого :)

    На cracklab-е обсуждается тема взлома конверта, разработкой которого я занимался раньше :) Интересно, сколько времени потребуется на решение задачки (восстановление извлеченных инструкций). Судя по всему, версия конверта достаточно древняя.
    Кстати, технику выдергивания одной инструкции (а это и делает опция /RIP_CODE) используют достаточно большое количество протекторов. Очень часто таким образом запутывают граф потока управления. Armadillo, к примеру, ставит int 3 вместо извлеченной инструкции. В некоторых конвертах ставится call, что накладывает ограничения на размер инструкции (>= 5 байт).
    При кажущейся простоте подхода восстановить исходные инструкции может быть и не так просто. Все зависит от того, насколько защищен интерпретатор извлеченной инструкции. Можно, в принципе, попробовать восстановить посредством анализа входов и выходов, но здесь возникает проблема идентификации этих входов и выходов. Например, как определить, что была извлечена инструкция mov eax, [imm]? Поставить бряк на память? А если есть фальшивые чтения памяти? А если флаги доступа к страничке эпизодически меняются тем же VirtualProtect-ом? Плюс ко всему, необходимо полное покрытие исследуемеого файла дизассемблером, что в случае перехваченных инструкций еще более затруднительно. Т.е. задачка то в общем случае вовсе нетривиальная :)
    Другой вопрос в том, какой защитный механизм срабатывает при интерпретации такой перехваченной инструкции. Может так случиться, что восстанавливать исходные нет никакой необходимости. Проще подкорректировать интерпретатор так, чтобы он всегда работал как надо :)
    В случае с конвертами, идущими в качестве бесплатного (или платного) приложения к донглам, упор делается на поддержку всех выпускаемых ключей. А значит и младших (медленных и устаревших), и сетевых моделей. Это значит, что вызывать электронный ключ каждый раз при вызове интерпретатора перехваченной инструкции даже при использовании профайлера нельзя (именно поэтому мы пока не видим хороших автоматических решений для ключей с загружаемым кодом). Особенно четко это проявляется в случае сетевых ключей. Поэтому используется либо периодический опрос (когда клиент сам задает период опроса донгла), либо кеширование информации, полученной с помощью донгла.
    В случае периодического опроса вся вина при потере производительности ложится на клиента, который осуществляет защиту. Период опроса он, как правило, задает самостоятельно.  
    В случае кеширования информации необходим хитрый механизм, который, в зависимости от платформы, на которой запущено защищенное приложение, будет определять время, в течение которого информация будет храниться в кеше. Или надо придумать некоторый параметр, который это время регулировал бы, свалив всю вину на клиента :) Информация в этом случае достаточно стандартная (расшифрованные с помощью донгла код, байт-код или данные,  ключ для расшифрования чего-либо, какое-нибудь инициализирующее значение для чего-либо, полученное с помощью донгла).
    Самое интересное в том, что для задачи привязки софта к ключу (или лицензирования вообще) глубокой разницы между полноценной обфускацией кода программы и выдергиванием по несколько (или даже по одной) инструкций с последующим встраиванием интерпретатора нет. В случае лицензирования ведь нет необходимости защищать пользовательский код от анализа, а надо, чтобы он не работал при невалидной или отсутствующей лицензии. А вот механизм лицензирования должен быть действительно качественным, что сложно обнаружить в унифицированных решениях в силу объективных причин.

11 comments:

  1. хм, тяжело читать без абзацев

    Дмитрий, а можно ли определить дату, когда был произведен ruToken 32K?

    ReplyDelete
  2. Абзацы расставил. Действительно неудобно было читать.

    Насчет второго, я по правде говоря, использовал Rutoken, в основном, для открывания двери (RFID) :) Если серьезно, то можно посмотреть с помощью rtAdmin в свойствах. Там есть поля, позволяющие косвенно судить о дате выпуска. Не могу сказать, насколько ID связан с датой. По всей вероятности связан. Но я не владею информацией об этой взаимосвязи. А техподдержка Актива не может ответить на этот вопрос?

    ReplyDelete
  3. RFID удобно использовать, да вот антенна имеет малый диапазон воздействия

    Вот, самое интересное, что в rtAdmin дата абсолютно не представлена, а БССовцы утверждают, что могут определять дату производства ключа. Как всегда лапшу вешают, видимо.

    Поддержка, поддержкой, а мнение участника разработчики более интересна будет для меня

    ReplyDelete
  4. С определением даты ничем не могу помочь. Наверняка по ID, но я честно не в курсе. Как то в Активе определяют, что гарантийный срок истек :) Либо какой-то хитрый запрос, либо по ID.

    ReplyDelete
  5. Спросил у знатока :) По запросу Актив выдает информацию о дате производства. Для этого нужен либо ID, либо маркировка на токене.

    ReplyDelete
  6. >>RFID удобно использовать, да вот антенна имеет малый диапазон воздействия

    В таких габаритах получить большой радиус действия очень проблематично. И, кроме того, радиус зависит от мощности считывателя.

    ReplyDelete
  7. Есть еще теоретический недостаток с фальшивым срабатыванием при большем диапазоне. Прошел человек мимо двери - она и открылась :)

    ReplyDelete
  8. This comment has been removed by the author.

    ReplyDelete
  9. Согласен с предыдущим оратором. Справедливости ради стоит отметить, что бесконтактные карты с большой антенной также имеют небольшой радиус действия именно по озвученной причине.

    ReplyDelete
  10. Спасибо за инфу. Как и предполагал.

    Я вот БССцам и говорю, что дату они не определят, разве по ID, а манагер мне на след.день заявил: "а нам производитель раскрыл расшифровку ID" ))

    Про антенну - логично.

    ReplyDelete
  11. > "а нам производитель раскрыл расшифровку ID"

    Фраза неоднозначна. Вот они отправили ID, а производитель раскрыл им его расшифровку :) И так много раз :) Да, можно сказать, что они действительно умеют определять дату изготовления токена по ID :)

    ReplyDelete