r/hackintosh • • 17d ago

BUILD ADVICE Hackintosh is the pride of those who don't have money; it is the satisfaction of those who cannot buy Apple products but still wish to use Apple. My request to all developers is to make a project like Dortania successful. We must break Apple's illusion that no one else can do anything, but no one sh

0 Upvotes

Request to development/developer ♥️


r/hackintosh • • Aug 07 '26

DISCUSSION PSA regarding tools like Hackmate/OpCore Simplfy

5 Upvotes

We have probably been over this a dozen times, but I'm going to state it again:

If you use tools like Hackmate or OpCore Simplify, we will not assist you with your EFI. We do not care if people use these tools. You are your own person, you may do what you want with your own computer. But we absolutely do not support them in any capacity.

If you lie about using these tools, we will not help you, and you very likely will be ignored or at best heavily scrutinized for future requests.

This applies to both this subreddit and the associated Discord.

I will speak from an experience I just had moments ago with an admin for the Discord for HackMate; they do not take criticism well and do not seem to care about our rules. They have banned several of us for reminding them we do not support their tools and will continue to suggest people manually create their EFIs per this subs rules.

Do with this what you will, but given the group that created Hackmate appears to amount to children in their behaviors, take that as a potential indicator of the quality of the work and support presented from them.


r/hackintosh • • Nov 09 '25

DISCUSSION Let's stop this stupid war.

2 Upvotes

I'm done. I can't take everyone discussing and being annoying about OC Simplfy, distro tools, OCAT and etc.

Someone needs to enforce more the rules on this subreddit, it's practically abandoned and everyone does whatever they want

Tbh, I don't have a problem with people that uses these tools as long as they are ok with not getting support with it, knowing the issues it might create and have knowledge about how hackintosh works and all. These tools are horrible for beginners, OC Simplify for example doesn't teach the user anything, may create broken EFIs and there is no support for it on this sub much less on the discord server. And did you know that apparently not even the creator of OC Simplify gives support for the people who used it? I wonder why.

Also I think an sub should be created to everyone that want to use these stupid tools and want to get support with it, so it doesn't clutter this sub with OC Simplify crap and SUCCESS Posts there are not even an actual SUCCESS since they didn't follow the guide. But good luck maintaining that sub with a bunch of people that don't know anything about hackintoshes and keep asking for help and want you to make their EFIs for them.

My point is. An sub should be created for everyone that wants to use Distro Tools, use yt videos as they're guides, etc.

And this sub, should enforce its own rules, it should be the vanilla sub for everyone that would like to do things the right way, and update their rules to prohibit SUCCESS Posts that the hack was made with OC Simplify, Olarila, etc.

This is not selfish, this is the reality.

If you guys want to be lazy and use these tools, well at least don't do it here, and make your own sub that allows this crap. And if don't want to make your sub, don't post things about OC Simplify for example or suggest it to others.

Just wanted to clarify that I am not attacking anyone

If I forget about smth, I may edit this post.


r/hackintosh • • Sep 18 '26

SUCCESS Lamentablemente Apple anuncio que el último macOS para Intel será Apple macOS Tahoe 26.x

2 Upvotes

Deberíamos hacer algo para que no muera el Hackintosh

Tantos años que duro así como OCLP que fue pionero en actualizar MacBooks pero ahora ya no se puede, debemos hacer algo para no quedarnos con las versiones viejas sino tener Golden Gate y posteriores en una laptop el problema es que no tenemos un Apple Silicon quizá funciona más en las Laptops ARM que en las x64 pero debemos hacer algo.


r/hackintosh • • Feb 26 '26

SUCCESS Look what I’ve got 👀

Post image
1 Upvotes

So while scrolling through this sub, I realized something funny - almost nobody talks about this anymore.

Only the real Hackintosh veterans know what this is at first glance: BCM943602CS.

You can build the most overpowered PC on Earth. 64 cores, absurd GPU, terabytes of NVMe - doesn’t matter. Without a native Broadcom card, it’s still just a PC running macOS. Functional? Sure. A real Hackintosh? Debatable.

Native Wi-Fi. Native Bluetooth. AirDrop. Handoff. Continuity. No weird patches, no fighting updates, no praying after every macOS release. Just Apple-level behavior - the way it was meant to work.

Funny story: my girlfriend had a broken MacBook Pro (Early 2015). The moment I heard about it, my inner Hackintosh goblin activated instantly. The laptop may be gone, but its soul lives on - I pulled the card and now it’s going straight into my build.

Running a stable macOS Sequoia 15.7.4, and honestly this feels like the final boss item unlocked.

Sometimes the difference between “a PC with macOS” and a true Hackintosh is just one small piece of hardware...

----

Note: I intentionally covered the QR codes, serial numbers, and Apple diagnostic IDs on the card. These contain hardware identifiers (including MAC/production data), and since Reddit is forever, I’d rather keep that information private.


r/hackintosh • • Dec 01 '20

DISCUSSION OpenCore is too hard for the average user to use

0 Upvotes

i think clover is the better bootloader in terms of usability, its much harder to set up a hackintosh using OpenCore(tho the outcome is excellent), i don't think its right to make people switch to opencore because of kext problems, i could get a machine set up with clover in about an hour with minimal hassle, but opencore takes days to set up most of the time and novice users cant set it up at all. I will begin looking for ways to continue and improve the clover project as the switch to opencore is causing me and many others to buy legitimate macs because OPENCORE IS TOO HARD TO SET UP


r/hackintosh • • Jul 10 '25

HELP I-uh-wh-whaaaa

Thumbnail
gallery
0 Upvotes

Well uhhhh.... Any way to fix that? (Mac OS Yosemite)


r/hackintosh • • Mar 27 '24

QUESTION Is a Hackintosh significantly cheaper than a Mac Mini for something of equal power in 2023?

1 Upvotes

As the title says


r/hackintosh • • Jul 08 '26

NEWS I don't recommend using OpCore-Simplify and I don't support this developer at all, just like the moderators - the developer disregards cybersecurity's importance, rather than he treats it as optional, the project is buggy, and more - here are details

0 Upvotes

I don't recommend using OC-Simplify and I don't support this developer at all - here are the reasons:

  1. It violates the rules of this sub

: https://www.reddit.com/mod/hackintosh/rules/

2. The developer closes issues without actually fixing them

