我已经从 CHUD 框架中反汇编了有问题的函数 (_utilPurgeDiskBuffers)。该函数似乎不是很复杂,但由于我不是 MacOS 程序员,因此导入和调用的 sys API 对我来说没有多大意义。
API 做的第一件事是调用另一个函数,即_miscUtilsUserClientConnect_internal。此函数似乎建立了与 CHUD 内核扩展的连接。
为此,它调用_getCHUDUtilsKextService,它试图通过使用从I/O 套件导入的IORegistryCreateIterator 枚举所有kexts 来定位CHUD 内核扩展。找到kext后,通过_IOServiceOpen打开。
此时我们与 CHUD kext 建立了连接(至少这是我从反汇编列表中的理解)。
最后拨打了IOConnectMethodStructureIStructureO,我猜这实现了真正的魔力。
在不知道一些内部细节或这个函数的签名的情况下,参数对我来说没有意义。
下面是反汇编代码:
__text:4B0157A7 lea eax, [ebp+var_1C]
__text:4B0157AA mov dword ptr [esp+14h], 0
__text:4B0157B2 mov [esp+10h], eax
__text:4B0157B6 mov [esp+0Ch], eax
__text:4B0157BA mov dword ptr [esp+8], 0
__text:4B0157C2 mov dword ptr [esp+4], 0Eh
__text:4B0157CA mov [esp], edx
__text:4B0157CD call _IOConnectMethodStructureIStr
请注意,var_1C 之前已清零。
希望你们中的一些人能更了解这些系统调用。如果您想了解更多信息,请告诉我。
更新:
为了帮助您入门,只需使用 IO 套件 SDK 中的 AppleSamplePCIClient.c 示例。这基本上完成了 CHUD 工具中的清除应用程序所做的工作。
您唯一需要更改的是最终_IOConnectMethodStructureIStr 调用的参数。从上面的反汇编列表中获取它们。因为我没有 Mac,所以我无法测试所有这些东西。