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


109

ソースコードなしでバイナリファイルをアップルに提出しました。

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


タイトルが変更されました-「Appleはどのように知っているのか」という意味だったと思います
Anurag

回答:


173

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

1。 otool -L

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

2。 nm -u

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

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

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

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


Erica SadunのAPIKitを使用して、プライベートAPI(の誤ったアラーム)による拒否の可能性を検出できます。


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

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

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


すばらしい答えです。アプリケーションがプライベートAPIを使用せずに実行することが非常に困難な何かを実行している場合、私はあなたのアプリが追加の精査を受けると確信しています。
マシューフレデリック

プライベートメソッドを呼び出す回避策に興味があります。コンパイラーは[foo privateMethod]のobjc_msgSend(foo、@selector(privateMethod))への呼び出しを生成するので、AppleがprivateMethodの直接呼び出しを検出できれば、objc_msgSend(or performSelector :)による間接呼び出しも検出できます。
an0

IOKitやWebKitにリンクしてはいけないのはなぜだと思いますか。
hjaltij

2
otoolを何で実行しますか?.appファイル?
Rob

1
@Eric、それらは可能でしたが、そのようなインストルメントされたバージョンはおそらくパフォーマンスに影響を与えます。いずれにせよ、プライベートAPIがApp Storeに繰り返しアクセスするのを見ると、これが実行されないこと、または少なくとも常に実行されないことが明らかです。
2013年

26

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

+ 1、@ Robert Diamond、同じことについて詳しく説明してください。GoogleアナリティクスがUDID呼び出しを使用しているかどうかを確認する必要があります。ありがとう
Mangesh

13

いくつかのプライベートAPIを使用するとします。目的Cでは、文字列から任意のSELを作成できます。

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

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


user1203764 、この種の通話は実際に検出できるとコメントしています
Rup

@Rupは、valueForKeyの使用に関する私の質問について意見を述べたいですか?stackoverflow.com/questions/11923597/...
ダンRosenstark

1
@年興味深い質問!しかし、申し訳ありませんがコメントする専門家では不十分です。Farcallerの発言は私には理にかなっているようです
Rup

@Rupに感謝します。明らかにこの分野の専門家で十分な人は誰もいません:)
Dan Rosenstark 2012

私が知っている誰かが、彼がこのような電話をApp Storeで受けたと言っています。
Bugloaf 14年

7

あなたのバイナリがインポートしようとしているすべてのシンボル(それらのシンボルテーブルで間違いなく簡単に利用できる情報)を見て、それらのシンボルのいずれかが「プライベートAPIリスト」にあるかどうかを確認すると思います。実際、自動化はかなり簡単です。


1
実際、私が知っているプラ​​イベートAPIの使用に基づいて、これが当てはまらない(少なくともそれがすべてではない)と私は確信を持って言えるでしょう。これだけで十分であれば、プライベートAPIの使用はうまくいきません。私の経験では、KennyTMの答えはほぼ間違いなく正しいと思われます。これは、Objective-Cのは、Cのように、他の言語は基本的に異なる領域である
ネイト

1

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


1
私は頻繁に疑問に思っていました:バイナリを記述して自己変更する場合、Appleがそれをキャッチするかどうか、いくつかの基準が満たされた後(たとえば、アプリの公開日後)にのみプライベートAPIをインポートするコードを生成します。彼らは確かにジェイルブレイクされた電話で実行されている私たちのゲームの数のようないくつかの興味深い統計を報告します。
Sniggerfardimungus、

@ user30997、特権コードにはシステムコールを介してのみアクセスできます。実行中のスレッドがより高い特権に切り替わり、前の特権にコードを実行する権限があるかどうかを確認します。それはしかしあくまで一例ですが、それをやって、他の方法がありますが、私は非常に開発者がこのようなメカニズムを確認する基本的なランタイム権限を除外するためにナイーブ十分だった、それは間違いなく今では公表されていることはないだろう。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

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

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


他のロジックに応じて、プログラムはこのプライベートコールを将来の任意の時間にしか呼び出せないので、それだけでは十分ではありません。これを精査するには、Appleが実際にプライベートAPIを完全にブロックするか、フレームワークにAppleへのプライベートAPI呼び出しを自動的に報告させる必要があります。これにより、パフォーマンスが大幅に低下します。
Motti Shneor 16

0

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

Appleを知っているので、彼らには包括的で自動化されたシステムがあり、不確実性はおそらく否定されるか、手動で確認されるでしょう。

結局のところ、Appleをだまして試してみる価値はないだろう。


4
不確実性に遭遇したときのAppleのレビュープロセスを知るには、最大の奇抜さのために一連のダイスを分割する必要があります。
私の正しい意見だけ正しい

0

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


0

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

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

これらのコマンドの使用例/表現は、Objective-CおよびSwiftの要点にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.