svg*_*in3 40 iphone objective-c ios
iOS应用程序显示记录器声称能够记录iOS设备的屏幕,即使它在后台.鉴于这UIGetScreenImage()是私有API,并且当Apple运行的静态分析检测到时,将导致拒绝提交应用程序,他们如何能够在批准的应用程序中进行此录制?
此外,应用程序会在记录时在屏幕顶部显示一个红色条,类似于原生iOS的电话功能.
我有一段时间以来一直是iOS开发人员,我对这个甚至是如何完成感到有点困惑,甚至在应用程序之外将红色条放在顶部的细节.我的印象是,当应用程序在后台运行时,我们基本上无法控制正在发生的事情,缺少一些关键功能(如音频播放等).
即使开发人员使用私有API /库来完成此任务,他们如何能够以审核期间未检测到的方式执行此操作?如果我遗漏了iOS的更高版本中引入的明显内容,我表示歉意.
C0d*_*ker 59
看着它并没有链接到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
Run Code Online (Sandbox Code Playgroud)
因此,正如您在此处看到的,在每个框架路径之后是动态地从每个框架加载的符号的字符串.这是为了避免在链接私有框架时遇到麻烦.由于它是在运行时加载的,因此静态分析器无法判断此应用程序是否使用它,从而避免了检测.
看起来我最初的怀疑是正确的; 它正在使用IOSurface来隐藏沙盒限制以获得原始屏幕访问权限.它也使用UIGetScreenImage,我假设是第二种生成视频的方法.它还使用了一些IOKit函数和IOMobileFramebuffer函数.看起来该应用程序正在从该IOMobileFramebufferGetLayerDefaultSurface功能中获取IOSurface .不太确定它使用IOKit的是什么.
总而言之,这个应用程序使用一些偷偷摸摸的技术来避免静态分析器的检测:它不会链接到私有框架,而是动态地抓取符号.它使用IOSurface和IOMobileFramebuffer的组合来录制视频,或者UIGetScreenImage用于其他模式.这是一个棘手的应用程序,WILL得到从AppStore上拉,所以如果你想要的话,你最好现在得到它.
看来这个应用程序确实是从AppStore中提取的.如果你有幸在抓到之前拿到一份副本,那就太好了.我知道我很高兴得到它.
Apple可能通过声明该应用程序使用私有API并将其视为潜在的安全问题来证明其决定是合理的(当您键入iTunes密码时,一个看着您的应用程序就是一个例子,可怕的想法).我想知道这是否会导致他们的审核流程发生变化,但我们可能永远不会知道.有趣的是,开发人员可能会使用更多技巧来隐藏应用程序的静态分析行为.没有审查过程是完美的,但他们可以做得很好.即使Apple自动拒绝链接该dlsym符号的应用程序,也有一些方法可用于绕过检测.
显然,现在AppStore中还有另一个版本的应用程序.它被称为"Disp Recorder"并且具有与第一个完全相同的图标.GUI看起来与原始GUI几乎完全相同,只有一些细微的变化.我还没有推翻新的,但我愿意打赌他们使用相同的技术来隐藏非法行为.我将在撤消新版本后更新此答案.新的价格是5美元,但是如果你想在一个未经破坏的设备上使用屏幕录制应用程序,你应该在它被拉动之前抓住它.
看起来我对这个应用程序的工作方式非常正确.@coolstarorg在GitHub上有一个名为RecordMyScreen的开源实现.如果你仍然想知道这个应用程序是如何工作的,我建议你去看看吧.
Cod*_*aFi 13
@ C0deH4cker对IOSurface框架的建议非常疯狂到可行.IOSurface提供了一个内核接口(允许应用程序安静地从其沙箱中滑出),用于矩形像素缓冲区(屏幕抓取),可以使用框架相关方法将其转换为CGImage或UIImage.
甚至苹果也表示该框架的存在理由是:
包含用于在应用程序之间共享图形表面的低级接口.
最好的部分是,它在iOS中不合法.该框架过去在iOS 2.x中被称为CoreSurface,在3.x中被迅速而悄然弃用,仅被iOSurface取代.我猜它在iOS引用中是私有的和未列出的这一事实意味着应用商店测试人员没有测试它.有趣.
| 归档时间: |
|
| 查看次数: |
17776 次 |
| 最近记录: |