如何从 Kext 访问未导出的符号?
How to access unexported symbol from Kext?
我试图在 M1 机器上加载 kext 模块 运行 11.4 Beta (20F5046g) Big Sur 并在加载 kext 模块时遇到一些关于绑定的错误消息。
访问从 Apple kext 模块导出的内核符号
首先,为了访问从 apple 的 kext 模块导出的内核函数,com.apple.kpi.unsupported,我使用了下面的 extern 声明。
extern int cpu_number(void);
此外,我在 info.plist
上添加了 com.apple.kpi.unsupported
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.kpi.libkern</key>
<string>20.5</string>
<key>com.apple.kpi.unsupported</key>
<string>20.5.0</string>
</dict>
编译没有出现任何错误,但是当我尝试加载模块时,它会打印以下消息。
Error Domain=KMErrorDomain Code=31 "Error occurred while building a collection:
1: One or more binaries has an error which prevented linking. See other errors.
2: Could not use 'kext' because: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
kext specific:
1: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
" UserInfo={NSLocalizedDescription=Error occurred while building a collection:
1: One or more binaries has an error which prevented linking. See other errors.
2: Could not use 'kext' because: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
kext specific:
1: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
我可以访问内核符号列表中指定的内核符号,但不是从 apple 的 kext 模块导出的吗?
我还想访问名为 SecureDTInitEntryIterator 的内核函数。我发现这个符号是列在位于/System/Library/Kernels/kernel 的内核符号上的。但是,$kextfind -defines-symbol _SecureDTIterateEntries 没有 return 任何对应的 kext 模块名称。
作为一个IOS新手,我猜这个符号不是从任何苹果的kexy模块导出的。有什么方法可以从我的 kext 模块访问这个函数吗?我想我可以用函数原型键入符号在内核中的地址space,但我正在寻找一种系统的方法,如果存在的话。
我刚刚检查过,关键细节似乎是您正试图在 arm64/aarch64 上访问此功能。事实证明,它在 x86_64 的“不受支持”KPI 中导出,但在 arm64 上没有导出:
没有直接的方法来访问未导出的符号。如果您知道某个符号在 运行 内核的确切版本中的偏移量,您应该能够通过从已知函数地址偏移来计算地址;至少,这适用于 x86-64。由于 PAC(指针身份验证),arm64 可能需要额外的工作。
由于这会规避 Apple 的政策,我不建议在运输产品中使用这种技术。
我试图在 M1 机器上加载 kext 模块 运行 11.4 Beta (20F5046g) Big Sur 并在加载 kext 模块时遇到一些关于绑定的错误消息。
访问从 Apple kext 模块导出的内核符号
首先,为了访问从 apple 的 kext 模块导出的内核函数,com.apple.kpi.unsupported,我使用了下面的 extern 声明。
extern int cpu_number(void);
此外,我在 info.plist
上添加了 com.apple.kpi.unsupported <key>OSBundleLibraries</key>
<dict>
<key>com.apple.kpi.libkern</key>
<string>20.5</string>
<key>com.apple.kpi.unsupported</key>
<string>20.5.0</string>
</dict>
编译没有出现任何错误,但是当我尝试加载模块时,它会打印以下消息。
Error Domain=KMErrorDomain Code=31 "Error occurred while building a collection:
1: One or more binaries has an error which prevented linking. See other errors.
2: Could not use 'kext' because: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
kext specific:
1: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
" UserInfo={NSLocalizedDescription=Error occurred while building a collection:
1: One or more binaries has an error which prevented linking. See other errors.
2: Could not use 'kext' because: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
kext specific:
1: Failed to bind '_cpu_number' in 'kext' (at offset 0x0 in __DATA_CONST, __got) as could not find a kext which exports this symbol
我可以访问内核符号列表中指定的内核符号,但不是从 apple 的 kext 模块导出的吗?
我还想访问名为 SecureDTInitEntryIterator 的内核函数。我发现这个符号是列在位于/System/Library/Kernels/kernel 的内核符号上的。但是,$kextfind -defines-symbol _SecureDTIterateEntries 没有 return 任何对应的 kext 模块名称。
作为一个IOS新手,我猜这个符号不是从任何苹果的kexy模块导出的。有什么方法可以从我的 kext 模块访问这个函数吗?我想我可以用函数原型键入符号在内核中的地址space,但我正在寻找一种系统的方法,如果存在的话。
我刚刚检查过,关键细节似乎是您正试图在 arm64/aarch64 上访问此功能。事实证明,它在 x86_64 的“不受支持”KPI 中导出,但在 arm64 上没有导出:
没有直接的方法来访问未导出的符号。如果您知道某个符号在 运行 内核的确切版本中的偏移量,您应该能够通过从已知函数地址偏移来计算地址;至少,这适用于 x86-64。由于 PAC(指针身份验证),arm64 可能需要额外的工作。
由于这会规避 Apple 的政策,我不建议在运输产品中使用这种技术。