質問

iPhone 開発者コミュニティの間では、Apple が最近、文書化されていない API 呼び出しの使用を検出するために静的コード分析ツールの使用を開始したということでコンセンサスが得られています。

議論のために、次のように実行時に呼び出しを生成することでこのツールを回避できるかどうか疑問に思います。

NSString *const aMethod = @"doStuff:withStuff:";
SEL aSelector = NSSelectorFromString(aMethod);
NSMethodSignature *aSignature = [targetObject methodSignatureForSelector:aSelector];
NSInvokation *anInvokation = [NSInvokation invocationWithMethodSignature:aSignature];
[anInvokation setTarget:targetObject];
[anInvokation setSelector:aSelector];
[anInvokation setArgument:&firstArg atIndex:2];
[anInvokation setArgument:&secondArg atIndex:3];
[anInvokation invoke];

これでは簡単すぎるように思えますが、何が足りないのでしょう?Apple は、アセンブリの静的コード分析を使用して、どのようにしてこれを検出できるのでしょうか?

いくつかのポイント:

  1. メソッド名は静的文字列としてバイナリに保存されることを知っています。ただし、stringwithformatを使用して、実行時にメソッド名を生成するのは簡単です。または他のタイプのわずかな難読化(静的アナライザーを混乱させるのに十分)。
  2. このトリックは、gdb を使用した最も簡単な実行時分析によっても明らかになることはわかっています。私の理解では、Apple はバイナリ自体を分析していると考えられていましたが、おそらくそれについては完全に間違っています。
役に立ちましたか?

解決

なぜ気にするの?正当な理由でプライベートAPIを使用することは想定されていません。Appleはいつでも簡単にアプリケーションを破壊し、ユーザーを混乱させる可能性があります。

とはいえ、NSInvocation、-performSelector :、または他の同様の手法を使用すれば、おそらく静的アナライザーによる検出を回避するのに十分でしょう。

他のヒント

読んだことがあるかと思いますが、 この記事. 。また興味深いのは、 これです. 。私の解釈では、一部の人がプライベート メソッドと同じ名前のメソッドを使用しているというだけの理由で、Apple の静的アナライザーが誤検知を生成しているのではないかということです。アナライザーが実行時分析を行うか、どのクラスのセレクターが呼び出されたかを徹底的にチェックしていれば、このようなことは起こらなかったでしょう。したがって、彼らは主にバイナリ内で一致する文字列またはセレクターを探しているようです。を使用すると思います NSInvocation 文字列の難読化と組み合わせると、問題を解決できます。ただし、プライベート API に依存しないことをお勧めします。

調べる簡単な方法があります!

質問のメソッドを介して意図的に非表示のAPIを使用するアプリを作成し、受け入れられるかどうかを確認してください!

サム

PS見つけた場合は、必ず教えてください。私たちは皆、確実に知りたいと思っていますが、Appleは確かに私たちに教えません!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top