ios - IOMobileFramebufferGetLayerDefaultSurface 不适用于 iOS 9

标签 ios objective-c iphone

我的主要问题是,如何对已经存在但已在新版本的 iOS 中进行修改的私有(private) API 函数进行逆向工程?

我创建了一个 iOS 应用程序来使用 IOSurface 和 IOMobileFramebuffer 记录屏幕内容。 framebuffer 用来打开它的主要函数是 IOMobileFramebufferGetMainDisplay(connect)IOMobileFramebufferGetLayerDefaultSurface

这些函数从应用程序的第一个版本开始就被使用,并且它们适用于所有版本的 iOS 7 和 8。但是,在最新的 iOS 9 beta,即 beta 5 中,函数 IOMobileFramebufferGetLayerDefaultSurface 不起作用。该函数不会返回 0,因为它在成功打开帧缓冲区时应该返回。

StackOverflow 上的其他用户似乎也遇到了同样的问题:IOMobileFramebufferGetLayerDefaultSurface function failed on iOS 9 .我们有一个名为“_framebufferConnection”的 IOMobileFramebufferConnection 引用和一个名为“_screenSurface”的 IOSurfaceRef 这是当前代码:

IOMobileFramebufferGetMainDisplay(&_framebufferConnection); IOMobileFramebufferGetLayerDefaultSurface(_framebufferConnection, 0, &_screenSurface;

如前所述,这些功能在 iOS 7-8 上完美运行,但在 iOS 9 上,第二个功能崩溃了。我还查看了带有两个版本符号的二进制文件并进行了比较。与 iOS 8.4.1 二进制文件相比,LDR 的第二个参数在 iOS 9 中略有不同。那么,回到主要问题,我如何对 IOMobileFramebufferGetLayerDefaultSurface 进行逆向工程,或者查看它在 iOS 9 上实际以何种方式被修改?

最佳答案

为了回答“它在 iOS 9 上实际上是如何修改的”这个问题,我深入研究了 iOS8 和 iOS9 (GM) 上的 IOMobileFramebufferGetLayerDefaultSurface。以下是我发现的结果:

设置:

IOMobileFramebufferRef fb; IOMobileFramebufferGetMainDisplay(&fb);

iOS8 实现:

  • 调用 kern_GetLayerDefaultSurface

  • 访问底层IOConnection

    io_connect_t fbConnect = *(io_connect_t *)((char *)fb + 20)

  • 通过

    获取IOSurfaceID

    IOSurfaceID 表面ID; uint32_t 输出计数 = 1; IOConnectCallScalarMethod(fbConnect, 3, {0, 0}, 2, &surfaceID, &outCount)

  • 返回 IOSurfaceLookup(surfaceID)

iOS9 实现:

  • 除返回外其他步骤与上述相同

  • 然后尝试检索一个 mach 端口以通过

    访问表面

    io_service_t fbService = *(io_service_t *)((char *)fb + 16) mach_port_t 表面端口; IOServiceOpen(fbService, mach_task_self(), 3, &surfacePort)

  • 成功后返回IOSurfaceLookupFromMachPort(surfacePort)

IOServiceOpen 在最后一步返回错误 0x2c7(不支持的函数)。请注意,在打开帧缓冲服务时,指定连接类型的第三个参数是 3 而不是通常的 0。几乎可以肯定,这种新的连接类型具有权限限制,可以防止除 Apple 之外的任何人检索 mach 端口以访问 IOMFB 表面。

有点有趣的是,对 IOConnectCallScalarMethod 的调用仍然可以检索 IOMFB 表面的 ID。但是,不能再使用 IOSurfaceLookup 访问它,因为表面不再是全局的。它首先是全局性的,这有点令人惊讶!

希望这有助于揭开为什么 IOMFB 不能再用于录制屏幕的神秘面纱。

来源:我自己在运行 iOS 8.4 的 iPhone6 和运行 iOS9 GM 的 iPhone6+ 上使用 LLDB

关于ios - IOMobileFramebufferGetLayerDefaultSurface 不适用于 iOS 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32239969/

相关文章:

ios - 如何在 iOS 上下载 LIVE HLS m3u8 流

iphone - iOS 在 UITableViewCell 中创建类似 iBook 的界面

ios - iOS 6和7中的UISearchbar自定义

iphone - UIPickerView 选择行 :inComponent:animated With smooth animation

iphone - XMPP 框架接收的最大消息数

ios - 将本地核心数据移动到 iCloud

ios - 简单测试应用程序中的 JMImageCache 因 EXC_BAD_ACCESS 而崩溃

iphone - 判断 NSString 的第一个字符是否为数字

ios - 不知道 NSString 类别中的类方法

iphone - 如何让 UINavigationController 在推送 UIViewController 时使用翻转动画