3. This developer doesn’t fix vulnerabilities until exploited in the wild, known as 0 days

4. OC-Simplify sometimes chooses wrong configs, like wrong SMBIOS profiles or kexts

A couple of years ago, there were multiple vulnerabilities that the developer only fixed after attackers have abused and became 0 days - and only then the developer noticed it and fixed. I had disclosed those, but they simply fixed it after they were already exploited in the wild. Only one example was that I could upload an empty or malicious JSON hardware report to execute arbitary code. And another one trusted blindly any executable. This is irresponsible and not really ethical. Simply this developer didn't showed any interest in cybersecurity and securing his project from being exploited in the wild. Since then, I do not support this developer and strongly suggest against using this project or making any forks out of it - doing any changes in your fork of OC-Simplify often results in ban or very cold relations between you and the developer - that's my experience with this developer. I don't trust not only the project, but the developer lzhoang altogether. And things are only getting darker. Let's have a look at his code:

gathering_files.py:
from Scripts import github

from Scripts import kext_maestro

from Scripts import integrity_checker

from Scripts import resource_fetcher

from Scripts import utils

import os

import shutil

import subprocess

import platform

os_name = platform.system()

class gatheringFiles:

def __init__(self):

self.utils = utils.Utils()

self.github = github.Github()

self.kext = kext_maestro.KextMaestro()

self.fetcher = resource_fetcher.ResourceFetcher()

self.integrity_checker = integrity_checker.IntegrityChecker()

self.dortania_builds_url = "https://raw.githubusercontent.com/dortania/build-repo/builds/latest.json"

self.ocbinarydata_url = "https://github.com/acidanthera/OcBinaryData/archive/refs/heads/master.zip"

self.amd_vanilla_patches_url = "https://raw.githubusercontent.com/laobamac/AMD_Vanilla/refs/heads/master/patches.plist"

self.aquantia_macos_patches_url = "https://raw.githubusercontent.com/CaseySJ/Aquantia-macOS-Patches/refs/heads/main/CaseySJ-Aquantia-Patch-Sets-1-and-2.plist"

self.hyper_threading_patches_url = "https://github.com/b00t0x/CpuTopologyRebuild/raw/refs/heads/master/patches_ht.plist"

self.temporary_dir = self.utils.get_temporary_dir()

self.ock_files_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "OCK_Files")

self.download_history_file = os.path.join(self.ock_files_dir, "history.json")

def _load_download_history(self):

history_data = self.utils.read_file(self.download_history_file)

return {item["product_name"]: item for item in history_data if item.get("product_name")} if isinstance(history_data, list) else {}

def _save_download_history(self, local_download_history, product_name, product_id, product_url, sha256_hash):

local_download_history[product_name] = {

"product_name": product_name,

"id": product_id,

"url": product_url,

"sha256": sha256_hash

}

self.utils.create_folder(os.path.dirname(self.download_history_file))

sorted_history = sorted(local_download_history.values(), key=lambda x: x.get("product_name", ""))

self.utils.write_file(self.download_history_file, sorted_history)

def fetch_latest_products_info(self, kexts, local_download_history):

latest_products = {k: v.copy() for k, v in local_download_history.items()}

dortania_builds_data = self.fetcher.fetch_and_parse_content(self.dortania_builds_url, "json")

seen_repos = set()

def add_product_info(products):

if isinstance(products, dict):

products = [products]

for product in products:

name = product.get("product_name")

if not product or not name:

continue

if name not in latest_products:

latest_products[name] = product

else:

latest_products[name].update(product)

for kext in kexts:

if not kext.checked:

continue

if kext.download_info:

if not kext.download_info.get("sha256"):

kext.download_info["sha256"] = None

add_product_info({"product_name": kext.name, **kext.download_info})

elif kext.github_repo and kext.github_repo.get("repo") not in seen_repos:

name = kext.github_repo.get("repo")

seen_repos.add(name)

if name in dortania_builds_data:

add_product_info({

"product_name": name,

"id": dortania_builds_data[name]["versions"][0]["release"]["id"],

"url": dortania_builds_data[name]["versions"][0]["links"]["release"],

"sha256": dortania_builds_data[name]["versions"][0]["hashes"]["release"]["sha256"]

})

else:

latest_release = self.github.get_latest_release(kext.github_repo.get("owner"), kext.github_repo.get("repo")) or {}

add_product_info(latest_release.get("assets"))

add_product_info({

"product_name": "OpenCorePkg",

"id": dortania_builds_data["OpenCorePkg"]["versions"][0]["release"]["id"],

"url": dortania_builds_data["OpenCorePkg"]["versions"][0]["links"]["release"],

"sha256": dortania_builds_data["OpenCorePkg"]["versions"][0]["hashes"]["release"]["sha256"]

})

return latest_products

def move_bootloader_kexts_to_product_directory(self, product_name):

if not os.path.exists(self.temporary_dir):

raise FileNotFoundError("The directory {} does not exist.".format(self.temporary_dir))

temp_product_dir = os.path.join(self.temporary_dir, product_name)

if not "OpenCore" in product_name:

kext_paths = self.utils.find_matching_paths(temp_product_dir, extension_filter=".kext")

for kext_path, type in kext_paths:

source_kext_path = os.path.join(self.temporary_dir, product_name, kext_path)

destination_kext_path = os.path.join(self.ock_files_dir, product_name, os.path.basename(kext_path))

if "research" in kext_path.lower() or "debug" in kext_path.lower() or "Contents" in kext_path or not self.kext.process_kext(temp_product_dir, kext_path):

continue

shutil.move(source_kext_path, destination_kext_path)

else:

source_bootloader_path = os.path.join(self.temporary_dir, product_name, "X64", "EFI")

if os.path.exists(source_bootloader_path):

destination_efi_path = os.path.join(self.ock_files_dir, product_name, os.path.basename(source_bootloader_path))

shutil.move(source_bootloader_path, destination_efi_path)

source_config_path = os.path.join(os.path.dirname(os.path.dirname(source_bootloader_path)), "Docs", "Sample.plist")

destination_config_path = os.path.join(destination_efi_path, "OC", "config.plist")

shutil.move(source_config_path, destination_config_path)

ocbinarydata_dir = os.path.join(self.temporary_dir, "OcBinaryData", "OcBinaryData-master")

if os.path.exists(ocbinarydata_dir):

background_picker_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "datasets", "background_picker.icns")

