如何使用 atos 从 OSReportWithBacktrace 中正确地符号化地址?

How to use atos to properly symbolicate addresses from OSReportWithBacktrace?

我正在努力寻找开源项目中的保留漏洞以支持基于 I2C 的触控板 (https://github.com/kprinssu/VoodooI2CHID)。

我认为存在保留泄漏的原因是当我尝试通过以下命令卸载内核扩展时:

sudo kextunload -verbose 6 VoodooI2CHID.kext

我得到以下输出:

Kext user-space log filter changed from 0xff2 to 0xfff.
Kext kernel-space log filter changed from 0xff2 to 0xfff.
Kext library architecture set to x86_64.
Requesting unload of com.alexandred.VoodooI2CHID (with termnation of IOServices).
(kernel) User-space log flags changed from 0x0 to 0xfff.
(kernel) Received 'Unload' request from user space.
(kernel) Rescheduling scan for unused kexts in 60 seconds.
(kernel) Can't unload kext com.alexandred.VoodooI2CHID; classes have instances:
(kernel)     Kext com.alexandred.VoodooI2CHID class VoodooI2CPrecisionTouchpadHIDEventDriver has 1 instance.
(kernel)     Kext com.alexandred.VoodooI2CHID class VoodooI2CMultitouchHIDEventDriver has 1 instance.
Kernel error handling kext request - (libkern/kext) kext is in use or retained (cannot unload).
Failed to unload com.alexandred.VoodooI2CHID - (libkern/kext) kext is in use or retained (cannot unload).

我发现了 pmdj 关于跟踪保留泄漏 (Can't Unload Kernel Extension; Classes Have Instances). I verfied that my situation is the second case via ioreg (classes are being terminated but are not properly freed). Additionally, I used pmdj's hint by overiding taggedRelease and taggedRetain () 以打印函数调用的堆栈跟踪的出色答案。

这是我 运行 遇到问题的地方,我无法使用 atos 将十六进制地址转换回人类可读的符号。我使用以下命令生成符号:

atos -arch x86_x64 -o VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f8432b000 0xffffff804588dfa0

加载地址参数是从 kextstat 中检索的,我希望 -l 参数应该处理幻灯片算法。

atos 应该 return 一个有效的符号,但我得到的只是返回的十六进制地址。在上面的示例中,我得到 0xffffff804588dfa0 作为输出。谁能指出我到底缺少什么?

kextstatOSReportWithBacktrace 都报告未滑动的地址,所以 KASLR 不是你的问题。

请注意,您的 kext 显然已加载到 0xffffff7f8432b000,而您的回溯帧地址是 0xffffff804588dfa0。这相距很远,事实上 kexts 总是在 0xffffff7f8???????(unslid)范围内加载,所以 0xffffff804588dfa0 不能靠近 kext 代码。 (偏移量约为 3GB)它几乎可以肯定是内核中的一个函数。如果您将 atos 与适当的 运行 内核的二进制文件一起使用,它应该能够找到是哪一个。例如:

atos -o /Library/Developer/KDKs/KDK_10.14.5_18F132.kdk/System/Library/Kernels/kernel 0xffffff804588dfa0

(不知道你用的是什么内核版本,而且这个地址在18F132内核中好像没什么意义,不过你懂的。)