安装完黑苹果会发现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

收工!