2

リバース エンジニアが OpenGL アプリケーションにグラフィック デバッガーをアタッチして、シェーダー ソース コードを抽出するのは簡単です。一方、Vulkan はプレーンテキスト シェーダーをグラフィックス API に渡すのではなく、SPIR-V バイトコードを使用していると理解しています。

SPIR-V バイトコードはシェーダー ソースを難読化しますか? それとも逆コンパイルするのはかなり簡単ですか?

4

3 に答える 3

5

すべての SPIR-V オペコードの動作を明確に詳細に説明する完全な仕様があります。それはちょっと難読化の反対です。しかし、それだけではありません。

SPIR-V は、「アセンブリ」であるにもかかわらず、ソース プログラムに関する豊富な情報を保持します。これには、構造体の定義、パラメーターと戻り値の型を含む関数の定義、ループと条件付き構造などが含まれます。SPIR-V 用の逆コンパイラーを作成することはまったく難しくありません。

SPIR-V には、オプションで、さまざまな SPIR-V 定義に注釈を付けるテキストのフラグメントを含めることもできます。これは SPIR-V にコンパイルされた環境の関数ですが、出力 SPIR-V には変数名、構造体名などを含めることができます。必要に応じて、これらの OpName 装飾はすべて簡単にカリングできます。

しかし、名前がなくても、重要な構造情報はすべてそこにあります。そのため、未加工の GLSL と比較して SPIR-V から得られるセキュリティはごくわずかです。

于 2016-09-01T20:37:58.063 に答える
3

実際の難読化は行いません。実際にできることは、変数名を削除することだけです。

アプリケーションが実際の計算を複雑にしたくない場合は、それで十分です。

vulkan は構造化された制御フローを必要とするため、制御フローでは多くのことを行うことができません。各条件分岐にはマージ ブロックが必要であり、すべてのループには厳密な構造があります。

于 2016-09-01T20:04:42.810 に答える
1

SPIR オペコードは、Java のバイトコードのように動作します。

  • これは中立的なメタ演算子であるオペコードを作成し、機械の未加工コードに近く、Spir ドライバーを未加工の GPU コードに簡単に変換します。
  • 利点として、オペコードはプレーンなソース コードの配布を回避し、コンパイルされた spir オペコードにはタイプミスや構文エラーなどのコンパイルの問題があるはずです - 既にコンパイルされています。
  • 不利な点は、バイナリ表現が再びプレーンなソース コードに戻せることです。

オペコードからプレーン コードへの可逆性に対する簡単な回避策はありません。Java フィールドで使用されるいくつかのソリューションは次のとおりです。

  • 難読化 - ProGuard が Java のバイトコードに対して行うように - これが SPIR で可能かどうかは不明です。
  • 対称キーによるコード暗号化 - キーは C コードでハードコーディングされています。
  • 非対称キーによるコード暗号化 - 秘密キーは、サーバーへのログイン後に Web から取得されます。
于 2016-09-02T15:13:51.077 に答える