web-dev-qa-db-ja.com

iPhone / iPadアプリコードの難読化-可能ですか?価値がある?

SOについても、Googleについてもいろいろ調べましたが、Objective-Cで書かれたiPhone/iPadアプリのコード難読化に関して、簡単な答えは見つかりませんでした。 。

私の質問は次のとおりです。

  1. それを行う方法はありますか?もしそうなら、どのように?
  2. その価値はありますか?
  3. アプリを送信したときにApple許可するか、問題が発生しますか?
66
bpatrick100

Objective-Cのコード難読化ツールはないようです。しかし、少しの間、それが存在すると仮定しましょう。

Appleは、クラッシュしない限り、難読化されたアプリを拒否しないでしょう。主な質問は、難読化のポイントは何ですか?通常、知識を保護するためにコードを難読化する必要があります。たとえば、プログラムが潜在的なクラッカーのために難しくしたいコピー保護を使用している場合、またはビジネスの競合他社になりたくない高度なアルゴリズムを使用している場合逆コンパイルすることができます。

コピー防止機能はiOSですでに処理されています。ジェイルブレイクを通じて通常のアプリをコピーして実行できますが、実際にこれを行うユーザーの数はかなり少ないと思います(少なくともPCやMacなどの「通常の」コンピューターよりもはるかに少ない)。著作権侵害はあなたが難読化する必要があるような大きな問題を期待していますか?

保護する重要な知識がある場合、難読化は価​​値があるかもしれません。難読化には欠点があります。難読化されたアプリをデバッグできなくなります。クラッシュレポートは役に立ちません。

記事 Obfuscating Cocoa を読むこともできます。

事実に戻ると、難読化者ではないようです:あなたがcanするのはこのトリックです:このようなヘッダーがあるとしましょう:

@interface MyClass : NSObject {
}

- (void)myMethod;

次のような安価な難読化を行うことができます。

#ifndef DEBUG
#define MyClass aqwe
#define myMethod oikl
#endif

@interface MyClass : NSObject {
}

- (void)myMethod;

この方法では、ソースで意味のあるシンボルを使用できますが、デバッグ用にコンパイルしない場合、コンパイラはそれを「ガベージ」に変換します。

58
DarkDust
  1. はい、 EnsureIT for Apple iOS または Contaxiom Code Protection をご覧ください
  2. 場合によります。通常、セキュリティには複雑さが伴います。使いやすさのバランスを取る必要があります。
  3. Appleには問題はないはずです(間違っている場合は修正してください)。個人的には、コード難読化ツールを使用するアプリはほとんどありません。
33
Andy

以前の回答に加えて、次のようないくつかの難読化と整合性保護を提供するサードパーティツールがあります。

  1. Arxan、
  2. Metaforic、
  3. クリプタニウム

それらは機能が異なり、次のものが含まれます。

  1. 制御フローの難読化(例: ARM命令フローは、コードの本来の目的を隠そうとする冗長な命令でマングルされています。
  2. クラスとメソッドの名前変更-メソッドとクラスの名前を無意味な名前に変更しますが、Objective-Cランタイムは特定の名前を見つけることを期待しているため、アプリを簡単に壊す可能性があるため、これを使用する場所に注意する必要がありますが、
  3. 文字列の暗号化-アプリ内のすべての静的文字列は暗号化され、静的分析を難しくするために、使用する直前に文字列を解読するコードが挿入されます
  4. アンチデバッグ-通常のデバッガーを破壊するためのコードが挿入されます(常に成功するとは限りません)。
  5. 改ざん防止-通常、バイナリコードを変更から保護するチェックサムのネットワークを構築します。
  6. Objective-Cランタイム保護-通常、obj-cに登録されたメソッド実装をチェックして、それらがアプリ内にあり、「スウィズル」されていないことを確認します。

これらのツールはすべて非常に高価であり、問​​題がないわけではないため、それらを検討するには、高度な整合性が必要なアプリケーションが本当に必要です。銀行またはDRMが非常に重要な場所。

これらのタイプのアプリでは、熟練したペネトレーションテスターが必要です。これらのツールは他の方法で公開されていないことを確認するためです。対処しないでください。

13
Andrew

アプリの実行可能ファイルはすでにAppleによって暗号化されており、アプリサンドボックスの実行可能コードセグメントは書き込み可能でないため、ランタイムアームコードの変更を必要とする追加の暗号化を行うことはできません。また、Objective C/Cコンパイラのオプティマイザパスは、元のソースコードとはまったく異なるものをすでに作成しています。メソッド名はプレーンテキストに埋め込まれていますが、C関数名は埋め込まれていないため、Cをより多く使用し、Objective Cを使用すると、より少ない関数名が表示されます。そのため、営業秘密タイプのコードはおそらくプレーンCでコーディングし、オプティマイザーを最後までコンパイルしてコンパイルする必要があります。アプリバンドル内に埋め込まれたwebKit Javascript、または他の埋め込みVMコード(解釈されたコードがダウンロードされない限り))を難読化できます。

3
hotpaw2