How to Fix Ethernet Built-in Property for Hackintosh iMessage and Facetime

Step-by-step guide to inject the built-in property on Ethernet controllers for Hackintosh systems running macOS 10.9-10.13. Covers Clover, DSDT, and OpenCore methods.

Your Hackintosh won't sign into iMessage or Facetime? The Network preference pane shows "Self-Assigned IP" even though DHCP works fine? The problem is almost always a missing or misconfigured built-in property on the Ethernet controller. In IORegistry, the key built-in must be present and set to Yes under the IOService:/AppleACPIPlatformExpert/PCI0@0/.../IOPCI2PCIBridge/pci8086,...@... path. Without it, Apple’s networking stack treats the interface as removable (like Thunderbolt or USB), which disables iServices and can cause sleep/wake issues.

Why Ethernet Built-in Matters for macOS 10.9–10.13

Apple’s AppleEthernetControl kext requires the built-in property to validate that the Ethernet port is part of the logic board. Versions of macOS up to High Sierra are especially strict: if the property is absent, the system will refuse to bind the interface for certain system services, and iMessage activation will fail with an "unexpected error" dialog. This is not a DRM bypass — it’s a hardware recognition mechanism that Apple expects to be set in the firmware. On legacy Hackintosh hardware (Sandy Bridge, Ivy Bridge, Haswell, Broadwell-E), the BIOS often does not advertise this property to macOS, so we must inject it via the bootloader.

Three Methods to Inject Ethernet Built-in

All three methods achieve the same IORegistry state. Choose one, never combine them (to avoid duplicate properties).

1. Clover Configuration (config.plist)

Open your config.plist with a plist editor (e.g., Xcode, PlistEdit Pro). Navigate to Devices > Arbitrary. Add a new dictionary with subkeys to match your Ethernet device path. Alternatively, use the simpler Devices > Ethernet > BuiltIn boolean set to YES. Clover will apply this to the first network interface it finds. For multiple NICs, you must use Arbitrary to specify the exact device path (e.g., PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0)).

<key>Devices</key>
<dict>
    <key>Ethernet</key>
    <dict>
        <key>BuiltIn</key>
        <string>Yes</string>
    </dict>
</dict>

This method is sufficient for 90% of single-NIC builds. After reboot, verify with IORegistryExplorer.

2. DSDT Patch

If your bootloader setup is minimal or you prefer ACPI-level injection, add a _DSM method under the PCI device scope of your Ethernet controller in your DSDT. This is more invasive and requires decompiling and recompiling the DSDT. A typical patch for a Realtek RTL8111 on an Ivy Bridge system:

Scope (_SB.PCI0.RP04.PXSX)
{
    Method (_DSM, 4, NotSerialized)
    {
        If (LEqual (Arg2, Zero)) { Return (Buffer (One) { 0x03 }) }
        Return (Package (0x02)
        {
            "built-in",
            Buffer (One) { 0x01 }
        })
    }
}

You must identify the correct ACPI path using lspci or IORegistryExplorer before patching. A wrong path can cause a kernel panic at boot.

3. OpenCore (if transitioning from Clover)

In OpenCore, the equivalent is the DeviceProperties > Add section. Add a dictionary for your Ethernet PciRoot path with built-in as 01000000 (data type). Example:

<key>DeviceProperties</key>
<dict>
    <key>Add</key>
    <dict>
        <key>PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0)</key>
        <dict>
            <key>built-in</key>
            <data>AQAAAA==</data>
        </dict>
    </dict>
</dict>

This is the most precise and least invasive method for modern boot managers.

Verifying the Property

Download IORegistryExplorer from the legacy Apple Developer site (10.10–10.13 compatible). Open it, search for built-in or navigate to the Ethernet device node. You should see a key "built-in" = Yes (or 0x01 as data). If you see built-in = No or the key is absent, the injection was not applied or the device path is incorrect. Also check that IONetworkInterface entries under IOEthernetInterface display BSD Name: en0 — if your interface shows en1, macOS may have assigned it a secondary index due to missing built-in property.

