Предоставляет ли байт-код SPIR-V запутывание?

Обратному инженеру легко подключить графический отладчик к приложению OpenGL для извлечения исходного кода шейдера. Насколько я понимаю, Vulkan, с другой стороны, использует байт-код SPIR-V, а не передает текстовые шейдеры в графический API.

Байт-код SPIR-V запутывает источник шейдера, или его довольно легко декомпилировать?

3 ответа

Решение

Существует полная спецификация, подробно объясняющая поведение каждого кода операции SPIR-V. Это своего рода противоположность запутывания. Но это еще не все.

SPIR-V, несмотря на то, что является "сборкой", сохраняет большое количество информации об исходной программе. Он содержит определения структуры, определения функций с типами параметров и возвращаемых значений, циклические и условные конструкции и т. Д. Написание декомпилятора для SPIR-V совсем не сложно.

SPIR-V также может дополнительно содержать фрагменты текста, которые аннотируют различные определения SPIR-V. Это скорее функция среды, скомпилированной в SPIR-V, но выходной SPIR-V может содержать имена переменных, имена структур и т. Д. Эти декорации OpName могут быть легко выбраны, если хотите.

Но даже без имен вся важная структурная информация есть. Таким образом, преимущества безопасности от SPIR-V по сравнению с необработанным GLSL довольно минимальны.

Это не делает никакого реального запутывания. Единственное, что он может сделать, это удалить имена переменных.

Если приложение не желает усложнять фактический расчет, то это все.

Это не может сделать много с потоком управления, потому что вулкан требует структурированного потока управления. Где каждая условная ветвь должна иметь блок слияния, а каждый цикл имеет строгую структуру.

SPIR-коды работают как байт-коды в Java:

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

Нет простого обходного пути для обратимости кодов операций в простой код. Некоторые решения, используемые в области Java:

  • запутывание - как ProGuard делает для байт-кода Java - не уверен, возможно ли это с SPIR;
  • шифрование кода симметричным ключом - ключ жестко закодирован в вашем коде C.
  • шифрование кода с помощью асимметричных ключей - закрытый ключ приходит из сети после входа на сервер.
Другие вопросы по тегам