破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

小熊只是搬运工,具体可以看一下这里:https://github.com/KhaosT/tb3-enabler 小熊手中有个HP的雷电扩展,接到苹果本本上能识别但是不能使用,找了下面的教程,方便有碰到此类问题的朋友。

注意:这个暂时只支持10.12.1-10.13.3版本。。小熊的电脑已升级到了10.13.4测试不支持(下面的很多图片全是在10.13.4下截取),通过时间胶囊降到10.13.3工作正常,有时间小熊修改一下,或大家修改一下,应是把10.13.4的MD5码加上就可以,欢迎大家交流拍砖。

10.13.4的Md5码:md5=f2ed59d381f83c61ad0ec835364b2b79

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

TB3使能器

瑞恩Govostes想出了一个更好的解决方案。Thunderbolt3UnblockerIOThunderboltFamily在运行时使用单独的kext并覆盖。这种方法更好,因为每次有macOS更新时,您都不需要手动重新应用二进制补丁

由于不明原因,Apple决定在macOS下阻止对某些Thunderbolt 3外围设备的支持,当您连接Thunderbolt 3外设时,您只需在Thunderbolt Device Tree下获得“不支持”的消息。经过深入研究发现,该模块是在软件级别实现的,并且可以通过修补相关的kext来绕过该模块。此修补程序修改IOThunderboltFamily并允许“不受支持”的Thunderbolt 3外设在macOS Sierra下工作。

要先禁用系统完整性保护,电脑开机,按住⌘ R 在终端中输入:csrutil disable 解除完成

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

英文原文:
System Integrity Protection can be configured using the csrutil(1) command.

You can check whether System Integrity Protection is currently enabled on your system by running the following command in the Terminal:

$ csrutil status
System Integrity Protection status: enabled.
To enable or disable System Integrity Protection, you must boot to Recovery OS and run the csrutil(1) command from the Terminal.

Boot to Recovery OS by restarting your machine and holding down the Command and R keys at startup.
Launch Terminal from the Utilities menu.
Enter the following command:
$ csrutil enable

After enabling or disabling System Integrity Protection on a machine, a reboot is required.

重启电脑,从终端运行脚本: 拖破解文件tb3-enabler.py拖到终端里,再打上个 apply 回车 

英文原文:
Run the script from Terminal      tb3-enabler.py apply    Reboot

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

重启就可以使用了。

也可以这样,在终端输入:chmod x 拖破解文件tb3-enabler.py拖到终端里 回车 再输入:sudo 拖破解文件tb3-enabler.py拖到终端里 再打上apply 回车,输入密码回车  也可以,因小熊测试时两种方法全用过。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

可用的参数
不带任何参数运行以查看快速提醒。以下是关于实际完成情况的更广泛的内容:

apply         the patch, after making sure we know the file we\’re applying to, backing it up only if it\’s the original one, and subsequently checking if the  patch applied correctly.
restore       restores from the previously made backup.
status        shows current situation, including status of the file  and   whether a backup is available.

在改变成功的任何情况下,kext缓存被清除。

破解包也可以在小熊的网站下载:tb3-enabler-master

另转一个老外写的教程,下面是小熊的机器加小熊人工翻译,想看一下原文的可以看一下这里:https://9to5mac.com/2016/11/21/tb3-enabler-enable-unsupported-thunderbolt-3-devices-hack-macbook-pro/

第1步:  确认您的Thunderbolt 3设备不受macOS支持。

使用Thunderbolt 3电缆将启用Thunderbolt 3的设备连接到MacBook Pro。确保您使用的是正确的Thunderbolt 3电缆,而不是通用的USB-C电缆。两款接口外观一样,但还是有区别的。

单击菜单栏中的苹果(),按住选项(⌥)键,然后单击系统信息。单击“硬件”部分下的Thunderbolt,并确保已连接的Thunderbolt 3设备被识别为不受支持的设备。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

第2步:禁用系统完整性保护。

