tonal пишет:На старте приложения идёт запрос-ответ.
Соответственно длл-ка и приложение могут передать друг другу блок данных.
Да и головное приложение и dll-ки.
Как вариант можно при помощи Guardant API организовать перекрестную проверку рандомных блоков данных, точнее проверку подписи (ф-ии GrdSign и GrdVerifySign) таких блоков. Причем генерировать данные для подписи лучше не только на старте приложения и загрузке библиотеки, но и по другим событиям (например, при некоторых действиях пользователя, по временным меткам, счетчикам и т.п.).
Т.е. приложение генерирует данные, отправляет для подписи в ключ, получает буфер с подписанными данными и отдает его в библиотеку. Библиотека выполняет проверку подписи и, если все в порядке, то продолжает работать и в свою очередь также генерирует данные, подписывает их при помощи аппаратного ключа, а приложению отдает для проверки.
Таким образом библиотека и приложение могут производить некую взаимную аутентификацию и проверку наличия нужного аппаратного ключа. Но это не защита именно кода самого приложения, для этого есть Guardant Armor.