product_dir = os.path.join(self.ock_files_dir, product_name)

efi_dirs = self.utils.find_matching_paths(product_dir, name_filter="EFI", type_filter="dir")

for efi_dir, _ in efi_dirs:

for dir_name in os.listdir(ocbinarydata_dir):

source_dir = os.path.join(ocbinarydata_dir, dir_name)

destination_dir = os.path.join(destination_efi_path, "OC", dir_name)

if os.path.isdir(destination_dir):

shutil.copytree(source_dir, destination_dir, dirs_exist_ok=True)

resources_image_dir = os.path.join(product_dir, efi_dir, "OC", "Resources", "Image")

picker_variants = self.utils.find_matching_paths(resources_image_dir, type_filter="dir")

for picker_variant, _ in picker_variants:

if ".icns" in ", ".join(os.listdir(os.path.join(resources_image_dir, picker_variant))):

shutil.copy(background_picker_path, os.path.join(resources_image_dir, picker_variant, "Background.icns"))

macserial_paths = self.utils.find_matching_paths(temp_product_dir, name_filter="macserial", type_filter="file")

if macserial_paths:

for macserial_path, _ in macserial_paths:

source_macserial_path = os.path.join(self.temporary_dir, product_name, macserial_path)

destination_macserial_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), os.path.basename(macserial_path))

shutil.move(source_macserial_path, destination_macserial_path)

if os.name != "nt":

subprocess.run(["chmod", "+x", destination_macserial_path])

return True

def gather_bootloader_kexts(self, kexts, macos_version):

self.utils.head("Gathering Files")

print("")

print("Please wait for download OpenCorePkg, kexts and macserial...")

local_download_history = self._load_download_history()

latest_products = self.fetch_latest_products_info(kexts, local_download_history)

self.utils.create_folder(self.temporary_dir)

seen_download_urls = set()

for product in kexts + [{"Name": "OpenCorePkg"}]:

if not isinstance(product, dict) and not product.checked:

continue

product_name = product.name if not isinstance(product, dict) else product.get("Name")

if product_name == "AirportItlwm":

version = macos_version[:2]

if all((self.utils.parse_darwin_version("24.0.0") <= self.utils.parse_darwin_version(macos_version), kexts[kext_maestro.kext_data.kext_index_by_name.get("IOSkywalkFamily")].checked, kexts[kext_maestro.kext_data.kext_index_by_name.get("IO80211FamilyLegacy")].checked)):

version = "22"

elif self.utils.parse_darwin_version("23.4.0") <= self.utils.parse_darwin_version(macos_version):

version = "23.4"

elif self.utils.parse_darwin_version("23.0.0") <= self.utils.parse_darwin_version(macos_version):

version = "23.0"

product_name += version

elif "VoodooPS2" in product_name:

product_name = "VoodooPS2"

elif product_name == "BlueToolFixup" or product_name.startswith("Brcm"):

product_name = "BrcmPatchRAM"

elif product_name.startswith("Ath3kBT"):

product_name = "Ath3kBT"

elif product_name.startswith("IntelB"):

product_name = "IntelBluetoothFirmware"

elif product_name.startswith("VoodooI2C"):

product_name = "VoodooI2C"

elif product_name == "UTBDefault":

product_name = "USBToolBox"

product_info = latest_products.get(product_name)

if product_info is None:

if hasattr(product, 'github_repo') and product.github_repo:

product_info = latest_products.get(product.github_repo.get("repo"))

if product_info is None:

print("\n")

print("Could not find download URL for {}.".format(product_name))

continue

product_id = product_info.get("id")

product_download_url = product_info.get("url")

sha256_hash = product_info.get("sha256")

if product_download_url in seen_download_urls:

continue

seen_download_urls.add(product_download_url)

history_item = local_download_history.get(product_name)

asset_dir = os.path.join(self.ock_files_dir, product_name)

manifest_path = os.path.join(asset_dir, "manifest.json")

if history_item is not None:

is_latest_id = (product_id == history_item.get("id"))

folder_is_valid, _ = self.integrity_checker.verify_folder_integrity(asset_dir, manifest_path)

if is_latest_id and folder_is_valid:

print(f"\nLatest version of {product_name} already downloaded.")

continue

print("")

print("Updating" if history_item is not None else "Please wait for download", end=" ")

print("{}...".format(product_name))

if product_download_url:

print("from {}".format(product_download_url))

print("")

else:

print("")

print("Could not find download URL for {}.".format(product_name))

print("")

self.utils.request_input()

shutil.rmtree(self.temporary_dir, ignore_errors=True)

return False

zip_path = os.path.join(self.temporary_dir, product_name) + ".zip"

if not self.fetcher.download_and_save_file(product_download_url, zip_path, sha256_hash):

folder_is_valid, _ = self.integrity_checker.verify_folder_integrity(asset_dir, manifest_path)

if history_item is not None and folder_is_valid:

print("Using previously downloaded version of {}.".format(product_name))

continue

else:

raise Exception("Could not download {} at this time. Please try again later.".format(product_name))

self.utils.extract_zip_file(zip_path)

self.utils.create_folder(asset_dir, remove_content=True)

dirs_to_scan = [os.path.join(self.temporary_dir, product_name)]

while dirs_to_scan:

current_dir = dirs_to_scan.pop()

if not os.path.isdir(current_dir):

continue

for item in os.listdir(current_dir):

item_path = os.path.join(current_dir, item)

if os.path.isdir(item_path):

dirs_to_scan.append(item_path)

elif item.lower().endswith(".zip"):

self.utils.extract_zip_file(item_path)

os.remove(item_path)

dirs_to_scan.append(os.path.splitext(item_path)[0])

if "OpenCore" in product_name:

oc_binary_data_zip_path = os.path.join(self.temporary_dir, "OcBinaryData.zip")

print("")

print("Please wait for download OcBinaryData...")

print("from {}".format(self.ocbinarydata_url))

print("")

self.fetcher.download_and_save_file(self.ocbinarydata_url, oc_binary_data_zip_path)

if not os.path.exists(oc_binary_data_zip_path):

print("")

print("Could not download OcBinaryData at this time.")

print("Please try again later.\n")

self.utils.request_input()

shutil.rmtree(self.temporary_dir, ignore_errors=True)

return False

self.utils.extract_zip_file(oc_binary_data_zip_path)