要成功运行此脚本,您需要禁用SIP。为此,请重新启动您的Mac,并在启动时按住Command(⌘)加  R.一旦您到达系统恢复菜单,请单击菜单栏中的Utilities,然后选择Terminal终端。

在终端窗口中,键入以下内容并按键盘上的Return回车键:

csrutil disable

如果成功,请正常重新启动Mac。

第3步: 使用Safari下载TB3启用码脚本。

您可以在KhaosT的GitHub页面找到TB3启用器。单击tb3-enabler.py的链接并右键单击Raw按钮并选择Download Linked File。如果使用默认的Safari设置,脚本文件应该保存到您的Downloads文件夹中。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

第4步: 给脚本执行权限。

打开一个终端窗口并输入以下内容:

chmod x

在 x 之后放置一个空格,然后将tb3-enabler.py文件从Downloads文件夹拖到终端窗口,以将路径复制到文件。按下键盘上的回车键为脚本执行权限。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

第5步:运行tb3-enabler脚本。

在相同的终端窗口中,键入以下内容:

sudo

在sudo之后放置一个空格,然后将tb3-enabler.py文件拖放到“终端”窗口以将路径复制到文件。空格键应用后 ,按下键盘上的Return回车键。系统会要求您输入您的Mac用户帐户密码。输入您的密码并按键盘上的Return回车键。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

第6步:重新启动Mac

脚本完成运行后,重新启动Mac。

第7步:验证连接的Thunderbolt 3设备。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

重新启动后,单击菜单栏中的苹果(),按住选项(⌥)键,然后单击系统信息。在硬件部分下单击Thunderbolt,并确保已连接的Thunderbolt 3设备被识别为支持的设备,而不是不支持的设备。

如何删除TB3 Enabler 破解程序

如果你想删除该修补程序,只需重复步骤4,但替换应用恢复。之后,重复步骤1并将禁用替换为启用

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

使用此方法启用不受支持的Thunderbolt 3设备的主要缺点是您必须禁用系统完整性保护,并且它(仅限此文章)适用于最新的公共可用版本的macOS。为了测试这个,我必须将我的macOS安装从12.10.2 beta恢复到12.10.1。

StarTech Thunderbolt 3扩展坞

StarTech的人们在一个月前寄给了我这个扩展坞,预计MacBook Pro会采用Thunderbolt 3.不幸的是,这个码头被标记为仅限于Windows,并且在连接到我的Mac时显示为不受支持。

当我遇到这种破解方法时,我实际上正在将扩展坞退回StarTech,我很高兴我还没有归还它,因为这样我才可以验证它是否有效。

我喜欢这个扩展坞的主要原因是它是一个真正的Thunderbolt 3码头,这意味着它支持完整的Thunderbolt 3带宽。我能够通过基座上的DisplayPort连接连接到我的4K显示器,并以60Hz获得完整的4K支持。

如果您有带Thunderbolt 3端口的显示器,StarTech表示您可以使用此底座连接到多台4K显示器,但我尚未测试该功能。

除了显示输出功能外,底座还具有两个USB-A端口,一个用于连接USB-C设备的额外5Gbps USB-C端口,千兆以太网和一对用于耳机和麦克风的3.5mm端口。

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

我使用这个扩展坞底座时遇到的最大的不便之处在于,它通过Thunderbolt 3连接MacBook Pro时仅提供15W的电力。StarTech的文档说该底座完全支持USB Power Deliver 2.0,可提供高达100W的但显然它将MacBook Pro视为USB配件,而不是电脑。这可能是StarTech可以通过固件更新修复的问题,但是谁又会说如果这种情况发生,考虑到设备在Mac上不受支持而不利用破解技术?

破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用

不用说,假设StarTech不急于解决这个问题,缺乏足够的充电电力是使用这个码头的一个主要缺点。当然,你可以选择连接你的MacBook Pro的充电器,但这种做法会打破单电缆解决方案底座的目的。

尽管有这些警告,但我知道你们中的一些人会希望使用此底座,以便能够以60 Hz连接4K(和5K)显示器。我绝对不能直接推荐它,因为它的局限性和你必须跳过的环节,但是能够打开本质上是纸镇的东西真的很棒(对于Mac用户来说,它在Windows机器上甚至在bootcamp)变成有用的东西。

