5

機密データをサーバーに送信する iOS アプリを構築しており、追加の手段として API 要求に署名しています。リバース エンジニアリングを可能な限り困難にしたいと考えており、Cycript を使用して実世界のアプリの署名キーを見つけたので、プロセスにアタッチしてこれらのキーを見つけるのは難しくないことを知っています。誰かが本当に熟練して十分に努力すれば、最終的に悪用されることを私は完全に認識していますが、私は自分自身とユーザーにとって便利でありながら、できるだけ難しくしようとしています.

ジェイルブレイク状態をチェックして追加の対策を講じることも、SSL ピンニングを行うこともできますが、プロセスにアタッチしてメモリを変更することで、どちらも簡単にバイパスできます。

App Store から拒否されずに、何か(Cycript、gdb、またはプロセスのクラッキングに使用できる同様のツール) がプロセスに接続されているかどうかを検出する方法はありますか?

編集:これはDetecting if iOS app is run in debuggerの複製ではありません。その質問は出力に関連しており、出力ストリームをチェックしてロガーにアタッチされた出力ストリームがあるかどうかを識別しますが、私の質問はそれに関連していません(そのチェックは私の状態をカバーしていません)。

4

3 に答える 3

6

リンクされたstackoverflowの質問を介してgdb検出を実行できます.kstatを使用して、プロセスがデバッグされているかどうかを判断します。これにより、デバッガーが現在プロセスに接続されているかどうかが検出されます。

コードの一部もあります- iOS アプリでマクロ SEC_IS_BEING_DEBUGGED_RETURN_NIL を使用する-これにより、コード内のさまざまな場所でデバッガー添付チェックを実行するマクロをスローできます (それは C/Objective-C です)。

Cycript の検出に関しては、プロセスに対して実行されると、プロセスに dylib を挿入して、cycript コマンド ラインとプロセス間の通信を処理します。ライブラリの名前の一部はcynject. その名前は、典型的な iOS アプリにあるどのライブラリとも似ていません。Cこれは ( )のような小さなループで検出できるはずです。

BOOL hasCynject() {
    int max = _dyld_image_count();
    for (int i = 0; i < max; i++) {
        const char *name = _dyld_get_image_name(i);
        if (name != NULL) {
            if (strstr(name, "cynject") == 0) return YES;
        }
    }
}

繰り返しますが、テストする文字列を難読化するだけでなく、これよりも適切な名前を付けることをお勧めします。

これらは実行できる唯一のアプローチです。残念ながら、これらは実行時に何らかの方法で保護するだけであり、誰かが IDA または他の逆アセンブラを指定することを選択した場合、保護されません。

デバッガーのチェックがマクロとして実装されている理由は、コード内のさまざまな場所にコードを配置することになり、その結果、それを修正しようとしている人がさまざまな場所でアプリにパッチを適用する必要があるためです。

于 2015-12-07T15:07:10.040 に答える
2

私の知る限り、Cycript プロセス インジェクションはデバッグ シンボルによって可能になります。したがって、App Store リリース (リリース構成のデフォルトのビルド設定) のデバッグ シンボルを取り除くと、それが役立ちます。

アプリの使いやすさに影響を与えない別のアクションは、難読化ツールを使用することです。ただし、クラッシュ レポートがシンボル化されていたとしても、シンボルを理解できないため、クラッシュ レポートが役に立たなくなります。

于 2016-04-09T20:46:49.610 に答える