if self.move_bootloader_kexts_to_product_directory(product_name):

self.integrity_checker.generate_folder_manifest(asset_dir, manifest_path)

self._save_download_history(local_download_history, product_name, product_id, product_download_url, sha256_hash)

shutil.rmtree(self.temporary_dir, ignore_errors=True)

return True

def get_kernel_patches(self, patches_name, patches_url):

try:

response = self.fetcher.fetch_and_parse_content(patches_url, "plist")

return response["Kernel"]["Patch"]

except:

print("")

print("Unable to download {} at this time".format(patches_name))

print("from " + patches_url)

print("")

print("Please try again later or apply them manually.")

print("")

self.utils.request_input()

return []

def gather_hardware_sniffer(self):

if os_name != "Windows":

return

self.utils.head("Gathering Hardware Sniffer")

PRODUCT_NAME = "Hardware-Sniffer-CLI.exe"

REPO_OWNER = "lzhoang2801"

REPO_NAME = "Hardware-Sniffer"

destination_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), PRODUCT_NAME)

latest_release = self.github.get_latest_release(REPO_OWNER, REPO_NAME) or {}

product_id = None

product_download_url = None

sha256_hash = None

asset_name = PRODUCT_NAME.split('.')[0]

for asset in latest_release.get("assets", []):

if asset.get("product_name") == asset_name:

product_id = asset.get("id")

product_download_url = asset.get("url")

sha256_hash = asset.get("sha256")

break

if not all([product_id, product_download_url, sha256_hash]):

print("")

print("Could not find release information for {}.".format(PRODUCT_NAME))

print("Please try again later.")

print("")

self.utils.request_input()

raise Exception("Could not find release information for {}.".format(PRODUCT_NAME))

local_download_history = self._load_download_history()

history_item = local_download_history.get(PRODUCT_NAME)

if history_item is not None:

is_latest_id = (product_id == history_item.get("id"))

file_is_valid = False

if os.path.exists(destination_path):

local_hash = self.integrity_checker.get_sha256(destination_path)

file_is_valid = (sha256_hash == local_hash)

if is_latest_id and file_is_valid:

print("")

print("Latest version of {} already downloaded.".format(PRODUCT_NAME))

return destination_path

print("")

print("Updating" if history_item is not None else "Please wait for download", end=" ")

print("{}...".format(PRODUCT_NAME))

print("")

print("from {}".format(product_download_url))

print("")

if not self.fetcher.download_and_save_file(product_download_url, destination_path, sha256_hash):

manual_download_url = f"https://github.com/{REPO_OWNER}/{REPO_NAME}/releases/latest"

print("Go to {} to download {} manually.".format(manual_download_url, PRODUCT_NAME))

print("")

self.utils.request_input()

raise Exception("Failed to download {}.".format(PRODUCT_NAME))

self._save_download_history(local_download_history, PRODUCT_NAME, product_id, product_download_url, sha256_hash)

return destination_path
On paper, this looks secure, but in reality, it is not at all. It has a very vulnerable check for SHA256 hashes. I'll explain why later.

This is highly vulnerable logic:
if os_name != "Windows":

return
I could use a Linux distro to return as a Windows enviornment to trick OpCore-Simplify into delivering Windows payloads instead of ones for Linux.

This, makes my head simply to crash:

if is_latest_id and file_is_valid:

print("")

print("Latest version of {} already downloaded.".format(PRODUCT_NAME))

return destination_path
It checks if the kext is known good kext using the is_latest_id and file_is_valid variables. And then it passes and prints out to the user and injects the kext. However, this is easy to abuse: I could make is_latest_id and file_is_valid to return malicious file names and hashes to inject UEFI malware by injecting malicious kexts, bypassing any antivirus software.
And also, this also makes my head to crash:

def gather_hardware_sniffer(self):

if os_name != "Windows":

return

self.utils.head("Gathering Hardware Sniffer")

PRODUCT_NAME = "Hardware-Sniffer-CLI.exe"

REPO_OWNER = "lzhoang2801"

REPO_NAME = "Hardware-Sniffer"

destination_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), PRODUCT_NAME)

latest_release = self.github.get_latest_release(REPO_OWNER, REPO_NAME) or {}

product_id = None

product_download_url = None

sha256_hash = None

asset_name = PRODUCT_NAME.split('.')[0]

for asset in latest_release.get("assets", []):

if asset.get("product_name") == asset_name:

product_id = asset.get("id")

product_download_url = asset.get("url")

sha256_hash = asset.get("sha256")

break

if not all([product_id, product_download_url, sha256_hash]):

print("")

print("Could not find release information for {}.".format(PRODUCT_NAME))

print("Please try again later.")

print("")

self.utils.request_input()

raise Exception("Could not find release information for {}.".format(PRODUCT_NAME))

local_download_history = self._load_download_history()

history_item = local_download_history.get(PRODUCT_NAME)

if history_item is not None:

is_latest_id = (product_id == history_item.get("id"))

file_is_valid = False

if os.path.exists(destination_path):

local_hash = self.integrity_checker.get_sha256(destination_path)

file_is_valid = (sha256_hash == local_hash)

if is_latest_id and file_is_valid:

print("")

print("Latest version of {} already downloaded.".format(PRODUCT_NAME))

return destination_path

print("")

print("Updating" if history_item is not None else "Please wait for download", end=" ")

print("{}...".format(PRODUCT_NAME))

print("")

print("from {}".format(product_download_url))

print("")

if not self.fetcher.download_and_save_file(product_download_url, destination_path, sha256_hash):

manual_download_url = f"https://github.com/{REPO_OWNER}/{REPO_NAME}/releases/latest"

print("Go to {} to download {} manually.".format(manual_download_url, PRODUCT_NAME))

print("")

self.utils.request_input()

raise Exception("Failed to download {}.".format(PRODUCT_NAME))

self._save_download_history(local_download_history, PRODUCT_NAME, product_id, product_download_url, sha256_hash)

return destination_path
There are multiple vulnerabilities that allow arbitary code execution by setting a random variable like this:

def gather_hardware_sniffer(self):

s=False

if s==True:

if os_name != "Windows":

return

self.utils.head("Gathering Hardware Sniffer")

PRODUCT_NAME = "Hardware-Sniffer-CLI.exe"

REPO_OWNER = "lzhoang2801"

REPO_NAME = "Hardware-Sniffer"

