调查了一下,它没有链接到 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的开源实现。如果你仍然想知道这个应用程序是如何工作的,我建议你去看看。