小熊只是搬运工,具体可以看一下这里:https://github.com/KhaosT/tb3-enabler 小熊手中有个HP的雷电扩展,接到苹果本本上能识别但是不能使用,找了下面的教程,方便有碰到此类问题的朋友。
最新的破解包也可以在小熊的网站下载:tb3-enabler-master
10.3.4的破解刚出,苹果官网就有了10.3.5的升级,大家更新时注意一下版本,版本不一样,是用不了的。
2018年4月28号,习惯性刷新,发现Github已更新10.3.4的支持,但昨天苹果刚推了新补丁,不清楚能不能用,小熊一会试一下—–测试后发现不打2018-001补丁10.3.4可以完美运行,打补丁后,用不了,注意。。
打了补丁后的MD5码为:e64e2678bb38f6f60d3a9647c5d53eb6
这阵子小熊在外面自驾,有网友和我说,github现在更新了,有最新版的了,因小熊在外自驾,暂没有条件测试,去github看了一下,确实有更新了支持最新了 e64e2678bb38f6f60d3a9647c5d53eb6 支持图片如下:
发现实际就是添加了二行MD5码的支持,小熊不清楚e64e2678bb38f6f60d3a9647c5d53eb6的对应密码是多少,不然也会更新了,实际就是一个MD5码对应KEY的问题。
从最下面的代码中可以看到,原来10.3.4没有打补丁前的md5=f2ed59d381f83c61ad0ec835364b2b79已填加到程序中了,可惜苹果的更新速度太快,昨天已更新了2018-001号补丁,MD5码变成了e64e2678bb38f6f60d3a9647c5d53eb6
注意:这个暂时只支持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
TB3使能器
瑞恩Govostes想出了一个更好的解决方案。Thunderbolt3UnblockerIOThunderboltFamily在运行时使用单独的kext并覆盖。这种方法更好,因为每次有macOS更新时,您都不需要手动重新应用二进制补丁。
由于不明原因,Apple决定在macOS下阻止对某些Thunderbolt 3外围设备的支持,当您连接Thunderbolt 3外设时,您只需在Thunderbolt Device Tree下获得“不支持”的消息。经过深入研究发现,该模块是在软件级别实现的,并且可以通过修补相关的kext来绕过该模块。此修补程序修改IOThunderboltFamily并允许“不受支持”的Thunderbolt 3外设在macOS Sierra下工作。
要先禁用系统完整性保护,电脑开机,按住⌘ R 在终端中输入:csrutil disable 解除完成
英文原文:
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
重启就可以使用了。
也可以这样,在终端输入:chmod +x 拖破解文件tb3-enabler.py拖到终端里 回车 再输入:sudo 拖破解文件tb3-enabler.py拖到终端里 再打上apply 回车,输入密码回车 也可以,因小熊测试时两种方法全用过。下面的图片是小熊的10.3.4下的截图做的教程,可以看到显示MD5码 错误。
可用的参数
不带任何参数运行以查看快速提醒。以下是关于实际完成情况的更广泛的内容:
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缓存被清除。
另转一个老外写的教程,下面是小熊的机器加小熊人工翻译,想看一下原文的可以看一下这里: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设备被识别为不受支持的设备。
第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文件夹中。
第4步: 给脚本执行权限。
打开一个终端窗口并输入以下内容:
chmod +x
在 x 之后放置一个空格,然后将tb3-enabler.py文件从Downloads文件夹拖到终端窗口,以将路径复制到文件。按下键盘上的回车键为脚本执行权限。
第5步:运行tb3-enabler脚本。
在相同的终端窗口中,键入以下内容:
sudo
在sudo之后放置一个空格,然后将tb3-enabler.py文件拖放到“终端”窗口以将路径复制到文件。空格键应用后 ,按下键盘上的Return回车键。系统会要求您输入您的Mac用户帐户密码。输入您的密码并按键盘上的Return回车键。
第6步:重新启动Mac
脚本完成运行后,重新启动Mac。
第7步:验证连接的Thunderbolt 3设备。
重新启动后,单击菜单栏中的苹果(),按住选项(⌥)键,然后单击系统信息。在硬件部分下单击Thunderbolt,并确保已连接的Thunderbolt 3设备被识别为支持的设备,而不是不支持的设备。
如何删除TB3 Enabler 破解程序
如果你想删除该修补程序,只需重复步骤4,但替换应用与恢复。之后,重复步骤1并将禁用替换为启用。
使用此方法启用不受支持的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端口。
我使用这个扩展坞底座时遇到的最大的不便之处在于,它通过Thunderbolt 3连接MacBook Pro时仅提供15W的电力。StarTech的文档说该底座完全支持USB Power Deliver 2.0,可提供高达100W的但显然它将MacBook Pro视为USB配件,而不是电脑。这可能是StarTech可以通过固件更新修复的问题,但是谁又会说如果这种情况发生,考虑到设备在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)"],
"f2ed59d381f83c61ad0ec835364b2b79": ["10.13.4 (17E199)"],
}
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",
"f2ed59d381f83c61ad0ec835364b2b79": "9591b6f618d5d6ecc016488bc29e2b9f",
}
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)
从上文中可以看到,原来10.3.4没有打补丁前的MD5已填加到程序中了,可惜苹果的更新速度太快,昨天已更新了2018-001号补丁,MD5码变成了e64e2678bb38f6f60d3a9647c5d53eb6