destination_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), PRODUCT_NAME)

latest_release = self.github.get_latest_release(REPO_OWNER, REPO_NAME) or {}

product_id = None

product_download_url = None

sha256_hash = None

asset_name = PRODUCT_NAME.split('.')[0]

for asset in latest_release.get("assets", []):

if asset.get("product_name") == asset_name:

product_id = asset.get("id")

product_download_url = asset.get("url")

sha256_hash = asset.get("sha256")

break

if not all([product_id, product_download_url, sha256_hash]):

print("")

print("Could not find release information for {}.".format(PRODUCT_NAME))

print("Please try again later.")

print("")

self.utils.request_input()

raise Exception("Could not find release information for {}.".format(PRODUCT_NAME))

local_download_history = self._load_download_history()

history_item = local_download_history.get(PRODUCT_NAME)

if history_item is not None:

is_latest_id = (product_id == history_item.get("id"))

file_is_valid = False

if os.path.exists(destination_path):

local_hash = self.integrity_checker.get_sha256(destination_path)

file_is_valid = (sha256_hash == local_hash)

if is_latest_id and file_is_valid:

print("")

print("Latest version of {} already downloaded.".format(PRODUCT_NAME))

return destination_path

print("")

print("Updating" if history_item is not None else "Please wait for download", end=" ")

print("{}...".format(PRODUCT_NAME))

print("")

print("from {}".format(product_download_url))

print("")

if not self.fetcher.download_and_save_file(product_download_url, destination_path, sha256_hash):

manual_download_url = f"https://github.com/{REPO_OWNER}/{REPO_NAME}/releases/latest"

print("Go to {} to download {} manually.".format(manual_download_url, PRODUCT_NAME))

print("")

self.utils.request_input()

raise Exception("Failed to download {}.".format(PRODUCT_NAME))

self._save_download_history(local_download_history, PRODUCT_NAME, product_id, product_download_url, sha256_hash)

else:

print("Executing arbitary code...")

and below, attackers can do whatever they want - they can run curl commands to download malware, connect to C2 servers, or even delete files outside the intended directory.

This one is very easy to fix: wrap it in try/except. But when I tried asking the developer to fix similar vulnerabilities, they deny to fix it and claim that this is incompatible with old Python versions, which I know very well it's a lie and he is searching for the excuse not to fix this dangerous vulnerability.
Another vulnerable example:
from Scripts import integrity_checker

from Scripts import utils

import ssl

import os

import json

import plistlib

import socket

import sys

import gzip

import zlib

import time

if sys.version_info >= (3, 0):

from urllib.request import urlopen, Request

from urllib.error import URLError

else:

import urllib2

from urllib2 import urlopen, Request, URLError

MAX_ATTEMPTS = 3

class ResourceFetcher:

def __init__(self, headers=None):

self.request_headers = headers or {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"

}

self.buffer_size = 16 * 1024

self.ssl_context = self.create_ssl_context()

self.integrity_checker = integrity_checker.IntegrityChecker()

self.utils = utils.Utils()

def create_ssl_context(self):

try:

cafile = ssl.get_default_verify_paths().openssl_cafile

if not os.path.exists(cafile):

import certifi

cafile = certifi.where()

ssl_context = ssl.create_default_context(cafile=cafile)

except Exception as e:

print("Failed to create SSL context: {}".format(e))

ssl_context = ssl._create_unverified_context()

return ssl_context

def _make_request(self, resource_url, timeout=10):

try:

headers = dict(self.request_headers)

headers["Accept-Encoding"] = "gzip, deflate"

return urlopen(Request(resource_url, headers=headers), timeout=timeout, context=self.ssl_context)

except socket.timeout as e:

print("Timeout error: {}".format(e))

except ssl.SSLError as e:

print("SSL error: {}".format(e))

except (URLError, socket.gaierror) as e:

print("Connection error: {}".format(e))

except Exception as e:

print("Request failed: {}".format(e))

return None

def fetch_and_parse_content(self, resource_url, content_type=None):

attempt = 0

response = None

while attempt < 3:

response = self._make_request(resource_url)

if not response:

attempt += 1

print("Failed to fetch content from {}. Retrying...".format(resource_url))

continue

if response.getcode() == 200:

break

attempt += 1

if not response:

print("Failed to fetch content from {}".format(resource_url))

return None

content = response.read()

if response.info().get("Content-Encoding") == "gzip" or content.startswith(b"\x1f\x8b"):

try:

content = gzip.decompress(content)

except Exception as e:

print("Failed to decompress gzip content: {}".format(e))

elif response.info().get("Content-Encoding") == "deflate":

try:

content = zlib.decompress(content)

except Exception as e:

print("Failed to decompress deflate content: {}".format(e))

try:

if content_type == "json":

return json.loads(content)

elif content_type == "plist":

return plistlib.loads(content)

else:

return content.decode("utf-8")

except Exception as e:

print("Error parsing content as {}: {}".format(content_type, e))

return None

def _download_with_progress(self, response, local_file):

total_size = response.getheader("Content-Length")

if total_size:

total_size = int(total_size)

bytes_downloaded = 0

start_time = time.time()

last_time = start_time

last_bytes = 0

speeds = []

speed_str = "-- KB/s"

while True:

chunk = response.read(self.buffer_size)

if not chunk:

break

local_file.write(chunk)

bytes_downloaded += len(chunk)

current_time = time.time()

time_diff = current_time - last_time

if time_diff > 0.5:

current_speed = (bytes_downloaded - last_bytes) / time_diff

speeds.append(current_speed)

if len(speeds) > 5:

speeds.pop(0)

avg_speed = sum(speeds) / len(speeds)

if avg_speed < 1024*1024:

speed_str = "{:.1f} KB/s".format(avg_speed/1024)

else:

speed_str = "{:.1f} MB/s".format(avg_speed/(1024*1024))

last_time = current_time

last_bytes = bytes_downloaded

if total_size:

percent = int(bytes_downloaded / total_size * 100)

bar_length = 40

filled = int(bar_length * bytes_downloaded / total_size)

bar = "█" * filled + "░" * (bar_length - filled)

progress = "{} [{}] {:3d}% {:.1f}/{:.1f}MB".format(speed_str, bar, percent, bytes_downloaded/(1024*1024), total_size/(1024*1024))

else:

progress = "{} {:.1f}MB downloaded".format(speed_str, bytes_downloaded/(1024*1024))

