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

因此,正如您在此处看到的,在每个框架路径之后是它从每个框架动态加载的符号字符串。这是为了避免在链接到私有框架时遇到麻烦。由于它是在运行时加载的,静态分析器无法判断此应用程序使用它,从而逃避检测。

看起来我最初的怀疑是正确的。它使用 IOSurface 偷偷越过沙盒限制以获取原始屏幕访问权限。它还使用UIGetScreenImage,我认为这是生成视频的第二种方法。它还使用了一些 IOKit 函数和 IOMobileFramebuffer 函数。看起来应用程序正在从IOMobileFramebufferGetLayerDefaultSurface函数中获取 IOSurface。不太确定它使用 IOKit 的目的是什么。

总之,这个应用程序使用了一些偷偷摸摸的技术来避免被静态分析器检测到:它不链接到私有框架,而是动态地抓取符号。它使用 IOSurface 和 IOMobileFramebuffer 的组合来录制视频,或者UIGetScreenImage用于其他模式。这是一个棘手的应用程序,将从AppStore中删除,所以如果你想要它,你最好现在就得到它。

更新:

看来这个应用程序确实是从 AppStore 中提取的。如果你有幸在它被拉出之前抢到了一份副本,那就太好了。我知道我很高兴我得到了它。

Apple 可能通过声明该应用程序使用私有 API 来证明其决定是合理的,并且它可能被视为潜在的安全问题(一个在您输入 iTunes 密码时监视您的应用程序就是一个例子,可怕的想法)。我想知道这是否会导致他们的审查过程发生变化,但我们可能永远不会知道。对我来说有趣的一件事是,开发人员可能会使用更多技巧来隐藏他们的应用程序的行为以防止静态分析。没有审查过程是完美的,但他们可以做得很好。即使 Apple 自动拒绝链接到该dlsym符号的应用程序,也有一些方法可以用来绕过检测。

更新 2:

显然,现在 AppStore 中有这个应用程序的另一个版本。它被称为“Disp Recorder”,具有与第一个完全相同的图标。GUI 看起来几乎与原来的相同,只是有一些细微的变化。我还没有扭转较新的,但我愿意打赌他们使用相同的技术来隐藏非法行为。反转新版本后,我将更新此答案。新的售价 5 美元,但如果您曾经想要在未越狱的设备上安装屏幕录制应用程序,您应该在它被拉出之前抓住它。

更新 3:

看起来我对这个应用程序的工作方式非常正确。@coolstarorg在 GitHub 上有一个名为RecordMyScreen的开源实现。如果你仍然想知道这个应用程序是如何工作的,我建议你去看看。

于 2012-06-19T17:00:30.793 回答
13

@C0deH4cker 对 IOSurface 框架的建议简直太疯狂了。IOSurface 提供了一个内核接口(允许应用程序悄悄地滑出沙箱),用于矩形像素缓冲区(屏幕抓取),可以使用框架相关的方法将其转换为 CGImage 或 UIImage。

甚至苹果公司也建议该框架存在的理由是:

包含用于在应用程序之间共享图形表面的低级接口。

最好的部分是,它在 iOS 中是不合法的。该框架在 iOS 2.x 中被称为 CoreSurface,在 3.x 中被迅速而悄悄地弃用,只是被 iOSurface 取代。我猜它是私有的并且未在 iOS 参考中列出的事实意味着应用商店测试人员没有对其进行测试。有趣的。

于 2012-06-18T20:36:50.700 回答