在我的回音壁上启用 Google Cast

Lobsters Hottest 新闻

摘要

一篇技术博客详细描述了作者如何为 Samsung Q800A 回音壁进行逆向工程并启用 Google Cast 支持:通过拆除 eMMC 芯片读取加密固件、分析 Samsung 自有的 sdb 调试桥和 HyperUART 通信机制,最终找到通过 WAM 协议激活该功能的方法。

<p><a href="https://lobste.rs/s/uyobll/getting_google_cast_on_my_soundbar">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/10/30 21:16

# 让我的回音壁支持 Google Cast 来源:https://codon.org.uk/~mjg59/blog/p/getting-google-cast-on-my-soundbar/ 我有一台 Samsung Q800A 回音壁。它出厂内置了对 Apple AirPlay 协议的支持,但我并不是一个果粉,所以这个功能对我一直没什么用。于是,我接了一个 Chromecast Audio 到它的 TOSLINK 接口上,效果还不错——只不过有个问题:没有办法显式选择 TOSLINK 作为音频输入源。取而代之的是一个"Digital In"(数字输入)选项,它同时对应光纤输入和来自电视的 eARC 输入。这本身不是什么大问题,毕竟我不太可能一边听音乐一边看电视,但我的电视是 Samsung The Frame(画壁电视),这台设备的设定就是在有人靠近时展示艺术品,而且令人恼火的是,即使它只是在艺术模式下、根本不会发出任何声音,它也会生成 eARC 信号。这就会把回音壁从光纤输入切走,让我很不爽。我本可以把一个视频投屏设备插到回音壁的 HDMI 端口上,然后把音频投送过去,但那样一来,每次我播放音乐时,屏幕上的艺术品就会被专辑封面取代,这同样不是我想要的氛围。话说回来,这些都算不上什么重要的事。 直到我了解到,澳大利亚版本的回音壁*确实*支持 Google Cast。Samsung 官方支持页面可以下载固件镜像,我下载之后发现它是加密的。然而,当我下载美国版本型号的固件镜像时,发现加密后的数据块完全一致——两者的底层固件没有任何差别。那么,为什么一个版本有支持,另一个却没有呢? 要真正弄清这个问题,我需要一份未加密的固件副本,而获取它最简单的办法就是在 eBay 上蹲一个同系列的坏掉的型号。到手之后,我用热风枪拆下了设备上的 eMMC 存储芯片,清理干净芯片引脚,然后把它插入一个这样的适配器(https://www.amazon.com/dp/B06Y55DKND)中,在本地机器上读取。Samsung 在部分设备上使用了一种叫做 VDFS4 的自制文件系统,这台设备就是其中之一,所以我需要拼凑一个内核,使其兼容 Samsung 为该设备提供的源码包(并非所有 VDFS 驱动都能读取所有 VDFS 文件系统),不过最终我成功提取了全部内容,然后又被其他事情分散了注意力,所以让我们快进到这一周。 Samsung 使用了一个修改版的 Android Debug Bridge(https://developer.android.com/tools/adb),叫做 sdb,它包含在 Tizen SDK 中。固件显示该设备上有 sdbd,并且如果插入一个名为"huart0"的网络设备,它就会被执行。幸运的是,Samsung 为其 GPL 授权的组件提供了源代码,所以我可以深入研究,发现 drivers/net/usb/usbnet.c 中有大量对 huart 的引用(huart 似乎是"HyperUART"的缩写)。如果设置了 CONFIG\_SAMSUNG\_USBNET\_HYPERUART\_IFNAME,并且以太网设备使用的是 asix 或 ax88179\_178a 驱动,且 "/opt/etc/HyperUART\_IP\_Addr"[^1](https://codon.org.uk/~mjg59/blog/p/getting-google-cast-on-my-soundbar/#fn:1)的内容不只是"0",它就会将接口名设置为"huart0",进而触发 sdbd 启动。所以现在我只需要想办法把 /opt/etc/HyperUART\_IP\_Addr 设置成其他值。 一番挖掘之后,我找到了一个引用了该文件的二进制程序 wap-factory,这又把我引向了 /usr/share/mobile-mgr/jsons/com.samsung.audio.waapp-verification-test.json,其中提到了一个 "SetUartOnOff" 调用,这又让我来到了这里(https://github.com/travnie/wambridge/blob/0b8ad203ad36cbc3c5ce6e807b1cb36d1db4e8b6/docs/WAM_PROTOCOL.md?plain=1)[^2](https://codon.org.uk/~mjg59/blog/p/getting-google-cast-on-my-soundbar/#fn:2),由此我掉进了 Samsung WAM 协议的兔子洞。长话短说,你需要连接到 55001 或 56001 端口,并在同一个连接上发出两个请求: `` 1 2 3 4 5 6 7 8 9 `` `` GET /connect HTTP/1.1 Host: 192.168.87.126:56001 User-Agent: SamsungMultiroom/1.0 Connection: interactive GET /UIC?cmd=%3Cname%3ESetUartOnOff%3C/name%3E%3Cp%20type%3D%22str%22%20name%3D%22uartOnOff%22%20val%3D%22on%22/%3E HTTP/1.1 Host: 192.168.87.126:56001 User-Agent: SamsungMultiroom/1.0 Connection: interactive `` 然后把一个 asix 芯片组的以太网适配器插入 USB 端口(我这台是 micro-B 接口,所以需要一个 OTG 转接头),突然间它就以 192.168.250.250 的地址出现在网络上了,并且会和你说 sdb 协议。`sdb root on` 可以切换到 root 模式,`sdb shell` 现在就能给你一个 root shell。我进去了,现在可以调查到底发生了什么。 首先,有一个名为 "com.samsung.audio.google-cast-control-app" 的进程在运行,看起来是个不错的切入点。不幸的是,它什么也没做。经过一些追踪,我发现它在启动时会向 Samsung 服务器发起一个调用,然后收到一个回复,告知它 Cast 支持不可用。该请求(我手动运行时它很贴心地把内容输出到了 stdout)包含了国家代码,在我的情况下是"US"。我用 curl 手动重复了这个请求,将代码改为"AU",结果告诉我*是*支持的,所以现在我需要弄清楚如何让回音壁相信它是澳大利亚版本的。一番挖掘后发现它从一个名为 db/comss/countrycode 的配置变量中读取这个值,于是运行: `` 1 `` `` buxton2ctl set-string system db/comss/countrycode AU `` 就让我通过了这道关卡。然而现在它开始抱怨无法配置密钥。/usr/apps/com.samsung.audio.google-cast-control-app/shared/res 中包含一堆加密的数据块和一个名为 teeStoreKey.elf 的应用程序,追踪 com.samsung.audio.google-cast-control-app 显示它试图调用该程序,但似乎因为权限问题而失败。直接以 root 权限运行 com.samsung.audio.google-cast-control-app 成功触发了密钥配置,几秒钟后,其余的 Cast API 就启动了,我可以用标准的 Cast API 调用与 8443 端口通信。不幸的是,它仍然没有作为一个 Cast 设备正常工作——它没有通过 mDNS 广播自己,所以什么也发现不了它。查询 /setup/eureka\_info 端点给了我一条线索——'tos\_accepted' 字段是 false。通常这个字段会在设备初始设置过程中被设置,但 Samsung 的应用程序没有这样做,因为它认为该设备不支持 Cast。事实证明,向 setup/set\_eureka\_info 发送一个包含 {"tos\_accepted": true} 的 JSON POST 请求就能让它工作,突然间,我的网络中就多了一个可用的 Cast 设备。 (更新:我意识到我完全没有提到它*为什么*一开始要做密钥配置!Cast 协议本身并不强制要求加密身份验证,但 Google 的参考客户端实现——几乎所有人都在使用的那个——会验证设备出示的身份是否能链回到 Google。不出所料,他们不希望私钥材料被轻易提取出来用于制造克隆设备,所以一切本应是加密的,只能被某种可信执行环境访问,这就是为什么密钥需要加载到 Trustzone 中,绝不能以明文形式对主操作系统可见) 任务完成。不幸的是,该设备随后从我的 SmartThings 家庭中消失了,大概是因为它报告的国家代码与我账户的国家不匹配。要解决这个问题,我需要想办法让 com.samsung.audio.google-cast-control-app 在不更改全局设备国家的情况下修改查询,或者忽略来自 Samsung 的回复(它每 24 小时就会查询一次,唉),更烦人的是,这个设备只执行已签名的二进制文件。不过奇怪的是,出厂的已签名二进制文件中包含一个完整的 Python 解释器,所以如果我愿意花足够的时间,也许可以拼凑出足够的 Python 来执行任意二进制文件。我目前还不想这么做。 更现代的回音壁不再实装 55001 或 56001 端口上的监听程序。我不知道在那些设备上如何启用 sdb。 [^1]: (原文脚注链接,指向该博客文章的脚注 1) [^2]: (原文脚注链接,指向该博客文章的脚注 2)

相似文章

亲爱的,我把电视缩小了

Hacker News Top

一篇个人博客文章,探讨如何通过将 Samsung Q990D 回音壁的卫星音箱重新配置为前置音箱,并结合 Samsung 的 Q-Symphony 技术与全新的 Music Studio 7 音箱,在获得更宽广前置声场的同时保留真正的环绕后置声道。

逆向工程Creative Katana音箱以从Linux控制

Hacker News Top

一位开发者逆向工程了专有的Creative Sound Blaster Katana V2X音箱的USB协议,以便从Linux控制它,记录了捕获流量、去混淆固件和分析命令的过程。

我逆向解析了一款桌游

Hacker News Top

作者通过反编译 Hitster 桌游的 Android 应用,破解了其使用 AES-GCM 加密的歌曲数据库,绕过了 Spotify/Apple Music 订阅限制,揭示了该应用极其草率的数据保护措施。

无需触碰,通过音箱入侵你的电脑

Hacker News Top

一位安全研究人员对 Creative Sound Blaster Katana V2X 的固件进行了逆向工程,发现了漏洞,攻击者可在15米范围内将音箱变成隐蔽的窃听工具和无需物理接触的 Rubber Ducky。