0

私はアプリを書いていますが、セキュリティ上の理由から、静的メソッドから返される値を難読化したいと思います。から静的メソッドを呼び出した結果は次のようにClassAなりますBOOLが、攻撃者がリターンの実際の値を取得するのをできるだけ難しくしたいと思います(つまり、リターンしたくないBOOL、ジャンクを返したい)それはランダムに見えますが、どういうわけか意味があります)。

// in ClassA
returnValue = [ClassB staticMethod];
BOOL actaulReturnValue = // some magic to de-obfuscate returnValue

例:1024ビットのほとんどランダムなジャンクを返しますが、どこかに1つの意味のある数字があります(おそらく毎回異なるビット)。

別の例:10程度の一見ランダムな数字を返しますが、それらの10桁が円周率の最初の1000桁に現れる場合、実際の値はTRUE(10,000,000,000分の1の偽陽性率があるという事実を受け入れる)です。

これらは私が考えることができる2つの例ですが、これを行う他の(おそらくより良い)方法を考えるのを助けるためにstackoverflowコミュニティに任せています。コードも提供できる場合はボーナスポイント。

編集:リバースエンジニアリングが難しいほど良い。cycriptを実行して、ゲームオーバーの秘密を判断できれば。
編集2:攻撃者が私が戻り値を難読化する方法を知っていても、実際の値を理解するのは(不可能ではないにしても)難しいはずです(これは私の2番目の例でも問題です)

編集3:私は生活のためにiOSアプリの侵入テストを実行します。私はクライアントのために毎日それをしているので、私は記憶の中の何でも読むことができることを理解しています。また、難読化とセキュリティが同じであることを暗示しようとはしていません。そうは言っても、攻撃者が単一のAPI呼び出しにパッチを適用して常にFALSEを返すのを防ぐ方法を見つけようとしています。

ありがとう!

4

2 に答える 2

5

正直に言うと、気にしないでください。理由は次のとおりです。

ある時点で、暗号化されていない値をメモリにロードする必要があります

戻り値を難読化するメソッドを作成したとします。実際にその値を使用する必要がある場合はどうなりますか? 難読化を解除し、メモリに存在する変数にロードします。そして、攻撃者はそのメモリの場所を調べるだけで済みます。これは、ジェイルブレイクされたデバイスといくつかの追加ツールを使用すると簡単です。

この問題を乗り越えることはできません。あなたがやろうとしていることをすることは絶対に意味がありません。あなたは基本的に失敗する運命にあります。アプリをより安全にすることに興味がある場合は、O'Reilly から出版された素晴らしい本があり、とても役に立ちます。

于 2012-10-12T20:59:42.227 に答える
0

結果に対していくつかのトリッキーなビット単位の操作を実行して、ビット インデックスを取得し、そのインデックスのビットをチェックして、たとえば、設定されているかどうかを確認できます。

次の例では:

  • 32 ビットの不可解な結果が与えられると、不可解な結果の 2 番目と 4 番目のバイトの XOR を計算し、上位 4 ビットと下位 4 ビットの XOR を再び計算します。indexこれにより、0 ~ 15として解釈できる 4 ビットの結果が得られます。
  • 次に、このインデックスを使用して、残りの 2 バイトのどのビットをチェックする必要があるかを判断します。3 番目のバイトと 1 番目のバイトを連結して 16 ビット ワードにし、indexそのワードの - 番目のビットをチェックして、ビットが正しいかどうかを確認します。設定されているかどうか。

私がテストしたデコード関数は次のとおりです。

-(BOOL)decodeCrypticResult:(long)crypticResult
{
  u_int8_t* bytes = (u_int8_t*)&crypticResult;

  u_int8_t xor = bytes[1] ^ bytes[3];
  u_int8_t idx = ((xor>>4)&0xF) ^ (xor&0xF); // value in range [0..15]
  u_int16_t word = ((bytes[2]<<8) & 0xFF00) | bytes[0]; // bytes 2 and 0 concatenated into a 16-bit word
  BOOL res = (word >> idx) & 1; // check the idx-th bit of this word
  return res;
}

不可解な結果を生成して、不可解なYESものまたはライブラリNOから返すstaticMethodのは非常に簡単です。

  • 32 ビットの乱数を生成する
  • この乱数の表現から上記のようにビット インデックスを計算します。
  • 乱数を返す前に、乱数の1番目または3番目のバイトの対応するビットを設定または設定解除します(BOOL返す必要がある場合に応じて)

したがって、これにより次のコードが得られます。

-(long)returnCrypticBoolValue:(BOOL)boolValue
{
  u_int32_t crypticResult = arc4random();
  u_int8_t* bytes = (u_int8_t*)&crypticResult;

  u_int8_t xor = bytes[1] ^ bytes[3];
  u_int8_t idx = ((xor>>4)&0xF) ^ (xor&0xF); // value in range [0..15]
  if (boolValue) {
    // set the idx-th bit of byte 2 or 0
    bytes[ (idx&8)?2:0 ] |=  (1 << (idx&7));
  } else {
    // unset the idx-th bit of byte 2 or 0
    bytes[ (idx&8)?2:0 ] &= ~(1 << (idx&7));
  }
  return crypticResult;
}
于 2012-10-12T20:53:20.110 に答える