#!/usr/bin/env python

# Modified based on Loic Nageleisen\'s trim_patcher
# https://github.com/lloeki/trim_patcher/

from __future__ import print_function
import os
import sys
import re
import hashlib
import shutil
from subprocess import Popen, PIPE
import shlex

ORIGINAL = \'original\'
PATCHED = \'patched\'

target = ("/System/Library/Extensions/IOThunderboltFamily.kext/"
          "Contents/MacOS/IOThunderboltFamily")
backup = "%s.original" % target

md5_version = {
    "00e2f0eb5db157462a83e4de50583e33": ["10.12.1 (16B2659)"],
    "ebde660af1f51dc7482551e8d07c62fd": ["10.12.2 (16C67)"],
    "7fbc510cf91676739d638e1319d44e0e": ["10.12.3 (16D32)"],
    "33ff6f5326eba100d4e7c490f9bbf91e": ["10.12.4 (16E195)"],
    "58703942f8d4e5d499673c42cab0c923": ["10.12.5 (16F73)"],
    "8ef3cf6dd8528976717e239aa8b20129": ["10.12.6 (16G29)"],
    "9d6788e5afe3369cac79546a66f34842": ["10.12.6 (16G1036)"],
    "096de0ab3c312a2e432e056d398a096b": ["10.12.6 (16G1114)"],
    "cb95148ca3508790d6bdad38da79c649": ["10.12.6 (16G1212)"],
    "b58ba765f901b3b6f2fac39c2040e523": ["10.13.0 (17A365)"],
    "bcb319c05541da0ccffd7a52da7236c5": ["10.13.1 (17B48)"],
    "427b87e16e15c55c687a565fbd555e03": ["10.13.2 (17C88)"],
    "a47a724fdb13df4cef1b662b7ccbc9d1": ["10.13.3 (17D47)"]
}
md5_patch = {
    "00e2f0eb5db157462a83e4de50583e33": "a6c2143c2f085c2c104369d7a1adfe03",
    "ebde660af1f51dc7482551e8d07c62fd": "2ebb68137da4a1cb0dfc6e6f05be3db2",
    "7fbc510cf91676739d638e1319d44e0e": "0af475c26cdf5e26f8fd7e4341dadea5",
    "33ff6f5326eba100d4e7c490f9bbf91e": "9237f013ab92f7eb5913bd142abf5fae",
    "58703942f8d4e5d499673c42cab0c923": "86c40c5b6cadcfe56f7a7a1e1d554dc9",
    "8ef3cf6dd8528976717e239aa8b20129": "bc84c36d884178d6e743cd11a8a22e93",
    "9d6788e5afe3369cac79546a66f34842": "f1b280854306616dafb54b679c13e58e",
    "096de0ab3c312a2e432e056d398a096b": "52f6d17ef3fb3a0a899c0ea6a255afc9  ",
    "cb95148ca3508790d6bdad38da79c649": "f685774227156630f26a7448c886151b",
    "b58ba765f901b3b6f2fac39c2040e523": "06a1a1fedc294b1bb78bc92625e412e1",
    "bcb319c05541da0ccffd7a52da7236c5": "d0ae8daed7faccb8107f7b17772163b8",
    "427b87e16e15c55c687a565fbd555e03": "d5c12e6f04d87d5b5a8ceef42cd36531",
    "a47a724fdb13df4cef1b662b7ccbc9d1": "bcf9f00b8028bd305176816563ab2c00"
}
md5_patch_r = dict((v, k) for k, v in md5_patch.items())

