回答:
私が知っている3つの方法があります。私はAppleレビューチームで働いていないので、これらは単なる憶測にすぎません。
otool -L
これにより、アプリがリンクしているすべてのライブラリがリストされます。IOKitやWebKitのように、使用してはいけないものは明らかにこれで検出できます。
nm -u
これにより、リンクされたすべてのシンボルがリストされます。これは検出できます
UITouch._phase
(これにより、Three20ベースのアプリが数か月間拒否される原因となる可能性があります。)strings
Objective-Cセレクターはバイナリーの特別な領域に格納されるため、Appleはそこからコンテンツを抽出し、文書化されていないObjective-Cメソッド(など)を使用していないかどうかを確認できます-[UIDevice setOrientation:]
。
セレクターはメッセージングしているクラスから独立しているため、カスタムクラス-setOrientation:
がUIDeviceに関係のないものを定義していても、拒否される可能性があります。
Erica SadunのAPIKitを使用して、プライベートAPI(の誤ったアラーム)による拒否の可能性を検出できます。
(本当に本当に本当にこれらのチェックを回避したい場合は、次のようなランタイム機能を使用できます:
-valueForKey:
; object_getInstanceVariable、object_getIvarなどこれらのプライベートライブラリ、クラス、メソッド、およびivarを取得します。)
ターミナルで次のワンライナーを使用して、Mach-Oプログラムのセレクターをリストできます。
otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n '3,$p' | perl -n -e 'print join("\n",split(/\x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(/\s/,$_))))))'
いくつかのプライベートAPIを使用するとします。目的Cでは、文字列から任意のSELを作成できます。
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
ロボットまたはライブラリのスキャンでこれをどのようにキャッチできますか?実行時にプライベートアクセスを監視するツールを使用してこれをキャッチする必要があります。このようなランタイムツールを構築したとしても、この呼び出しはほとんど実行されないパスに隠されている可能性があるため、把握するのは困難です。
あなたのバイナリがインポートしようとしているすべてのシンボル(それらのシンボルテーブルで間違いなく簡単に利用できる情報)を見て、それらのシンボルのいずれかが「プライベートAPIリスト」にあるかどうかを確認すると思います。実際、自動化はかなり簡単です。
実行可能ファイルはブラックボックスではありません。ライブラリを呼び出すと、簡単に見つけることができます。これが、現代のCS教育におけるアセンブリ言語の喪失を嘆く理由です。=] lddのようなツールは、あなたがリンクしたものを教えてくれますが、私はlddの化身がMac iPhone開発キットにそれを作ったのを覚えていません。
シンボル調査は別として...
appleは、呼び出されたときに各プライベートメソッドスタックをチェックして、指定されたメソッドの1つから入力されていることを確認するSDKのバージョンを非常に簡単に持つことができます。
静的にリンクしている場合でも、最悪の場合、リストにあるプライベートAPIからコードのサンプルを取得し、それらに対してバイナリを検索できます(自動化も比較的簡単です)。
Appleを知っているので、彼らには包括的で自動化されたシステムがあり、不確実性はおそらく否定されるか、手動で確認されるでしょう。
結局のところ、Appleをだまして試してみる価値はないだろう。
このデスクトップアプリケーションであるApp Scannerは、Mach-Oバイナリファイルを分離することにより、.appファイルをスキャンしてプライベートAPIを使用できます。可能であれば、Appleもできます!
コードを検査できるリバースエンジニアリング用のツールがたくさんあります
nm
-オブジェクトファイルからのシンボルをリストします objdump
-オブジェクトファイルの情報を表示します。otool
-Mach-O [About]実行可能ファイルのコンテンツを表示するstrings
-これですべての文字列が取得されます。これらのコマンドの使用例/表現は、Objective-CおよびSwiftの要点にあります。