我的主要问题是,如何对已经存在但已在新版本的 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)
通过
获取IOSurfaceIDIOSurfaceID 表面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/