5

コード内のリテラルの値を隠して、hexdumper や decompiler だけで簡単に追跡できないようにするための主な既存のアプローチは何ですか?

たとえば、これをコーディングする代わりに:

    static final int MY_VALUE = 100;

次のようにすることができます。

    static final int MY_VALUE = myFunction1();

    private int myFunction1(){
        int i = 23;
        i += 8 << 4;
        for(int j = 0; j < 3; j++){
            i-= (j<<1);
        }
        return myFunction2(i);
    }

    private int myFunction2(int i){
        return i + 19;
    }

これは、私たちがやろうとしていることのほんの一例です。(はい、知っています。コンパイラはそれを最適化し、定数を事前に計算する場合があります)。

免責事項: これにより追加のセキュリティがまったく提供されないことはわかっていますが、コードがリバース エンジニアリングに対してより不明瞭 (または興味深い) になります。これの目的は、攻撃者にプログラムをデバッグさせ、時間を無駄にすることです。楽しみのためにやっているということを覚えておいてください。

4

3 に答える 3

3

ライフ ゲームのバリエーションを多数回実行し、最終的な状態ベクトルに基づいて制御フローを決定します。

プログラムが実際に何か役に立つことを意図している場合は、目的の分岐を前もって計画し、それに合わせて状態ベクトルのビットを選択することができます (「ここで true が必要で、ビット 17 がオンであるため、その条件を作成します.. ")

于 2011-10-08T02:04:53.423 に答える
3

プログラムの単純なダンプに表示されるテキストを隠そうとしているので、ある種の単純な暗号化を使用してプログラムを難読化し、そのテキストを詮索好きな目から隠すことができます。

詳細な指示:

  1. ROT47.comにアクセスして、テキストをオンラインでエンコードします。この Web サイトを使用して、より一般的な ROTn エンコーディングを行うこともできます。
  2. 文字列定数の内容をエンコードされたテキストに置き換えます。
  3. コード内でデコーダーを使用して、必要に応じてテキストを元の形式に変換します。ROT13 ウィキペディアの記事には、実装に関するいくつかのメモが含まれています。これは、StackOverflowでの ROTn の Javascript 実装です。使用している言語に合わせるのは簡単です。

暗号化が弱いことで有名な ROT47 を使用する理由

最終的に、コードは次のようになります。

decryptedData = decryptStr(MY_ENCRYPTED_CONSTANT)
useDecrypted(decryptedData)

暗号がどれほど強力であっても、デバッガーを装備していれば誰でもブレークポイントを設定しuseDecrypted()て平文を復元できます。したがって、サイファーの強さは問題ではありません。ただし、Rot47 のようなものを使用すると、2 つの明確な利点があります。

  1. テキストをオンラインでエンコードできます。テキストをエンコードするための特別なプログラムを作成する必要はありません。
  2. 復号化は非常に簡単に実装できるため、顧客にとって価値のないことに時間を費やす必要はありません。
  3. あなたのコードを読んだ人なら誰でも (あなたの同僚や 5 年後のあなた自身)、これが本当のセキュリティではなく、あいまいさによるセキュリティであることがすぐにわかります。
  4. あなたのテキストは、コンパイルされたプログラム内を詮索するだけの人にはまだ意味不明に見えるので、ミッションは達成されました.
于 2011-10-05T02:57:17.140 に答える
0

コンパイルされたコードの一部をデータとして使用してから、少し変更することもできます。これは、仮想マシンで実行されるプログラムでは困難ですが、asm や c などの言語では実行できます。

于 2011-09-29T08:24:26.493 に答える