Skip to content

← 返回 NFC.cool Blog

在 iPhone 和 Android 上读取、收藏并克隆 Amiibo

一个虚构的 NFC 收藏手办,旁边的手机正显示着私人收藏界面

大家总以为 Amiibo 里面藏着什么稀奇的东西,某种你在别处买不到的 Nintendo 专属芯片。其实并没有。手办底座里封着的,只是一颗 NTAG215,就是我每天都在读写的那种空白贴纸芯片,一包十片、售价低到可以忽略不计的那种。大约 540 字节的内存,一个出厂时就烧录好的序列号,整个手办就这么点东西。真正值钱的是那块塑料,芯片几乎只是个附带品。

而这正是长久以来一直让我耿耿于怀的地方。我靠读写 NFC 标签谋生,却有一整类标签,就是我书桌旁架子上那几个手办,我自己的 App 对它们却束手无策。我希望 NFC.cool 成为你手机上能装到的、功能最全面的 NFC App,不放过任何一种标签。

于是我坐下来,一边摆着手办,一边放着我的 Switch,认认真真地给 NFC.cool 加上了 Amiibo 支持。下面就是最终的成果,以及我一路上学到的东西,先从这个问题说起:为什么一颗这么便宜的芯片,复制起来却出人意料地难。


那么,神奇之处到底在哪里?

既然芯片这么普通,神奇之处显然就不在硅片里,而是在那些字节里。说白了,Amiibo 就是一本廉价的笔记本,Nintendo 用一套私有的密码在上面做了记录,然后在末尾签上名,好让你能分辨真伪。(芯片本身就是一颗普通的 NTAG215,如果你想更深入地了解各种标签类型的话。)

这些字节里存着两样东西。第一样是公开的:一小块数据,说明这是哪个角色,比如来自《塞尔达传说》系列、属于某个特定 Amiibo 阵容的 Link。你的 Switch 读取的就是这部分,从而知道有一个手办刚刚碰了上来。第二样是锁住的:真正的存档数据,比如昵称、拥有者的 Mii、这个手办被使用过多少次,以及当前游戏在它获准使用的那一小块草稿区里随手写下的任何内容。这部分是加密的,而且经过了签名。

为什么你没法直接复制一个 Amiibo

加密后的存档并不是靠一把固定的密钥来保护的,那种查到一次就能永远复用的密钥并不存在。每一枚标签都有自己的一套密钥,是当场从一组主密钥出发、再和从这枚特定标签上读出的数据混合推导出来的,其中就包括它独一无二的序列号。除此之外,整段数据还用 HMAC 做了签名。只要改动其中一个字节而不重新签名,主机就会识破这是伪造品,拒绝接受这个手办。

陷阱就在这里。由于序列号同时被绑进了密钥推导和签名两个环节,你没法把一个真的 Amiibo 导出来,再逐字节复制到一枚空白标签上。空白标签的序列号不一样,于是推导出来的每一把密钥都不同,签名也就对不上,主机会直接拒绝。那种想当然的 “把所有页面全复制一遍” 的做法,每一次都注定失败。

要想正确地克隆一个,你必须针对目标标签重新推导密钥,并重新给数据签名,让它对这一块特定的塑料和硅片有效,而不是对你导出来源的那一个有效。大家都以此为基础的参考实现,是一个叫 amiitool 的工具。我把这一整套流程原生地在 App 里重建了一遍:标签格式转内部格式再转回来、密钥推导、加密、签名,这样 NFC.cool 就能在你手里的手机上完成整件事,全程不需要电脑参与。

NFC.cool 现在能做什么

三件事,按照你大概率会用到的顺序来说。

**读取。**把一个 Amiibo 贴到手机背面,就像你读取任何 NFC 标签那样,NFC.cool 会当场把它识别出来:角色、游戏系列、Amiibo 系列、手办类型和封面图,还有几项来自标签本身的信息,比如它被写入过多少次。这一步不需要任何密钥。识别一个手办,只会触及那部分本就公开的数据。

**收藏。**你扫描过的每一个 Amiibo 都会被保存到 “我的收藏” 里,那是一个把你拥有的一切整齐排列的网格。它就存在你的设备上,在 iPhone 上还会通过 iCloud 同步到你的其他 Apple 设备,封面图也会被缓存下来,这样即使离线,收藏看起来也依然完整。光是这一点,就把我那个可怜的小架子变成了一个我真正能翻来翻去欣赏的东西。

**克隆。**导入你自己的密钥后,你就可以把一个手办重新生成密钥后的副本写入一枚空白的 NTAG215。你既可以直接从刚扫描的手办克隆,也可以从设备上保存的 .bin 导出文件克隆。App 会为你手上这枚空白标签重新推导密钥,并针对这枚标签给数据签名,因此这份副本是以它自身的方式合法有效的,而不是一份注定失败的逐字节伪造品。写入是永久性的,标签一旦被锁定,就锁死了,App 会在你确认之前把这一点讲得清清楚楚。

哪些是我刻意没有做的

NFC.cool 不附带 Amiibo 的密钥,将来也永远不会。App 里没有藏着任何密钥,也没有内置任何 Amiibo 数据库。

读取和收藏开箱即用,因为它们始终只触及标签上公开的那部分。克隆则不同:它需要主密钥,而那些密钥是 Nintendo 的,不是我的。如果你已经自己弄到了它们,无论是合并好的 key.bin,还是那两个分开的文件,你只需把它们导入 App 一次,克隆功能就会开启。如果你没有,它就保持关闭。机器是我造的,燃料得由你自己带来。

我觉得这才是一条诚实的界线。这项能力是真的有用。给一个你家孩子说不定哪个倒霉下午就会弄丢的手办做个备份,或者把备份放到一张便宜的卡片上、而不用拿原件去冒险,这些都是人们想要它的真实理由。我宁愿给你一个干净、私密、在你自己手机上就能完成的方式,也不愿假装这种需求根本不存在。但我不会去分发那些本就不属于我、无权分发的东西。

它是真的管用

我不想仅凭一腔信念就把这个功能发布出去,所以我用唯一算数的方式做了测试。

我扫描了自己的一个手办,把它克隆到一枚空白的 NTAG215 上,然后把这份副本拿到我的 Switch 上。我打开《塞尔达传说 王国之泪》,用克隆件轻触右侧的 Joy-Con,它就往我的物品栏里丢进了一把游戏内道具。和原件一模一样。没有任何抱怨,也没有 “无法读取此 Amiibo”。就是在那一刻,整件事对我来说才变得真实起来。所有那些密钥推导的数学运算、那些字节排布,最终换来的,是一枚廉价的空白贴纸,而一台 Nintendo 主机心甘情愿地把它当成了真正的手办。


我书桌旁的那个架子,如今不再只是装饰了。它成了一项功能。

如果你想试试,Amiibo 工具就在 NFC.cool 里,iPhoneAndroid 上都有,和我为读写标签打造的其他一切功能并排放在一起。带上你自己的密钥,轻触一个手办,看看这一路以来你的 App 一直在悄悄忽略的,究竟是什么。