作者:FloatingGuy 转载请注明出处:https://floatingguy.github.io/


说明

第一个 OSX 上的 Kernel Extension demo

参考:iOS架构-内核开发

从10.11开始Apple 对Kext 的安装变得更为严格。
从kext安装历史来看,10.11 之前可以通过
sudo nvram kext-dev-mode=1 and reboot(重启电脑).
这种方式来加载 非开发者证书签名的 kext。

但是之后 只有2条路了(上面的方式相对 更不安全):

  1. 购买 Apple 开发者证书
  2. 完全关闭 SIP

关闭 SIP的方法:

  1. 重启电脑,重启过程中一直按着command + R 直到进入startup界面
  2. 打开Terminal输入csrutil disable
  3. reboot

代码展示(项目创建就算了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <mach/mach_types.h>
#include <libkern/libkern.h> //C++ 库函数
kern_return_t FirstExtension_start(kmod_info_t * ki, void *d);
kern_return_t FirstExtension_stop(kmod_info_t *ki, void *d);
kern_return_t FirstExtension_start(kmod_info_t * ki, void *d)
{
printf("FirstExtension is start!!!");
return KERN_SUCCESS;
}
kern_return_t FirstExtension_stop(kmod_info_t *ki, void *d)
{
printf("FirstExtension goto stop!!!");
return KERN_SUCCESS;
}

开发测试:

在 10.12 上开发,然后拿到 10.11 关闭 SIP 的机器上测试。

编译安装 kext流程:

  • uname -r 查看系統內核版本, 设置libkern版本
  • sudo chown -R root:wheel HelloWorld.kext 更改權限
  • sudo kextload HelloWorld.kext 加載內核擴展
  • kextstat 查看當前內核擴展情況
  • sudo kextunload HelloWorld.kext 卸載內核擴展

注意 kext 的 info.plist 中OSBundleLibraries ->com.apple.kpi.libkern 对应的版本号 是测试机上的 libkern 的版本(uname -a)

xcode

使用 kextutil 工具检测 kext 存在的bug
mini

果然是关闭了 SIP 就可以 安装 kext, 已经显示 ‘allowing invalid signature xxx’
kextstat

问题

如何查看 kext 的输入(日志)?

Todo:

  1. git 项目 提取 kext
  2. fuzz osx kernel — kext

参考

初探Mac OSX内核开发(一)——创建内核扩展