安装完黑苹果会发现BIOS设置会被重置,这是因为AppleRTC导致的,解决这个办法有几种方案:
方案一:直接在EE目录加上这个防重置驱动ElliottForceLegacyRTC.kext
这种比较稳定可靠,目前在我的电脑上测试是没有问题的。
方案二:在变色龙配置文件kext.plist里加上<AppleRTCPatch></true>
这个方案在我的电脑上测试没有成功,可能与MacOS版本有关系。
方案三:手动给AppleRTC打上二进制补丁,并替换原生的AppleRTC文件
在网上找了几种补丁方案,用perl命令替换AppleRTC里面的二进制代码,结果都没有成功。
为了研究这个AppleRTC的二进制补丁,我找来了变色龙最新版本(Enoch_2921)的源代码,
在文件kernel_patcher_internal.c里发现了以下内容:
// ===================================
// (Clover)
// Patching AppleRTC to prevent CMOS reset
unsigned int AppleRTC_Patch(void *data, UInt32 DriverSize, UInt32 StartLocation)
{
unsigned int count = 0;
// as far as I know this works from Lion to Sierra
UInt8 LionSearch_X64[] = { 0x75, 0x30, 0x44, 0x89, 0xf8 };
UInt8 LionReplace_X64[] = { 0xeb, 0x30, 0x44, 0x89, 0xf8 };
UInt8 LionSearch_i386[] = { 0x75, 0x3d, 0x8b, 0x75, 0x08 };
UInt8 LionReplace_i386[] = { 0xeb, 0x3d, 0x8b, 0x75, 0x08 };
UInt8 MLSearch[] = { 0x75, 0x30, 0x89, 0xd8 };
UInt8 MLReplace[] = { 0xeb, 0x30, 0x89, 0xd8 };
//SunKi
//752e0fb6 -> eb2e0fb6
UInt8 MavSearch[] = { 0x75, 0x2e, 0x0f, 0xb6 };
UInt8 MavReplace[] = { 0xeb, 0x2e, 0x0f, 0xb6};
从这部分代码能看出来,这个补丁是从Clover的代码里搬过来的,嗯有很多Clover用户也反馈RTC补丁没有作用。
看来它们使用的补丁是一样的,并且我在网上找到的手动补丁几乎都是上面的几种方法。
可能在老版本MacOS上面这个补丁是可以生效的,目前系统升级后,导致这个补丁失败。
为了进一步研究这个补丁,我又找来了MacOS 10.11.6的原生驱动文件,AppleRTC.kext。
用WinHEX搜索了以上补丁内容,发现只有0x75,0x2e,0x0f,0xb6这一组数据可以找到,其它几组数据是不存在的。
从系统开机的日志可以看出来,AppleRTC的Patch也成功了,说明替换了0x75,0x2e,0x0f,0xb6为0xeb, 0x2e, 0x0f, 0xb6
但是并没有解决问题。
我用WinHEX手动替换了原始文件的相关内容,再次重启系统,发现问题依旧。
看来这个补丁对于当前系统版本(10.11.6)的确是没有作用了。
为了再进一步研究这个补丁,我只好亲自对AppleRTC进行反汇编,定位到0x75,0x2e,0x0f,0xb6的指令。
发现这里刚好调用了两次RTC写数据的函数,补丁的作用是跳过这两次写数据的动作。
这样一来好像这个补丁没问题啊,为什么还会失效呢?
因为这个写函数的调用不止这一处,还有很多地址有引用,所以一不做二不休,我干脆把写函数给干掉。
直接使用JMP大法,让写数据的函数失效,再来测试一下。
果然,这回BIOS不会重置了!!!
所以这个二进制的补丁应该这样写:
搜索:41 89 d7 41 89 F6
替换:E9 9F 00 00 00 90
收工!