re_index = [
    {
        \'search\': "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x38\x01",
        \'replace\': "\x55\x48\x89\xE5\x31\xC0\x5D\xC3\x41\x55\x41\x54\x53\x48\x81\xEC\x38\x01"
    },
    {
        \'search\': "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x28\x01",
        \'replace\': "\x55\x48\x89\xE5\x31\xC0\x5D\xC3\x41\x55\x41\x54\x53\x48\x81\xEC\x28\x01"
    }
]
re_md5 = {
    0: [
        "00e2f0eb5db157462a83e4de50583e33",
        "ebde660af1f51dc7482551e8d07c62fd",
        "7fbc510cf91676739d638e1319d44e0e",
        "33ff6f5326eba100d4e7c490f9bbf91e",
        "58703942f8d4e5d499673c42cab0c923",
        "8ef3cf6dd8528976717e239aa8b20129",
        "9d6788e5afe3369cac79546a66f34842",
        "096de0ab3c312a2e432e056d398a096b",
        "cb95148ca3508790d6bdad38da79c649"
        ],
    1: [
        "b58ba765f901b3b6f2fac39c2040e523",
        "bcb319c05541da0ccffd7a52da7236c5",
        "427b87e16e15c55c687a565fbd555e03",
        "a47a724fdb13df4cef1b662b7ccbc9d1"
        ]
}
md5_re = dict((v, re_index[k]) for k, l in re_md5.items() for v in l)


