IOMobileFramebufferGetLayerDefaultSurface无法在iOS 9上运行

Pyr*_*ogy 6 iphone objective-c ios

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

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

从应用程序的第一个版本开始就使用了这些功能,并且它们已经在iOS 7和8的所有版本上运行.但是,在最新的iOS 9测试版(测试版5)中,该功能IOMobileFramebufferGetLayerDefaultSurface不起作用.该函数不会返回0,因为它在成功打开帧缓冲区时应该返回0.

StackOverflow上的其他用户似乎也遇到了同样的问题:iOS 9上的IOMobileFramebufferGetLayerDefaultSurface函数失败.我们引用名为"_framebufferConnection"的IOMobileFramebufferConnection和名为"_screenSurface"的IOSurfaceRef这是当前代码:

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

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

小智 11

为了回答"如何在iOS 9上实际修改它的方式"的问题,我IOMobileFramebufferGetLayerDefaultSurface在iOS8和iOS9(GM)上进行了一些挖掘.以下是我发现的结果:

建立:

IOMobileFramebufferRef fb; IOMobileFramebufferGetMainDisplay(&fb);

iOS8实施:

  • 打电话给 kern_GetLayerDefaultSurface

  • 哪个访问底层IOConnection

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

  • 通过检索IOSurfaceID

    IOSurfaceID surfaceID; uint32_t outCount = 1; IOConnectCallScalarMethod(fbConnect, 3, {0, 0}, 2, &surfaceID, &outCount)

  • 返回 IOSurfaceLookup(surfaceID)

iOS9实施:

  • 除了返回之外,与上述步骤相同

  • 然后尝试检索一个马赫端口以通过访问表面

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

  • 成功后,回归 IOSurfaceLookupFromMachPort(surfacePort)

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

有趣的是,调用IOConnectCallScalarMethod仍然可以检索IOMFB表面的ID.但是,无法再使用它进行访问IOSurfaceLookup由于曲面不再是全局的.它有点令人惊讶,它首先是全球性的!

希望这有助于揭开为什么IOMFB不能再用于记录屏幕的原因.

资料来源:我自己使用LLDB,运行iOS 8.4的iPhone6和运行iOS9 GM的iPhone6 +


ant*_*999 5

我相信@nevyn是正确的.但是,我想详细说明一下.我已经广泛地研究了这个问题,而且IOMobileFramebufferGetLayerDefaultSurface功能确实如此返回-536870201,如果它运行函数没有任何问题它应该返回0.此错误在Internet上,但仅在用户遇到QuickTime的常规问题时才会出现.可能是Apple确实完全锁定了框架,并且需要Apple才能访问帧缓冲区.我们无法添加这些权利,因为它也必须位于配置文件中.我目前正在尝试阅读和解释反汇编并对IOMobileFramebuffer二进制文件进行一些逆向工程工作,以查看自上一个iOS版本以来是否有任何参数发生了变化.如果我发现任何事情,我一定会更新这个答案.但如果是这种情况,我建议尝试寻找另一种尝试捕获/记录屏幕内容的方法.

-UPDATE-

似乎有证据表明情况就是如此,如果你读到这个,它会显示完全相同的错误代码,这意味着该函数"不受支持",并返回一个IOKit错误.至少我们知道这意味着什么.但是,我仍然不确定如何解决它,或使功能工作.我会继续研究这个问题.

更新2

我实际上在iOS 9中发现了一个全新的类,"FigScreenCaptureController",它是MediaToolbox框架的一部分!但奇怪的是,Apple为什么只在iOS 9中包含这个?所以,也许会有一个方法来记录通过显示这个 ......我会更深入很快寻找到这一类.