1

一部のアルゴリズムをリバース エンジニアリングから保護したい。常にリスクがあることは承知していますが、作業をできるだけ複雑にしたいと考えています。JavaにはProGuardやその他の難読化ツールがあることを知っています。しかし、ほとんどの知識はアプリケーションの構造ではなく、アルゴリズムの数値的な詳細にあります。それについて読んで、アルゴリズムの保護に疑問を抱くようになりました。

いくつかの変数の名前を変更するだけでは、アルゴリズムをリバース エンジニアリングするのは難しくありません。おそらく、どの方法がアルゴリズムに適しているか、どの難読化ツールがアルゴリズムで最も効果的かを教えていただけますか。

現時点では、ちょっとした手仕事とそれをツールと組み合わせることを考えています。

4

2 に答える 2

1

任意の JVM で、アルゴリズムを Java バイトコードとして実行する必要があると仮定します。その後、クラスの読み込みプロセスをどれほど難読化しても、JVM をハッキングしてバイトコードをどこかにダンプできます。バイトコードを取得したら、制御フロー分析を行うことができます。つまり、どの情報がどこからどこに渡されるかを決定します。

個々の命令の順序を混乱させることはできますが、それによって計算が変わることはありません。アルゴリズムを変更せずに実行したいだけの人にとって、これは何も変更しません。並べ替えによってアルゴリズムの変更がどの程度妨げられるかは、アルゴリズムと制御フローの複雑さに大きく依存します。

あいまいな方法でリフレクションを使用するか、独自のインタープリターを実装してそれを使用してアルゴリズムを実行することにより、制御フローを混乱させることができる場合があります。しかし、これらのアプローチは両方とも、アルゴリズムのパフォーマンスに深刻なペナルティをもたらす可能性があります。

他の言語 (ネイティブ x86 コードなど) では、バイトを命令に分割する方法についてあいまいさを導入することで、逆アセンブラーを混乱させる可能性があります。あるケースでは一部のバイトを命令の末尾部分として使用しますが、別のケースでは別個の命令として使用します。ケース。しかし、Java にはそのようなオプションはありません。バイトコードの意味はあまりにも明確に定義されています。

物事を多少難読化できる方法の 1 つは、アルゴリズムをプログラムの他のステップと密接に混合することです。直線的なプログラムの場合、特に目に見えない GUI オブジェクトや同様の奇妙なものを介して数値を渡す場合、これにより追跡が少し難しくなる可能性があります。しかし、ループなどが必要になると、ループの境界を揃えるのは非常に難しいように思われるため、このアプローチにも大きな可能性があるとは思えません。そして、これに対してすぐに使用できる難読化ツールがあるとは思えないので、手動で行う必要があります。

于 2012-09-05T15:10:42.360 に答える
1

私の経験では、Java実装で.soファイル、つまりネイティブ実装を使用できます。難読化されたコードで追跡するのは非常に困難ですが、唯一の欠点は、そのためにJNIを使​​用する必要があることです。

于 2012-09-05T18:17:37.177 に答える