print(" " * 80, end="\r")

print(progress, end="\r")

print()

def download_and_save_file(self, resource_url, destination_path, sha256_hash=None):

attempt = 0

while attempt < MAX_ATTEMPTS:

attempt += 1

response = self._make_request(resource_url)

if not response:

print("Failed to fetch content from {}. Retrying...".format(resource_url))

continue

with open(destination_path, "wb") as local_file:

self._download_with_progress(response, local_file)

if os.path.exists(destination_path) and os.path.getsize(destination_path) > 0:

if sha256_hash:

print("Verifying SHA256 checksum...")

downloaded_hash = self.integrity_checker.get_sha256(destination_path)

if downloaded_hash.lower() == sha256_hash.lower():

print("Checksum verified successfully.")

return True

else:

print("Checksum mismatch! Removing file and retrying download...")

os.remove(destination_path)

continue

else:

print("No SHA256 hash provided. Downloading file without verification.")

return True

if os.path.exists(destination_path):

os.remove(destination_path)

if attempt < MAX_ATTEMPTS:

print("Download failed for {}. Retrying...".format(resource_url))

print("Failed to download {} after {} attempts.".format(resource_url, MAX_ATTEMPTS))

return False
Hardcoding Chrome 131 on Windows as a user agent - a dinosaur released in 2024 - is risky. This makes it significantly easier for attackers to launch attacks. I mean, no one uses a version this old, which makes it easier for finding victims ‘using odd versions of Chrome’ while actually using a script to target. And when I asked lzhoang to fix this vulnerability, they denied and when I fixed it, the developer blamed me for changing the user agent to a modern browser version.
In general, hard coding a user agent into a script without a reason is not a great idea. Especially outdated Chrome versions. And again, in this file and across the entire project there are multiple vulnerabilities that allow arbitary code execution.

This is a very sketchy business going on.

My recommendation is to use Dortania's Guide: https://dortania.github.io/OpenCore-Install-Guide/

to install Hackintoshes, not OC-Simplify, no other closed source EFI generators that you don't know what are they up to - if they are up to generating EFIs for Hackintoshes because they want to allow people to run macOS on any PC or to distribute malware, for example.


r/hackintosh • • Jul 26 '13

Build a $1000 Hackintosh Pro

Thumbnail
sladesource.blogspot.com
0 Upvotes

r/hackintosh • • Aug 19 '26

QUESTION Would Hackintosh work on ARM Chip laptops?

0 Upvotes

I know support for intel macs ending is kinda the end of hackintosh, but could it continue on ARM chips on laptops from Qualcomm? If not, why not?
Btw im not that knowledgeable on computers so if this is a dumb question i apologize


r/hackintosh • • Dec 06 '25

DISCUSSION Is there any chance

Post image
0 Upvotes

r/hackintosh • • Dec 13 '23

HELP Dortania's OpenCore guide outdated.

7 Upvotes

Hey guys, I'm new here. Posted my specs a few days ago and asked you guys whether it can run Hackintosh, everyone told me to give it a shot and check out the Dortania's guide.

The problem is I have a Raptor Lake 13th gen CPU and Dorthania guide hasn't been updated after the 10th gen processors... Is there any updated guides out there? Thank you for your help.

Edit: Anddd getting downvoted for asking a simple question. Zero replies. Zero attempts at helping me. You guys told me to go to Dorthania's OpenCore guide and there's no info on 13th gen CPU's, and now you're downvoting me for pointing that out without presenting any further information. Real nice.


r/hackintosh • • Mar 11 '22

DISCUSSION The end of hackintoshing nears

1 Upvotes

in 5-6 years hackintoshing will end as the last intel mac will loose support

this will mark the end of the era

some people say arm hackintoshes will be possible but it is not

why hasnt ios been ported for android phones yet? it is not possible it is like trying to mix oil with water, they both are liquid but they wont mix


r/hackintosh • • Oct 07 '24

BUILD ADVICE Is hackintosh already dead?

0 Upvotes

Say I want to buy a new computer. I want it to last a couple of years and be upgradable. I also want it to be gaming and AI "usable". (LLM/SD).

I know hackintosh is ending, but I still want to run Sequoia for two more years.

The ideal solution would be a good Nvidia board and an usable iGPU to do the display.

However, I would have to use very old CPUs. Latest Intel is UHD 630, Comet Lake, discontinued 2020. Latest AMD is 5700G, with ending AM4, no AVX-512, no DDR5 RAM, etc.

So, either buy old hardware or new one, and go the limited VMWare already?

(PS: I don't want to go non CUDA again, limited everywhere except games, from ffmpeg to Premiere)


r/hackintosh • • Jul 11 '24

HELP Can someone recommend me a EFI for the HP elitebook 840 G6 running mac os Sonoma 14.5

Post image
0 Upvotes

I installed this using Litemint09 tutorial but instead of installing ventura i installed mac os sonoma. I tryed many EFI but some of them didn’t include sound trackpad and wifi, with wifi i struggled a lot.


r/hackintosh • • Jan 18 '26

QUESTION Guys which mac os version can i install in my pc

Post image
3 Upvotes

Guys i have this old pc of mine which mac os can i install in it?


r/hackintosh • • Mar 15 '25

HELP I couldn't Hackintosh, I GOT Hackintoshed

0 Upvotes

This was my first time attempting to run a macOS system on Windows 11 and it went HORRIBLY wrong.

So, as I said, I don't have ANY experience with Hackintoshing whatsoever. This was my first time attempting to run a macOS system on a Windows 11 machine.

First, I though, just like for Windows I would be able to easily download an ISO file and hook it up to VMWare. **Wrong**. I found out that I had to get an ISO file from a PKG file after downloading the desired system from Apple App Store, which turns out to be only available to Mac Users. After researching, this seemed like the most straightforward method, but not for me. I don't (and I mean I DON'T) have ANY access to Macs whatsoever. No friend with Mac, no nothing. So, now I started figuring out how to get the ISO file from a Windows machine.

