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 +
我相信@nevyn是正确的.但是,我想详细说明一下.我已经广泛地研究了这个问题,而且IOMobileFramebufferGetLayerDefaultSurface功能确实如此返回-536870201,如果它运行函数没有任何问题它应该返回0.此错误在Internet上,但仅在用户遇到QuickTime的常规问题时才会出现.可能是Apple确实完全锁定了框架,并且需要Apple才能访问帧缓冲区.我们无法添加这些权利,因为它也必须位于配置文件中.我目前正在尝试阅读和解释反汇编并对IOMobileFramebuffer二进制文件进行一些逆向工程工作,以查看自上一个iOS版本以来是否有任何参数发生了变化.如果我发现任何事情,我一定会更新这个答案.但如果是这种情况,我建议尝试寻找另一种尝试捕获/记录屏幕内容的方法.
-UPDATE-
似乎有证据表明情况就是如此,如果你读到这个,它会显示完全相同的错误代码,这意味着该函数"不受支持",并返回一个IOKit错误.至少我们知道这意味着什么.但是,我仍然不确定如何解决它,或使功能工作.我会继续研究这个问题.
更新2
我实际上在iOS 9中发现了一个全新的类,"FigScreenCaptureController",它是MediaToolbox框架的一部分!但奇怪的是,Apple为什么只在iOS 9中包含这个?所以,也许会有一个方法来记录通过显示这个 ......我会更深入很快寻找到这一类.
| 归档时间: |
|
| 查看次数: |
3388 次 |
| 最近记录: |