Compatibility Notes by Chipset and macOS Version

Chipset / NIC macOS Version Common Inject Path Notes
Intel ICH10 (P45, X48) 10.6–10.13 PciRoot(0x0)/Pci(0x1c,0x2)/Pci(0x0,0x0) May need to set device-id fake for AppleIntelE1000
Intel 6/7 Series (H61, Z77) 10.8–10.13 PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0) Realtek ALC8xx audio may conflict if same path; use separate device
Intel 8/9 Series (Z87, Z97) 10.8–10.13 PciRoot(0x0)/Pci(0x1c,0x3)/Pci(0x0,0x0) Native Intel I217-V often works with igb kext; still need built-in
Intel X79 (C600) 10.7–10.13 PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0) Dual NICs: inject only one as built-in
Broadwell-E/X99 10.10–10.13 PciRoot(0x0)/Pci(0x1c,0x0)/Pci(0x0,0x0) Intel i210 requires SmallTree kext; built-in mandatory for iServices

Pitfalls with Multiple Network Interfaces

If your motherboard has two Ethernet ports (e.g., one Intel, one Realtek), macOS may assign one as en0 and the other as en1. The system prefers the interface with built-in = Yes as en0. If both get the property, the order is determined by ACPI device order. To avoid iServices confusion, explicitly set only the port you connect to the Internet (typically the Intel controller) as built-in. Leave the secondary port without the property. This also prevents sleep issues where a second active NIC keeps the system awake.

Testing Without iServices

You don’t have to log into iMessage to verify. Use Terminal:

# Check if en0 has built-in property in IOReg
ioreg -l -r -c IOEthernetInterface | grep -E "BSD Name|built-in"

If the output shows "built-in" = Yes for en0, the injection succeeded. A secondary check: run ifconfig en0 and look for inet — a valid IP address (not 169.254.x.x) confirms normal link.

If you’re still seeing Self-Assigned IP with the built-in property present, check that EthernetBuiltin in NetworkInterfaces.plist (located at /Library/Preferences/SystemConfiguration/) is set to YES for the interface. You can force it:

sudo defaults write /Library/Preferences/SystemConfiguration/preferences.plist CurrentSet -dict-add "EthernetBuilt-in" -bool YES

Then reboot. This is a fallback helper, not a substitute for IOReg injection.

Risks and Backup Reminders

Editing your bootloader config.plist is low-risk if you keep a backup. However, incorrect DSDT patches can cause kernel panics or boot loops. Before any modification:

  • Back up your current EFI folder (including config.plist) to a FAT32 USB drive.
  • Test changes one at a time — do not apply multiple patches in one session.
  • If you lose network after a change, boot from USB and restore the previous EFI.

For additional safety, review the general guidance in How to Safely Use Legacy Hackintosh Guides Without Breaking Your System. That article covers EFI backup strategies and Clover version rollback procedures that apply here as well.

Worked Example: Z77 + Realtek RTL8111

On a Gigabyte GA-Z77-DS3H with macOS High Sierra, the Ethernet controller is at PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0). After adding Devices > Ethernet > BuiltIn = YES and rebooting, IORegistryExplorer shows the property. The interface appears as en0, DHCP obtains an IP, and iMessage activates on first sign-in. If the same board uses both Realtek ALC892 audio and Realtek RTL8111, they share the same PCI bridge, but the built-in property applies only to the Ethernet function — audio remains unaffected.

On some Ivy Bridge boards with an Intel 82579V NIC, the DeviceProperties method in OpenCore is preferable because Clover’s EthernetBuiltIn sometimes injects the property too late, after AppleEthernetControl has already cached the device state. In those cases, use OpenCore with the exact PciRoot path and built-in as data type 01000000 — the property then appears before the driver loads, guaranteeing recognition.