42

iOS アプリのDisplay Recorderは、iOS デバイスがバックグラウンドにある場合でも、その画面を記録できると主張しています。UIGetScreenImage()これがプライベート API であり、Apple が実行する静的分析によって検出された場合にアプリケーションの送信が拒否されることを考えると、承認されたアプリケーションでこの記録をどのように行うことができたのでしょうか?

さらに、このアプリは、ネイティブ iOS の通話機能と同様に、録音中に画面の上部に赤いバーを表示します。

私はしばらくの間 iOS 開発者でしたが、これがどのように行われたのか、アプリの外にあるときに赤いバーを上部に配置するという詳細に至るまで、少し困惑しています。私は基本的に、アプリがバックグラウンドで実行されているときに何が起こっているのかを制御できず、いくつかの重要な機能 (オーディオの再生など) を除いて、何も制御できないという印象を受けました。

開発者がこれを達成するためにプライベート API/ライブラリを利用したとしても、レビュー中に検出されなかった方法でこれを行うことができたのはなぜですか? 後のバージョンの iOS で導入された明らかな何かが欠けている場合は、お詫び申し上げます。

4

2 に答える 2

61

それを調べたところ、IOSurfaceとリンクしていません。しかし、それが を使用していることがdlsymわかりました。さらにリバース エンジニアリングを行った後、次のことがわかりました。

/System/Library/Frameworks/IOKit.framework/IOKit
IOServiceGetMatchingServices
IOServiceGetMatchingService
IOServiceMatching
IOMasterPort
IOIteratorNext
IORegistryEntryCreateCFProperty
IOObjectRelease
/System/Library/Frameworks/UIKit.framework/UIKit
UIGetScreenImage
/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer
IOMobileFramebufferOpen
IOMobileFramebufferGetLayerDefaultSurface
/System/Library/PrivateFrameworks/IOSurface.framework/IOSurface
IOSurfaceAcceleratorCreate
IOSurfaceAcceleratorTransferSurface
IOSurfaceLock
IOSurfaceUnlock
IOSurfaceGetWidth
IOSurfaceGetHeight
IOSurfaceCreate
IOSurfaceGetBaseAddress

したがって、ここでわかるように、各フレームワーク パスの後には、各フレームワークから動的にロードされるシンボルの文字列があります。これは、Private Framework へのリンクで問題が発生しないようにするためです。実行時に読み込まれるため、静的アナライザーはこのアプリがそれを使用していることを認識できず、検出を逃れます。

私の最初の疑いは正しかったようです。IOSurface を使用して、サンドボックスの制限をすり抜けて生の画面にアクセスしています。UIGetScreenImageまた、ビデオを生成する 2 番目の方法であると思われるも使用します。また、いくつかの IOKit 関数と IOMobileFramebuffer 関数も使用します。アプリが関数から IOSurface を取得しているIOMobileFramebufferGetLayerDefaultSurfaceようです。ただし、IOKitを何に使用するかはよくわかりません。

結論として、このアプリは、静的アナライザーによる検出を回避するためにいくつかの卑劣な手法を使用しています。プライベート フレームワークにリンクするのではなく、シンボルを動的に取得します。IOSurface と IOMobileFramebuffer の組み合わせを使用して、ビデオを記録するかUIGetScreenImage、他のモードを使用します。これはAppStoreから引き出されるトリッキーなアプリなので、必要な場合は今すぐ入手することをお勧めします。

アップデート:

このアプリは実際に AppStore からプルされたようです。引っ張られる前にコピーを手に入れることができたのは幸運だったとしたら、それは素晴らしいことです。私はそれを手に入れてよかったと知っています。

Apple はおそらく、アプリがプライベート API を使用しており、潜在的なセキュリティ上の問題と見なされる可能性があると述べて、その決定を正当化したと思われます (iTunes のパスワードを入力するのを監視するアプリは、その一例であり、恐ろしい考えです)。これがレビュープロセスの変更につながるかどうかは疑問ですが、おそらくわかりません. 私にとって興味深いことの 1 つは、開発者がアプリの動作を静的分析から隠すために使用できる可能性のあるトリックがまだたくさんあるということです。レビュープロセスは完璧ではありませんが、かなりうまく機能します。Apple がシンボルにリンクするアプリを自動的に拒否したとしてもdlsym、検出を回避するために使用できる方法があります。

更新 2:

現在、このアプリケーションの別のバージョンが AppStore にあるようです。それは「Disp Recorder」と呼ばれ、最初のものとまったく同じアイコンを持っています。GUI は、いくつかのマイナーな変更を除いて、オリジナルのものとほとんど同じに見えます。私はまだ新しいものを元に戻していませんが、違法行為を隠すために同じ手法を使用したことは間違いありません. 新しいバージョンを元に戻したら、この回答を更新します。新しいものは 5 ドルかかりますが、ジェイルブレイクされていないデバイスで画面記録アプリが必要になったことがある場合は、プルされる前に取得する必要があります。

更新 3:

このアプリケーションがどのように機能するかについて、私は非常に正しかったようです。@coolstarorgによるRecordMyScreenというオープンソースの実装が GitHub にあります。このアプリがどのように機能するのかまだ疑問に思っている場合は、試してみることをお勧めします。

于 2012-06-19T17:00:30.793 に答える
13

@C0deH4ckerのIOSurfaceフレームワークの提案は、機能するのに十分クレイジーです。IOSurface は、フレームワーク関連のメソッドを使用して CGImage または UIImage に変換できる、長方形のピクセル バッファー (スクリーン グラブ) 用のカーネル インターフェイス (アプリがサンドボックスから静かに脱出できるようにする) を提供します。

Apple でさえ、このフレームワークの存在理由は次のとおりであると示唆しています。

アプリケーション間でグラフィックス サーフェスを共有するための低レベル インターフェイスが含まれています。

最良の部分は、iOS では合法ではないことです。このフレームワークは iOS 2.x で CoreSurface と呼ばれていましたが、3.x で迅速かつ静かに廃止され、iOSurface に置き換えられました。私は、それが非公開であり、iOS リファレンスに記載されていないという事実は、アプリ ストアのテスターがそれをテストしなかったことを意味していると思います。面白い。

于 2012-06-18T20:36:50.700 に答える