为了支持基于I2C的触摸板(https://github.com/kprinssu/VoodooI2CHID),我正在努力追查开源项目中的retain漏洞。
我认为有保留泄漏的原因是因为当我试图通过以下命令卸载内核扩展时:
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)方面的出色答案。我通过ioreg验证了我的情况是第二种情况(类正在被终止,但没有被正确释放)。此外,我通过重写taggedRelease和taggedRetain (https://stackoverflow.com/a/13471512/48660)来使用pmdj的提示来打印函数调用的堆栈跟踪。
这就是我遇到问题的地方,我不能使用atos将十六进制地址转换回人类可读的符号。我使用以下命令来生成符号:
atos -arch x86_x64 -o VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f8432b000 0xffffff804588dfa0
load address参数是从kextstat检索的,我希望-l参数能够处理滑动运算。
atos应该返回一个有效的符号,但我得到的只是十六进制地址。在上面的示例中,我将0xffffff804588dfa0作为输出。有人能指出我到底错过了什么吗?
发布于 2019-06-17 22:33:33
kextstat和OSReportWithBacktrace都报告未滑动的地址,所以KASLR不是你的问题。
注意,您的kext显然是在0xffffff7f8432b000加载的,而您的回溯框架地址是0xffffff804588dfa0。这两者相距很远,实际上kext总是加载在0xffffff7f8??????? (unslid)范围内,所以kext不能接近kext代码。(偏移量约为3 3GB)它几乎肯定是内核本身的一个函数。如果您将atos与适当的运行内核的二进制文件一起使用,它应该能够找到哪一个。例如:
atos -o /Library/Developer/KDKs/KDK_10.14.5_18F132.kdk/System/Library/Kernels/kernel 0xffffff804588dfa0(我不知道您使用的是哪个内核版本,这个地址在18F132内核中似乎没有什么意义,但是您应该明白了。)
https://stackoverflow.com/questions/56624196
复制相似问题