web-dev-qa-db-ja.com

AppleプライベートAPIを使用していることをどのように認識していますか?

ソースコードなしでバイナリファイルをAppleに送信しました。

手動でソースコードをチェックすることとは別に、どのようにAppleが何が使用され、どのAPIが呼び出されたかを知っていますか?

109
Tattat

私が知っている3つの方法があります。 Appleレビューチームでは働いていないので、これらは単なる推測に過ぎません。

1. otool -L

これにより、アプリがリンクしているすべてのライブラリがリストされます。 IOKitやWebKitなど、使用すべきではないものは明らかにこれで検出できます。

2. nm -u

これにより、リンクされているすべてのシンボルがリストされます。これは検出できます

  • _UIImageWithNameなどの文書化されていないC関数。
  • UIProgressHUDなどのObjective-Cクラス
  • UITouch._phaseなどのIvars( Three20ベースのアプリの拒否 過去数か月の原因である可能性があります。)

3. Objective-Cセレクターのリスト、またはstrings

Objective-Cセレクターはバイナリの特別な領域に格納されるため、Appleはそこからコンテンツを抽出し、-[UIDevice setOrientation:]などのドキュメント化されていないObjective-Cメソッドを使用したかどうかを確認できます。

セレクターは、メッセージングしているクラスから独立しているため、カスタムクラスがUIDeviceに関係のない-setOrientation:を定義している場合でも、拒否される可能性があります。


Erica SadunのAPIKit を使用して、プライベートAPI(の誤報)による潜在的な拒否を検出できます。


(これらのチェックを本当に本当に回避したい場合は、次のようなランタイム機能を使用できます。

  • dlopen、dlsym
  • objc_getClass、sel_registerName、objc_msgSend
  • -valueForKey:; object_getInstanceVariable、object_getIvarなど.

これらのプライベートライブラリ、クラス、メソッド、およびivarを取得します。 )

169
kennytm

ターミナルで次の1ライナーを使用して、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/,$_))))))'
26
Robert Diamond

プライベートAPIを使いたいとしましょう。 Objective Cでは、文字列からSELを構築できます。

   SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
    [UIDevice performSelector:my_sel ...];

ロボットまたはライブラリスキャンでこれをどのように検出できますか?実行時にプライベートアクセスを監視するツールを使用して、これをキャッチする必要があります。このようなランタイムツールを構築したとしても、この呼び出しはまれにしか実行されないパスに隠されている可能性があるため、キャッチするのは困難です。

12
Chris McLuvin

バイナリがインポートしようとしているすべてのシンボル(シンボルテーブルで情報を簡単に入手できます)を見て、それらのシンボルのいずれかが「プライベートAPIリスト」で見つかった場合は丁寧に調べます。実際、自動化は非常に簡単です。

7
Alex Martelli

実行可能ファイルは、厳密にはブラックボックスではありません。ライブラリを呼び出すと、簡単に見つけることができます。これが、現代のCS教育におけるアセンブリ言語の喪失を嘆く理由です。 =] lddのようなツールは、あなたがリンクしたものを教えてくれますが、lddの化身がMac iPhone開発キットにどのような影響を与えたかは覚えていません。

1

シンボル調査は別として...

Appleは、呼び出されたときに各プライベートメソッドスタックをチェックして、指定されたメソッドの1つから入力されたことを確認するバージョンのSDKを非常に簡単に作成できます。

1
Grady Player
otool -L somebinary
1
dvenema

静的にリンクしている場合でも、最悪の場合、リストのプライベートAPIからコードのサンプルを取得し、それらに対してバイナリを検索できます(自動化も比較的簡単です)。

Appleを知っていれば、包括的で自動化されたシステムを持っているに違いないと思います。

結局のところ、Appleをだまそうとするのは努力する価値はないと思います。

0
wash

コードを検査できるリバースエンジニアリング用のツールがたくさんあります

  • nm-オブジェクトファイルのシンボルを一覧表示します
  • objdump-オブジェクトファイルからの情報を表示します。
  • otool-Mach-Oのコンテンツを表示 [約] 実行可能ファイル
  • strings-これにより、すべての文字列が取得されます。

Objective-C および Swift の要旨でこれらのコマンドを使用する例/表現を見つけることができます

0
yoAlex5

このデスクトップアプリケーション App Scanner は、Mach-Oバイナリファイルを分解することにより、プライベートAPIの使用について.appファイルをスキャンできます。可能であれば、Appleもできます!

0
Andrew