diff --git a/FAQ.md b/FAQ.md index 64d21c5..804fec4 100644 --- a/FAQ.md +++ b/FAQ.md @@ -160,6 +160,185 @@ If you wind up in the installer again after you've installed macOS it means you Congratulations, you got a macOS VM up and running! Now what? +# Fixing Apple ID Login Issues in macOS Virtual Machines + +## Problem Overview + +When running macOS in a virtual machine, you may encounter problems logging into Apple services including: +- Apple ID +- iMessage +- iCloud +- App Store + +This happens because Apple's services can detect that macOS is running in a virtual environment and block access. The solution is to apply a kernel patch that hides the VM presence from Apple's detection mechanism. + +NOTE as per forum post: Unfortunately, this would very possibly break qemu-guest-agent, which is necessary for the host getting VM status or taking hot snapshot while the VM is running. This is because qemu-guest-agent also checks the hv_vmm_present flag, but only works if it is true (=1). + +Use at your own risk. Hope it would help. + +## Solution: Kernel Patching + +This guide provides three methods to apply the necessary kernel patch. All methods implement the same fix originally described in [this forum post](https://forum.proxmox.com/threads/anyone-can-make-bluetooth-work-on-sonoma.153301/#post-697832). + +### Prerequisites + +Before proceeding with any method: +- Make sure you can access your EFI partition +- Locate your OpenCore `config.plist` file (typically in the `EFI/OC` folder) +- Back up your current `config.plist` before making changes + +## Method 1: Using the Utility Script (Simplest Approach) + +This is the fastest and easiest way to apply the patch. + +1. Mount your EFI partition using Clover Configurator or another EFI mounting tool +2. Download the patch script: + ```bash + curl -o apply_appleid_kernelpatch.py https://raw.githubusercontent.com/sickcodes/Docker-OSX/scripts/apply_appleid_kernelpatch.py + ``` +3. Run the script with your `config.plist` file path: + ```bash + python3 apply_appleid_kernelpatch.py /path/to/config.plist + ``` + +**Pro Tip**: You can drag and drop the `config.plist` file into your terminal after typing `python3 apply_appleid_kernelpatch.py` for an easy path insertion. + +**Note**: If you encounter a "permission denied" error, run the command with `sudo`: +```bash +sudo python3 apply_appleid_kernelpatch.py /path/to/config.plist +``` + +## Method 2: Using OCAT (OpenCore Auxiliary Tools) GUI + +If you prefer a graphical approach: + +1. Open OCAT and load your `config.plist` +2. Navigate to the **Kernel** section +3. Go to the **Patch** subsection +4. Add two new patch entries with the following details: + +### Patch 1 +| Setting | Value | +|---------|-------| +| **Identifier** | `kernel` | +| **Base** | *(leave empty)* | +| **Count** | `1` | +| **Find (Hex)** | `68696265726E61746568696472656164790068696265726E617465636F756E7400` | +| **Limit** | `0` | +| **Mask** | *(leave empty)* | +| **Replace (Hex)** | `68696265726E61746568696472656164790068765F766D6D5F70726573656E7400` | +| **Skip** | `0` | +| **Arch** | `x86_64` | +| **MinKernel** | `20.4.0` | +| **MaxKernel** | *(leave empty)* | +| **Enabled** | `True` | +| **Comment** | `Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0` | + +### Patch 2 +| Setting | Value | +|---------|-------| +| **Identifier** | `kernel` | +| **Base** | *(leave empty)* | +| **Count** | `1` | +| **Find (Hex)** | `626F6F742073657373696F6E20555549440068765F766D6D5F70726573656E7400` | +| **Limit** | `0` | +| **Mask** | *(leave empty)* | +| **Replace (Hex)** | `626F6F742073657373696F6E20555549440068696265726E617465636F756E7400` | +| **Skip** | `0` | +| **Arch** | `x86_64` | +| **MinKernel** | `22.0.0` | +| **MaxKernel** | *(leave empty)* | +| **Enabled** | `True` | +| **Comment** | `Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0` | + +5. Save the configuration +6. Reboot your VM + +## Method 3: Direct `config.plist` Editing + +For users who prefer to manually edit the configuration file: + +1. Mount your EFI partition +2. Locate and open your `config.plist` file in a text editor +3. Find the `Kernel` → `` → `Patch` → `` section +4. Add these two `` entries within the ``: + +```xml + + Arch + x86_64 + Base + + Comment + Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0 + Count + 1 + Enabled + + Find + aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA + Identifier + kernel + Limit + 0 + Mask + + MaxKernel + + MinKernel + 20.4.0 + Replace + aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA + ReplaceMask + + Skip + 0 + + + Arch + x86_64 + Base + + Comment + Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0 + Count + 1 + Enabled + + Find + Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA + Identifier + kernel + Limit + 0 + Mask + + MaxKernel + + MinKernel + 22.0.0 + Replace + Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA + ReplaceMask + + Skip + 0 + +``` + +5. Save the file +6. Reboot your VM + +## Important Notes + +- The `MinKernel` values (`20.4.0` and `22.0.0`) may need adjustment depending on your specific macOS version (Monterey, Ventura, Sonoma, etc.) +- If you encounter issues, consult the [OpenCore documentation](https://dortania.github.io/docs/) for appropriate values for your setup +- Always back up your configuration before making changes +- After applying the patch and rebooting, try signing into Apple services again + +## What This Patch Does + +This patch tricks macOS into believing it's running on physical hardware by redirecting the `hv_vmm_present` kernel variable, which normally indicates VM presence. After applying the patch, Apple services should function normally within your virtual environment. ### Slow UI The macOS UI expects and relies on GPU acceleration, and there is (currently) no way to provide GPU acceleration in the virtual hardware. See [osx-optimizer](https://github.com/sickcodes/osx-optimizer) for macOS configuration to speed things up. diff --git a/README.md b/README.md index 62d061a..e4e9ee2 100644 --- a/README.md +++ b/README.md @@ -265,7 +265,7 @@ The easiest and most secure way is `sshfs` ```bash # on Linux/Windows mkdir ~/mnt/osx -sshfs user@localhost:/ -p 50922 ~/mnt/osx +sshfs user@localhost: -p 50922 ~/mnt/osx # wait a few seconds, and ~/mnt/osx will have full rootfs mounted over ssh, and in userspace # automated: sshpass -p sshfs user@localhost:/ -p 50922 ~/mnt/osx ``` diff --git a/scripts/apply_appleid_kernelpatch.py b/scripts/apply_appleid_kernelpatch.py new file mode 100644 index 0000000..58feb7e --- /dev/null +++ b/scripts/apply_appleid_kernelpatch.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +import plistlib +import base64 +import os +import sys + +def add_kernel_patches(config_path): + # Make a backup of the original file + backup_path = config_path + '.backup' + os.system(f'cp "{config_path}" "{backup_path}"') + print(f"Backup created at {backup_path}") + + # Read the plist file + with open(config_path, 'rb') as f: + config = plistlib.load(f) + + # Prepare the patch entries + patch1 = { + 'Arch': 'x86_64', + 'Base': '', + 'Comment': 'Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0', + 'Count': 1, + 'Enabled': True, + 'Find': base64.b64decode('aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA'), + 'Identifier': 'kernel', + 'Limit': 0, + 'Mask': b'', + 'MaxKernel': '', + 'MinKernel': '20.4.0', + 'Replace': base64.b64decode('aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA'), + 'ReplaceMask': b'', + 'Skip': 0, + } + + patch2 = { + 'Arch': 'x86_64', + 'Base': '', + 'Comment': 'Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0', + 'Count': 1, + 'Enabled': True, + 'Find': base64.b64decode('Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA'), + 'Identifier': 'kernel', + 'Limit': 0, + 'Mask': b'', + 'MaxKernel': '', + 'MinKernel': '22.0.0', + 'Replace': base64.b64decode('Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA'), + 'ReplaceMask': b'', + 'Skip': 0, + } + + # Add patches to the kernel patch section + if 'Kernel' in config and 'Patch' in config['Kernel']: + # Check if patches already exist + patch_exists = False + for patch in config['Kernel']['Patch']: + if isinstance(patch, dict) and 'Comment' in patch: + if 'Sonoma VM BT Enabler' in patch['Comment']: + patch_exists = True + print(f"Patch already exists: {patch['Comment']}") + + if not patch_exists: + config['Kernel']['Patch'].append(patch1) + config['Kernel']['Patch'].append(patch2) + print("Added both Sonoma VM BT Enabler patches to config.plist") + + else: + print("Error: Could not find Kernel -> Patch section in config.plist") + return False + + # Write the updated plist file + with open(config_path, 'wb') as f: + plistlib.dump(config, f) + + print(f"Successfully updated {config_path}") + return True + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python apply_appleid_kernelpatch.py /path/to/config.plist") + sys.exit(1) + + config_path = sys.argv[1] + if not os.path.exists(config_path): + print(f"Error: File {config_path} does not exist") + sys.exit(1) + + success = add_kernel_patches(config_path) + if success: + print("Patches applied successfully. Please reboot to apply changes.") + else: + print("Failed to apply patches.") \ No newline at end of file