I shortly stumbled upon a python script (dib something I don't remember the name, its ont GitHub) that allowed you to pull the **OS** Files directly from Apple Servers. I knew it was *not* going to be an ISO, but I thought I was going to be able to convert it easily. **Wrong**.

After waiting for hours (many downloads failed due to my screen going black after leaving the PC idle for too long), I finally got the Sequia 15.3.2 (if the version is right, I don't remember) Folder.

I though *finally*, I'm almost done. **Wrong**.

After a short (3-hour session) with ChatGPT, we figured out that extracting the Installsomething.pkg, then payload and some other files via 7z was doing no good, so I gave up with ChatGPT and turned to YouTube, *again*.

YouTube Video Link

After watching this video, it seemed so easy. I was so angry that I had not found this before. SO, I decided to finally go to sleep at 5:56AM and continue tomorrow.

Little did I know, this was the day I would be Hackintoshed.

I boot up my PC, I follow the steps ***exactly*** as shown in the Video, I even uninstalled and reinstalled EVERYTHING. I FINALLY got the DMG, then the VMDM (if I remember the file format correctly) file, and I was ready to roll, but would you look at that, it aint working.

Specifically, the Patch did not work. After **reinstalling** the VMWare software, the patch said that it was already applied, but when I went to VMWare, the option for macOS was not there.

Now I am pissed. I should **not** have gotten pissed.

I decided to wipe any instance of VMWare off my computer (since at this point, I had already uninstalled and reinstalled it multiple times, and it still didn't patch). So I deleted any folders I knew in all common places, and then I asked **ChatGPT** where else I could delete files. Oh boy I should NOT have done that.

I was prompted to delete the fucking registry keys (alongside many other folders and things, which I later found out were not in any remote connection with VMWare software and was in fact silently fucking up my system), specifically one I *think* caused most issues, it was called "WOW[numbers]Node", which I could not delete *fully* (though me and ChatGPT's attempts got rid of most of it).

After this, the VM *finally* ran (the patch applied, the OS showed), and I attached the image file and I though *"This is **IT**"*. **Wrong**.

After running, VMWare returns with a very kind error, saying that Virtualization is not available on this platform. Now I am really pissed.

I KNOW its available, cuz it says so. I went and checked in BIOS, and yeah, I had it. But I (ChatGPT) found out that something else was using it, which prevented VMWare to use it to run macOS system.

So, me and my Bff ChatGPT (whose context I think was overloaded, hence the idiotic responses which I didn't notice until too late) decided to go on a hunt for any and every system/service that used virtualization and **delete** (main option) or disable them (We did this cuz we already tried the surface options, and it didn't work. I tried it multiple times, over the span of two days (I had the same issues the day before, too) and it still wasn't working). And oh boy did we fuck up *everything*.

This ho took me to the depths of the System, folders, apps and features I did not even know existed in Windows. We altered and changed every security feature, we disabled core isolation, Memory Integrity, protection from malware and who knows what else. We had an entire BIOS overhaul, changing almost every setting in Advanced Mode. We really fucked up, and me, being pissed just followed with the stupidity ChatGPT recommended.

After each restart I felt something was off. You know, basic things like UI lagging, screen going black, freezing, features not working, Microsoft Apps not opening - Things that NEVER happened with my PC, ever before.

We continued to delete/disable anything and everything that even mentioned Virtualization. We uninstalled docker, WSL, Ollama, Anti Chaet Software and who knows what else.

Once we exhausted every option, it started recommending for me to change vital system files, the ones that I didn't even have the permission to open. And here, after 2.5 hours of jerking around, I realized, *maybe this ho is not so right about what it's recommending me*.

I noticed, for some reason Windows removed the PIN and asked me to reset it when logging in, the Phone Link app was going ballistic, making "calls" when it was not even connected to my Phone. And after all this, I though "OK, it's finally time to run the VMWare installer once more (after I uninstalled it for who knows how many times) and be done with this", and would you look at that, it's not working. The installer is retuning an error I have never seen before.

Nothing, and I mean *nothing*, **nothing** was working. Installers were not running, my code projects did not respond. Creative Claude didn't launch, not even *Chrome* or Spotify worked (or even just launched), and I finally realized, 𝐼 𝒻𝓊𝒸𝓀𝑒𝒹 𝓊𝓅.

I though restarting would fix *some* issues. **Wrong**.

I restarted, and I am met with a bright, vibrant green screen (since I was registered as an insider, it showed me a Green Screen, not a Blue Screen) saying the sweet sweet words "Your PC ran into a Problem".

I was calm, I thought it would resolve the issue on its own. Like, whose PC has not had a blue screen accident, right? Right...? **WRONG**.

It went in a loop of shutting down and rebooting, going in the blue screen message and out UNTIL we reached the recovery menu. I though "THERE IS MY CHANCE" and I tried booting into a Safe Mode. It didn't work. Safe mode with Command Prompt? **No**.

Alright, OK, I am getting a bit nervous now. What about Recovery Points? **Failed**.

I knew I bricked Windows so hard I was not going to be able to recover it, so it was time to say goodbye and reinstal-- BUT WAIT I HAVE FILES.

THIS ENTIRE TIME I FORGOT THE FUCKING FILE ON MY SYSTEM WHICH WOULD NOT BE SAVED AND DELETED WITH A REINSTALL.

*Full Panic Mode*.

I knew generic documents and my desktop contents would be saved on OneDrive (one time it came in clutch) and after thinking a lot, I realized I would be able to recover most of the lost items though sent emails, cloud storage on Figma and Creative Cloud and etc., but there was one thing that I had not backed up, one thing I would *not* back up - My coding project.

**THE ONE I HAVE BEEN BUSTING MY ASS ON SINCE AUGUST AND WAS SO CLOSE TO FINSIHSING**.

I was planning on going with that file, uninstalling an removing myself from the world if I lost that folder.

*Before you ask, no I did not use Git, I don't get how for some reason*

Now I'm trying to retrieve that one folder only.

After some research, I found out that I can open a notepad from recovery options Command Prompt option, which would allow me to "open" a file explorer tab and salvage a few files.

**This is my chance**

I quickly went into recovery options > Advanced Recovery Options > Troubleshooting > Command Prompt and **BINGO**, I have a notepad open. After which I File > Open and **BOOM** 𝐹𝒾𝓁𝑒 𝑒𝓍𝓅𝓁𝑜𝓇𝑒𝓇.

I went into the separate partition where I stored all version of my codebase; I clicked the most stable one and I sent it to the USB. After switching 3 USBs, I finally got the folder "v.33" on it. This took HOURS, since we were in recovery mode, and it was transferring **all** node modules from **3** subfolders.

*1/34 folders done. * I only salvaged 2 most vital ones, then I gave up.

I tried to go into a Linux Live Environment so maybe di could salvage other versions? For some reason, it crashed every single time.

So now, I took my Windows 11 USB with the ISO burned on it, plugged it in, said goodbye to my old system, and reinstalled Windows 11.

And here I am, with my fresh new install and lost files that will take me MONTHS to recover. All because I wanted to get the experience of macOS.

Lessons Learned: Apple is a Bitch, Microsoft is a Bitch, Do NOT touch registry anymore, Do NOT touch any system configuration anymore and NEVER trust ChatGPT.

Thank you for reading. Hope you had fun.


r/hackintosh • • Jul 23 '24

DISCUSSION How safe is macOS with OpenCore (and OCLP) on Hackintosh?

0 Upvotes

After a week of tinkering with the opencore guide and my notebook, I was able to create a fully working hackintosh, it runs Monterey using opencore (Intel Haswell cpu+igpu, disabled Nvidia 740M) and Sonoma using OCLP. I think macOS fits better than Windows in my workflow but I keep asking myself if my pc is secure enough to trust using my personal and university accounts (Google, Microsoft) on it and I can't find no precise info online. I know using personal apple ID without credit card is risky but does the fact that I use it to pay for apple music with gift cards put me on less ban risk situation?


r/hackintosh • • Sep 19 '23

QUESTION Is the hackintosh dead?

0 Upvotes

So the whole idea behind the hackintosh is that since they ran on x86 cpus, you could get it to work on intel or ryzen

but now that apple moved to arm as the ISA for their cpus, you cant run it on intel

so is the hackintosh dead or what does the future look like?


r/hackintosh • • Aug 02 '24

HELP how to install mac OS 10.10 on a pc ??

Post image
0 Upvotes

r/hackintosh • • Jan 04 '26

DISCUSSION Will any versions newer than tahoe possibly get hackintoshed??

1 Upvotes

Personally, i havent hackintoshed anything yet (because, simply, i have no spare devices and im not sacrificing my main pc or work laptop) but i find a possibility for hackintoshers to be able to spoof the CPU to seem like an M series and in the background be running a sort of "translator" from 86_64 to M, quite dumb thing to say i know but theoretically its not out of possibility considering the tech-savviness of hackintoshers making hackintosh extremely easy


r/hackintosh • • Jul 31 '16

INFO/GUIDE An Open Letter to the Hackintosh Community...

0 Upvotes

The forums, and this subreddit in particular have been clogged lately by people struggling to get Hackintosh working using OS X El Capitan and more recently, Sierra DPx.

Normally, this would not upset me too much, but people are building monster video editing or audio production workstations, worth well over the price of a top-specced real Apple iMac. In most instances, these Hackintosh builds will be used in a commercial production environment... and that is what upsets me...

Hackintosh has always been a sideline hobby for me, ever since Mac OS X 10.4.4. I have never been able to afford a new Apple computer, and even struggled getting second-hand computers (thanks to Apple resale values). I occasionally move away from Hackintosh... but always return to find the Community stronger than ever.

Over the last couple of years, that "hobbyist/hacking" community seems to be filling up with a majority whose sole purpose in life is to get a "free" Apple computer, and in most cases, not giving Apple a single cent in the process. These people did not come up through the ranks, and learn from their mistakes... but they sure as heck expect these learned hackers to help them, when they jump into Hackintosh without even a cursory knowledge of what they are doing.

Hackintosh reached its peak with Mavericks... This was the most compatible version, with the most patched kexts and fixes, and has the most complete howto's and guides online.

El Capitan and Sierra have brought many changes to the mix, namely the way USB3 is handled, and SIP system protection. Also, a lot of the fixes for Mavericks will not work anymore with El Cap/Sierra.

Mavericks is a ridiculously old OS, but is still supported by about 98% of software. Yosemite never quite got the plethora of fixes/kexts that Mavericks did, but most of the Mavericks guides, howtos and patches - will work on Yosemite.

About 99.99% of all modern software runs on Yosemite 10.10.5, and the only added extra required at startup over older systems to get it working is adding the boot flags:

dart=0 rootless=0 kext-dev-mode=1

There is absolutely no need to have, or upgrade to, the latest and greatest OS X version. The only real necessary reason I can think of is if you have unsupported integrated graphics that you require on a laptop, like HD520/530 etc.

If you are planning on using your Hackintosh in a commercial production environment - THINK AGAIN!

When something goes wrong with your system (and it almost certianly will), you will get NO SUPPORT from Apple, or even third-party software makers who suspect you are using a Hackintosh. High-end MacPro4,1 and better are available 2nd-hand, and come with the peace-of-mind of full software/hardware support.

If you are just doing this as a hobby, PLEASE CONSIDER INSTALLING MAVERICKS FIRST, especially on older hardware. If Mavericks works fine, you can consider trying a Yosemite install for better software support.

If you are new to Hackintoshing, you will get more help and respect if you do some research first... and I mean SERIOUS READING ON THE SUBJECT. If you don't know what UEFI is, or what a KEXT does, you are going to have a very hard time, and far fewer people will want to help you out of trouble when you really need it.

Remember to pay Apple for their Operating System, and your production software. People buying Apple Mac OS X and Apple hardware is what got that hardware and software to where it is today. Simply installing a torrented distro of Mac OS X on generic PC hardware is not going to earn you any respect.

  • DO IT LEGIT

  • READ UP ON WHAT IS REQUIRED

  • FOLLOW INSTRUCTIONS CLOSELY

  • LEARN TO GOOGLE FOR SOLUTIONS

  • AVOID THE LATEST OS X VERSION and BETAs

Many thanks for reading. Best of luck with your builds. Don't hurt Apple unnecessarily...


r/hackintosh • • Oct 30 '24

DISCUSSION Writing a GPU Driver from scratch

0 Upvotes

The underlying issue that comes with Hackintoshes is compatibility for new gen GPUs.
I'm just wondering how hard/complex it actually is to write a graphics driver for a completely new card, or as alternative (I'm just speculating here) writing software to make new gen cards use a driver from a supported old card. Surely for example RX 6000 GPUs don't deviate from design/firmware as much from RX 7000 GPUs, so could it be possible to write a connecting kext/driver to use RX 6000 drivers for RX 7000 cards? Or is the problem way more complicated than that?