def md5(filename):
    h = hashlib.md5()
    with open(filename, \'rb\') as f:
        for chunk in iter(lambda: f.read(8192), b\'\'):
            h.update(chunk)
    return h.hexdigest()


def backquote(command):
    return Popen(shlex.split(command), stdout=PIPE).communicate()[0]

def check_SIP():
    sip_info = backquote("nvram csr-active-config")
    if sip_info.find("%00%00%00") == -1:
        print("you must disable System Integrity Protection",file=sys.stderr)
        sys.exit(1)

def check_rootness():
    if os.geteuid() != 0:
        print("you must be root",file=sys.stderr)
        sys.exit(1)


def clear_kext_cache():
    print( "clearing kext cache...",end="")
    backquote("kextcache -system-prelinked-kernel")
    backquote("kextcache -system-caches")
    print("done")


class UnknownFile(Exception):
    def __init__(self, md5=None):
        self.md5 = md5


class NoBackup(Exception):
    pass


def target_status():
    h = md5(target)
    try:
        return (ORIGINAL, md5_version[h])
    except KeyError:
        pass
    try:
        return (PATCHED, md5_version[md5_patch_r[h]])
    except KeyError:
        pass
    raise UnknownFile(h)


def backup_status():
    if not os.path.exists(backup):
        raise NoBackup
    h = md5(backup)
    try:
        return (ORIGINAL, md5_version[h])
    except KeyError:
        pass
    try:
        return (PATCHED, md5_version[md5_patch_r[h]])
    except KeyError:
        pass
    raise UnknownFile(h)


def apply_patch():
    h = md5(target)
    search_re = md5_re[h][\'search\']
    replace_re = md5_re[h][\'replace\']
    with open(target, \'rb\') as f:
        source_data = f.read()
    patched_data = source_data.replace(search_re, replace_re)
    with open(target, \'wb\') as out:
        out.write(patched_data)


def perform_backup():
    shutil.copyfile(target, backup)

def do_backup():
    check_rootness()
    check_SIP()
    try:
        s, t = target_status()
        if s == PATCHED:
            print("already patched, won\'t backup")
            sys.exit(1)
        else:
            try:
                _, v = backup_status()
            except NoBackup:
                print( "backing up...",end="")
                perform_backup()
                print( "done")
            else:
                if v == t:
                    print("backup found")
                else:
                    print("backing up...",end="")
                    perform_backup()
                    print("done")
    except UnknownFile as e:
        print( "unknown file, won\'t backup (md5=%s)" % e.md5)
        sys.exit(1)


def do_restore():
    check_rootness()
    check_SIP()
    print("restoring...",end="")
    backup_status()
    shutil.copyfile(backup, target)
    print("done")
    clear_kext_cache()


def do_apply():
    check_rootness()
    check_SIP()
    do_backup()
    try:
        s, v = target_status()
        if s == PATCHED:
            print("already patched")
            sys.exit()
    except UnknownFile as e:
        print("unknown file: won\'t patch (md5=%s)" % e.md5)
        sys.exit(1)

    print("patching...",end="")
    apply_patch()

    try:
        s, v = target_status()
        if s != PATCHED:
            print("no change made")
        else:
            print("done")
            clear_kext_cache()
    except UnknownFile as e:
        print("failed (md5=%s), " % e.md5,end="")
        do_restore()

def do_force_apply():
    check_rootness()
    check_SIP()
    if os.path.exists(backup):
        print("backup already exists. won\'t patch. Please remove the backup from %s and try again." % backup, end="")
        sys.exit(1)
    h = md5(target)
    print("original md5=%s " % h, end="")
    perform_backup()
    with open(target, \'rb\') as f:
        source_data = f.read()

    search_re1012 =  "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x38\x01"
    replace_re1012 = "\x55\x48\x89\xE5\x31\xC0\x5D\xC3\x41\x55\x41\x54\x53\x48\x81\xEC\x38\x01"

    search_re1013 =  "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x28\x01"
    replace_re1013 = "\x55\x48\x89\xE5\x31\xC0\x5D\xC3\x41\x55\x41\x54\x53\x48\x81\xEC\x28\x01"

    for replace in [replace_re1012, replace_re1013]:
        if (source_data.find(replace) != -1):
            print ("Looks like file is already patched, aborting")
            sys.exit(1)

    if (source_data.find(search_re1012) != -1):
        patched_data = source_data.replace(search_re1012, replace_re1012)
    else:
        print ("Could not location to  patch for 10.12, trying for 10.13")
        if (source_data.find(search_re1013) != -1):
            patched_data = source_data.replace(search_re1013, replace_re1013)
        else:
            print ("10.13 also not found, exiting")
            sys.exit(1)

    with open(target, \'wb\') as out:
        out.write(patched_data)
    h = md5(target)
    print("done, patched md5=%s" % h, end="")
    clear_kext_cache()

def do_status():
    try:
        print("target:",end="")
        s, v = target_status()
        print( s \',\', \' or \'.join(v))
    except UnknownFile as e:
        print( "unknown (md5=%s)" % e.md5)

    try:
        print("backup:",end="")
        s, v = backup_status()
        print( s \',\', \' or \'.join(v))
    except NoBackup:
        print( "none")
    except UnknownFile as e:
        print( "unknown (md5=%s)" % e.md5)


def do_diff():
    try:
        backup_status()
    except NoBackup:
        print("no backup")
    else:
        command = ("bash -c "
                   "\'diff <(xxd \"%s\") <(xxd \"%s\")\'" % (backup, target))
        print(os.system(command))


commands = {
    \'status\': do_status,
    \'backup\': do_backup,
    \'apply\': do_apply,
    \'restore\': do_restore,
    \'diff\': do_diff,
    \'forceApply\': do_force_apply,
}

try:
    function = commands[sys.argv[1]]
    function()
except IndexError:
    print("no command provided",file=sys.stderr)
    print("list of commands: %s" % \', \'.join(commands.keys()),file=sys.stderr)
    sys.exit(1)
except KeyError:
    print ("unknown command",file=sys.stderr)
    sys.exit(1)
  
本文属小熊原创,转载请注明来自:青州小熊 » 破解MacOS上为雷雳 雷电Thunderbolt 3启用不受支持的外围设备 让Dell TB15 TB16 惠普 hp hstnn-cx01 扩展在Mac系统下使用
微信公众号:青州小熊真品店
关注小熊服务号,小熊第一时间更新到货,分享更多好玩的东西。
17768人已关注
赞(0)

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
QQ
  • 青州小熊 点击这里给我发消息
  • 小熊仓库 点击这里给我发消息
  • 中通查件 点击这里给我发消息
旺旺
  • 青州小熊 点这里给我发消息
  • 小熊仓库 点这里给我发消息
邮箱
  • 青州小熊
QQ群
  • 熊店产品交流群 熊店产品交流群
微信号
  • 扫一扫,加入小熊的微信公众号