一劳永逸!更新不再替换Kext(Kexts to patch)教程
本帖最后由 syscl 于 2015-2-28 14:03 编辑本文没有什么技术含量,只是在PCBeta(远景),没有一篇介绍给内核扩展(Kext)打补丁、修改的教程,结合自己的心得,分享给远景的朋友们。谢绝转载到远景之外的任何地方。
给内核扩展打补丁,能开启系统中被限制的功能,更接近白苹果。例如修改IOAHCIBlockStorage.kext后,可以开启第三方固态硬盘(SSD)的Trim功能、修改AppleRTC.kext解决重置BIOS的问题、修改AppleHDA.kext驱动音频......
优点:
一劳永逸:系统更新会伴随着内核扩展(Kexts)的更新,导致我们以往所做的修改失效。现在,我们不用担心系统更新导致的修改失效(除非Kext进行了重大改动)。
使用的是系统最新的驱动程序,而不用回滚到旧版本。
不需要重建缓存池。
没有破坏系统中内核扩展的完整性。(可以在『系统信息』—『功能扩展』当中看到,被修改的软件『签署方』)
需要:
[*]含有Kextstopatch功能的Clover (如果采用其他引导工具,则忽略此项)
[*]编辑Clover配置文件(Config.plist)的程序(例如Xcode、PlistEdit Pro、Clover Configurator...)
[*]采用其他引导工具的朋友(Chameleon、XPC、Ozmosis...)若需要修改Info.plist文件,则需要FakeSMC.kext
在进行操作前,有必要粗略的了解ASCII码。以修改IOAHCIBlockStorage.kext为例:
打开『终端机』,输入hexdump -C /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
显示结果分为三列,文件偏移量,字节的十六进制,ASCII字符。例如说,我要替换掉APPLE SSD这个字符串以实现Trim功能,只需要用『空字符NUL(Null)』替代『APPLE SSD』。
『APPLE SSD』每个字所对应的十六进制是『41』『50』『50』『4c』『45』『20』『53』『53』『44』,摘录成『4150504c4520535344』。用空字符(NUL)去替换每个对应的字,就是『00』『00』『00』『00』『00』『00』『00』『00』『00』,摘录成『000000000000000000』。我们依次把需要替换字符的十六进制、更改后字符的十六进制分别贴入到Clover Configuration当中即可。
为了加强理解,再看一例。让AppleHDA.kext加载修改的Platform.zml.zlib文件。系统在启动的过程中会读取『AppleHDA.kext/Contents/Resources/』下面的xml.zl文件,而我们却希望AppleHDA读取我们修改的zml.zl以驱动音频。
技巧:1. 关于查看文件十六进制,在『终端机』中输入hexdump -C之后展开『AppleHDA.kext/Contents/MacOS/』将AppleHDA文件拖入到终端机中即可。hexdump -C/System/Library/Extensions/AppleHDA.kext/Contents/MacOS/AppleHDA
2.『搜索特定字符串,『终端机』中利用组合键『Command+F』』
2.『xml.zl』6个字符对应的十六进制是『78』『6d』『6c』『2e』『7a』『6c』,摘录成『786d6c2e7a6c』而『zml.zl』6个字符对应的十六进制是『7a』『6d』『6c』『2e』『7a』『6c』,摘录成『7a6d6c2e7a6c』。依次把需要替换字符的十六进制、更改后字符的十六进制分别贴入到Clover Configuration当中即可。
或用『PlistEdit Pro』来配置Clover的Config.plist:
展开『KernelAndKextPatches』,选中『KextsToPatch』并右键,选中『New Child』以创建子项
在创建好的子项『Child』下面填入:
[*]Find,类型:Data,值:786d6c2e7a6c
[*]Name,类型:String,值:AppleHDA
[*]Replace,类型:Data,值:7a6d6c2e7a6c
当然,如果你熟悉Base64,plist的构成 ,也可以抛弃Clover Configurator,Xcode,PlistEdit Pro,直接用『文本编辑器』编辑Config.plist。把『786d6c2e7a6c』转换成『eG1sLnps』,『7a6d6c2e7a6c』转换成『em1sLnps』,然后贴入即可。
当遇到修改Info.plist时:
以修改『AppleGraphicsPowerManagement.kext』实现显卡降频为例。
在终端中输入:hexdump -C /System/Library/Extensions/AppleGraphicsPowerManagement.kext/Contents/Info.plist
找到要替换的显卡ID,例如把『Device0fea』替换成『Device0402』。『Device0fea』字对应的十六进制值分别是『44』『65』『76』『69』『63』『65』『30』『66』『65』『61』,摘录成『44657669636530666561』。『Device0402』字的十六进制值分别是『44』『65』『76』『69』『63』『65』『30』『34』『30』『32』,摘录成『44657669636530343032』。依次把需要替换字符的十六进制、更改后字符的十六进制分别贴入到Clover Configuration当中,并勾选『InfoPlist Patch』。重建缓存后,重启两次即可。
当然,我们还有更好的方法去加载AGPM,那就是通过FakeSMC.kext。利用FakeSMC.kext可以抛弃Clover,转而采用其他的引导工具(例如Chameleon、XPC、Ozmosis...)也不需要重新建立缓存。以iMac 14,2(Mac-27ADBB7B4CEE8E61)加载Geforce 8600 GT(VenderID 0402)为例。只需要:
<i>从『AppleGraphicsPowerManagement.kext/Contents/Info.plist』中复制出『IOKitPersonalities』下面的『AGPM』,粘贴到『FakeSMC.kext/Contents/Info.plist』下的『IOKitPersonalities』。
<ii>在刚才粘贴的项目下面,找到『Machines/Mac-27ADBB7B4CEE8E61/』,把『Vendor10deDevice0fea』改成『Vendor10deDevice0402』
成功加载后,我们可以看到签署方是漂亮的『Software Signing, Apple Code Signing Certification Authority, Apple Root CA』,而非『未知』。这也表明,这种加载方式不破坏系统内核扩展的完整性。
////
一些修改的模板和参考
**** Hidden Message *****
本帖最后由 syscl 于 2015-2-18 17:16 编辑
附上十六进制(Hex*)与字符(ASCII)转换表
十六进制(Hex*)ASCII(字符)含义
0NUL(null)空字符
1SOH(start ofheadling)标题开始
2STX (start of text)正文开始
3ETX (end of text)正文结束
4EOT (end oftransmission)传输结束
5ENQ (enquiry)请求
6ACK (acknowledge)收到通知
7BEL (bell)响铃
8BS (backspace)退格
9HT (horizontal tab)水平制表符
0ALF (NL line feed, newline)换行键
0BVT (vertical tab)垂直制表符
0CFF (NP form feed, newpage)换页键
0DCR (carriage return)回车键
0ESO (shift out)不用切换
0FSI (shift in)启用切换
10DLE (data linkescape)数据链路转义
11DC1 (device control1)设备控制1
12DC2 (device control2)设备控制2
13DC3 (device control3)设备控制3
14DC4 (device control4)设备控制4
15NAK (negativeacknowledge)拒绝接收
16SYN (synchronousidle)同步空闲
17ETB (end of trans.block)传输块结束
18CAN (cancel)取消
19EM (end of medium)介质中断
1ASUB (substitute)替补
1BESC (escape)溢出
1CFS (file separator)文件分割符
1DGS (group separator)分组符
1ERS (record separator)记录分离符
1FUS (unit separator)单元分隔符
20(space)空格
21!
22"
23#
24$
25%
26&
27'
28(
29)
2A*
2B+
2C,
2D-
2E.
2F/
300
311
322
333
344
355
366
377
388
399
3A:
3B;
3C<
3D=
3E>
3F?
40@
41A
42B
43C
44D
45E
46F
47G
48H
49I
4AJ
4BK
4CL
4DM
4EN
4FO
50P
51Q
52R
53S
54T
55U
56V
57W
58X
59Y
5AZ
5B[
5C\
5D
5E^
5F_
60`
61a
62b
63c
64d
65e
66f
67g
68h
69i
6Aj
6Bk
6Cl
6Dm
6En
6Fo
70p
71q
72r
73s
74t
75u
76v
77w
78x
79y
7Az
7B{
7C|
7D}
7E~
7FDEL (delete)删除
本帖最后由 syscl 于 2015-3-4 15:45 编辑
成功案例(节选):
wagsin成功驱动AMD R9 270X_BF:https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1582410&page=1#pid43045269
未完待续
////
占楼备用。望版主谅解 前排广告位招租。。。 这个要支持,收下慢慢研究! 强力支持一下,这个是好东西,正在使用,还有到更多功能再学习 感谢分享! 收下有时间慢慢研究,大家过年好! 好东西支持一个 想做又不太有把握,试试这个。 支持@@@!!! 好,留个记号。 支持一个 syscl 发表于 2015-2-18 17:04
附上十六进制(Hex*)与字符(ASCII)转换表
支持一个留来慢慢研究下 这个好啊,收藏了,慢慢照着改! 学习了 谢谢楼主 好东西支持!! 黑苹果真心折腾,尤其像我这样的小白! 强烈支持这么好的教程,感谢楼主分享!祝大家新年快乐!!!