0

我正在反转 iOS 固件。有什么方法可以找到通过 IOConnectCallMethod 调用的内核二进制代码?

4

1 回答 1

2

如果我们谈论的是 iOS 内核,首先你可能应该知道它是加密的。@xerub 在 theiphonewiki 上上传了 64 位版本的密钥。您也可以使用他的精彩工具 img4 来解密它。

所以,假设我们已经解密了 iPhone 5s 的 kernelcache.release.n51,你需要找到 GasGauge 服务的方法 2。

  1. 查看来自 xnu 内核的 iokit/IOKit/IOUserClient.h 源代码:

在此处输入图像描述

从中我们知道这externalMethod是虚拟方法,甚至更多registerNotificationPort跟随它(阅读 - vtable 的下一个条目)。

  1. 在 GasGauge 驱动程序中找到一个最大的 vtable 并在其中定位registerNotificationPort方法,您需要以前的条目:

在此处输入图像描述

  1. 下一步是在externalMethod方法中定位表地址:

在此处输入图像描述

正如我们在这里看到的,原始父级的 IOUserClient::externalMethod 无论如何都会被执行。因此,这是找到此方法的另一种方法。

  1. 在表中的 24 个 QWORD 之后,您将看到第一条记录:

在此处输入图像描述

但是你应该知道 externalMethod 方法的实现可能与其他驱动程序中的不同。你应该知道的主要事情 - 你需要找到这个方法,第二个参数(W1 寄存器)是方法的索引。另一件事 - 像 IOHID 这样的内核扩展具有多个 IOService 对象。您应该确定哪一个是您的目标。

于 2016-11-29T16:47:27.943 回答