iOS应用程序显示logging器如何在不使用私有API的情况下logging屏幕?

iOS应用程序显示logging器声称能够loggingiOS设备的屏幕,即使它在后台。 鉴于UIGetScreenImage()是私有的API,当苹果运行静态分析检测到应用程序提交时会导致拒绝应用程序提交,他们如何能够在批准的应用程序中执行此logging?

此外,应用程序会在屏幕的顶部显示一条红色条,类似于本机iOS的电话function。

我一直是一个iOS开发人员,而且我甚至有点难以理解甚至是在应用程序之外把红色条放在最顶层的细节。 我的印象是,我们基本无法控制应用程序在后台运行时发生的情况,缺less某些关键function(如audio播放等)。

即使开发人员利用私人API /库来实现这一目标,他们又如何能够以在审查期间未检测到的方式来做到这一点? 我很抱歉,如果我错过了一些明显的东西,这是iOS的更新版本引入的。

看着它,它不反对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 

所以,正如你在这里看到的那样,在每个框架path之后都是从每个框架dynamic加载的符号的string。 这是为了避免陷入与私人框架链接的麻烦。 由于它是在运行时加载的,所以静态分析器不能告诉这个应用程序使用它,从而逃避检测。

这看起来像我最初的怀疑是正确的; 它正在使用IOSurface潜入过去的沙箱限制有原始的屏幕访问。 它也使用UIGetScreenImage ,我认为这是第二种生成video的方法。 它也使用一些IOKit函数和IOMobileFramebuffer函数。 它看起来像应用程序从IOMobileFramebufferGetLayerDefaultSurface函数抓取IOMobileFramebufferGetLayerDefaultSurface 。 不太清楚它使用IOKit。

总之,这个应用程序使用一些偷偷摸摸的技术来避免静态分析器的检测:它不会链接到私有框架,而是dynamic地抓取符号。 它使用IOSurface和IOMobileFramebuffer的组合来loggingvideo,或UIGetScreenImage的另一种模式。 这是一个棘手的应用程序, 被从AppStore拉,所以如果你想要它,你最好现在就明白了。

更新:

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

苹果公司可能通过声明应用程序使用私有API来certificate自己的决定是合理的,并且可能将其视为潜在的安全问题(当您inputiTunes密码时,应用程序会监视您的一个例子,可怕的想法)。 我想知道这是否会导致他们的审查过程发生变化,但我们可能永远不会知道。 有一点对我来说很有意思,那就是开发者可能会用更多的技巧来将他们的应用程序的行为从静态分析中隐藏起来。 没有审查过程是完美的,但他们可以做得很好。 即使苹果自动拒绝与dlsym符号链接的应用程序,也有可用于绕过检测的方法。

更新2:

显然,AppStore中现在还有另一个版本的应用程序。 它被称为“Disp Recorder”,并具有与第一个相同的确切图标。 graphics用户界面看起来几乎与原来的几个相同的一些小的变化。 我还没有扭转新的,但我敢打赌,他们使用相同的技术来掩盖违法行为。 我将更新这个答案,一旦我扭转新版本。 新的价格为5美元,但如果你曾经想要一个未破的设备上的屏幕录制应用程序,你应该抓住它,然后拉它。

更新3:

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

@ C0deH4cker的IOSurface框架的build议是足够疯狂的工作。 IOSurface提供了一个内核接口(允许一个应用程序安静地从其沙箱中滑出),一个矩形像素缓冲区(屏幕截图),可以使用框架相关的方法将其转换为CGImage或UIImage。

甚至苹果认为,框架存在的理由是:

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

最好的部分是,这在iOS中不合法。 这个框架曾经在iOS 2.x中被称为CoreSurface,它在3.x中被迅速而平静地弃用,只能被iOSurface替代。 我猜测它是在iOS引用中是私有的和未公开的,这意味着app storetesting人员没有对它进行testing。 有趣。

  • 档案没有显示在pipe理器中的XCode 4
  • Objective-C方法中的静态variables
  • 如何转储存储在objective-c对象(NSArray或NSDictionary)中的数据
  • 我怎样才能点击透明UIView背后的button?
  • 如何确定当前的iPhone /设备型号?
  • iPhone UITableView。 如何打开音乐应用程序的单个字母按字母顺序列表?
  • Xcode 6.0.1命令/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc失败,退出代码1
  • 在Swift中获取设备方向
  • 如何在iOS上获得音量级别和音量更改通知?
  • 我如何计算两个date之间的差异?
  • UITableView reloadData自动调用resignFirstResponder