Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Псевдокод

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

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

Handle-ориентированность

Для работы с ключом создается контекст, который сохраняетсяв специальном защищенном контейнере. Доступ к контейнеру осуществляется через хэндл. Хэндл является идентификатором контекста, с которым и оперируют функции Guardant API.
Это позволяет упростить обмен с API за счет минимизации числа вызовов и параметров функций, а также сократить время работы функций.

Поддержка многопоточности

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

  • Существенно повысить защищенность, поскольку отлаживать и анализировать многопоточные приложения гораздо сложнее
  • Легче интегрировать API в сложные многопоточныеприложения
  • Работать с несколькими ключами одновременно

Защищенность, контроль целостностии аутентификация

Содержимое контейнера закодировано. Осуществляется контроль целостности данных, хранящихся в контейнере. Коды доступа тоже хранятся в контейнере в закодированном виде и их не нужно указывать при каждом вызове функций Guardant API. В защищенном контейнере хранятся только те коды доступа, которые действительно используются.
Guardant API контролирует целостность своего кода во избежание вмешательств извне. Код Guardant API защищен от статического и динамического анализа при помощи псевдокода.
Драйвер Guardant подписан при помощи асимметричной криптографии. Защищенное приложение проверяет подпись драйвера (автоматически при вызове функций Guardant API 5.х). Взломщик не сможет создать драйвер-эмулятор электронного ключа, чтобы у него сходилась подпись, поскольку закрытый ключ ему не известен.
Так же как и код Guardant API, драйвер защищен от анализа с использованием технологии псевдокода. Это подразумевает, в том числе, и контроль целостности кода драйвера.

Унификация

Для унификации и упрощения написания кода все функции Guardant API сделаны универсальными для работы, как с локальными, так и с сетевыми ключами. При инициализации библиотеки необходимо указать, с какими ключами будет работать приложение: локальными, сетевыми, или с обоими типами.
Это существенно упрощает процесс программирования систем защиты, рассчитанных на работу и с сетевыми и с локальными ключами, поскольку код защиты можно написать единый. Также максимально упрощается переход на сетевые ключи: по сути надо будет поменять всего один флаг в функции GrdSetFindMode().

  • No labels