18

重複の可能性:
難読化されたコードで文字列を非表示にする

逆コンパイルを困難にするために、アプリの静的な文字列を少し非表示にしようとしています。これは、暗号化アルゴリズム名などの定数が難読化されたコードで見つけにくいためです。

私は次のようなことを検討しました:

String CONCAT= "concat"+"string";
String RAW_STRING= "raw_string";
String FROM_BYTES=new String("from_bytes".getBytes());
String FROM_CHARS=new String(new char[]{'f','r','o','m','_','c','h','a','r','s'});
String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});

そして、最後の2つのオプションは、生のオプションよりも「暗い」ように見えますが、これを行うにはもっと良い方法があると思います。

どうすればこれを改善できますか?ありがとう

4

2 に答える 2

10

一つには、あなたはただ書くべきではありません

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});

char配列が実際には文字列であるというのは死んだプレゼントです。

次の組み合わせを行うことができます。

  1. 「文字列」をint[]配列に入れます
  2. またはさらに良いことに、文字列をいくつかのint配列に分割します
  3. アプリケーションのさまざまな段階で配列の値を計算/操作するため、その値は実行時の特定の間隔でのみ有効になり、コードを逆コンパイルすることで一目で解読されないことが保証されます
  4. 配列をローカル変数を介してインスタンス変数に戻すなどして、配列を前後に渡し、最後に配列を単一の配列に変換して文字列コンストラクターに渡します。
  5. 実行時に実際の文字列が存在する時間を短縮するために、使用後すぐに文字列をnullに設定します
于 2012-10-27T16:06:08.310 に答える
2

復号化アルゴリズムを使用して静的(クラス)初期化子に値を設定したい

class ...
  String CONCAT;

  static {
     CONCAT = uncrypt ("ahgsdhagcf");
  } 

uncryptは、実際には優れた暗号化解除アルゴリズムであるか、base64デコードよりもやや弱い可能性があります。

いずれにせよ、最初に文字列をエンコードするための簡単なプログラムが必要です。

于 2012-10-27T16:08:03.170 に答える