解剖 CueCat

作者:Michael Guslick

昨天我在 RatShack(“你有问题。我们有茫然的凝视。”)买了一个 CueCat 条形码扫描仪,以及一些其他零碎的东西。[访问 http://www.getcat.com/ 获取你自己的免费 CueCat—编者注。] 如果这家商店真的在他们的商业销售目录中出售这些东西,我会很高兴——我不需要动画猫王普雷斯利电话,我需要本地的微控制器和专用 IC 来源。但跑题了。

让一些人担心的事情之一是,Radio Shack 的店员会在他们的系统中记录你的姓名和地址,然后才给你 CueCat。然而,在购买时似乎没有办法将特定的 CueCat 与人联系起来(尽管 Digital Convergence 很可能将 CueCat 追溯到特定的 Radio Shack)。虽然每个 CueCat 都有一个唯一的序列标识符,但每个 CueCat 包装正面都有完全相同的条形码(这是店员扫描的内容)。我的目标是找到序列标识符隐藏在 CueCat 内部的什么地方……

我打开包装,立即开始打开扫描仪(见图 1 和图 2)。

Dissecting the CueCat

图 1. PCB 底面扫描图

Dissecting the CueCat

图 2. PCB 顶面扫描图

我小心地移除了屏蔽罩,并用力移除了串行 EEPROM(见图 3)。

Dissecting the CueCat

图 3. 移除屏蔽罩后的电路板图像

引起我注意的是电路板顶面上的小型 8 针设备 (U1)(见图 4)。有关半导体设备的详细列表,请参见侧边栏。

Dissecting the CueCat

图 4. 小型 8 针设备

CueCat 的半导体设备

扫描图并没有真正显示标记,但它是一个 ATC 93LC46,这是一个 1kbit 串行 EEPROM。不幸的是,ATC 的页面上没有该设备的数据手册。不用担心,因为其他制造商,如 Microchip 和 Holtek,都有 93LC46 可用。Holtek 的 HT93LC46 的数据手册位于此处,它比 Microchip 的单元更接近匹配,因为它实现了一个 ORG 引脚来控制内存的访问方式(在上图中,ORG 引脚连接到 VSS——如果它实际上是 Holtek 93LC46,这将使该单元可按 128 个 8 位字寻址,但 ATC 单元的设置方式似乎相反——稍后会详细介绍)。

我尝试的第一件事是从电路板上移除 93LC46。然而,我真的没有配备拆焊 SMT 设备的工具,所以这相当徒劳。所以,我只是将一些绕线线焊接到引脚上,看看发生了什么。我将我可靠的示波器连接到它们,发现数据仅在 CueCat 上电时从 93LC46 中读出(在上电后约 100 毫秒,确切地说)。

在此之后,我尝试将 93LC46 连接到一个 PIC 微控制器(使用我编写的一小段代码),看看串行 EEPROM 内部隐藏着什么。不幸的是,我设法擦除了 EEPROM 的内容(现在看起来它将所有位置读回为 0xFF)。好吧,至少我不再有那个讨厌的序列号了。

不幸的是,对于普通关注隐私的个人来说,连接微控制器来擦除 EEPROM 有点超出范围。我猜应该可以通过切断到 EEPROM 的 CLK 线来禁用序列号,这对于任何有敏锐的眼睛和锋利的 X-acto 刀的人来说都应该很容易。

我必须等到我拿到另一个 CueCat 后才能调查 EEPROM 内部的内容。与此同时,我一直在寻找确切扫描哪些 EEPROM 数据区域。使用我可靠的 Tek TDS 210,我仔细查看了 CS(芯片选择)、SK(时钟)和 DI(数据输入)线。对于那些感兴趣的人,93LC46 是一个 SPI(串行外围接口)设备——它使用同步串行线来传输数据(你电脑的串口是异步的,不使用单独的时钟线)。CS 线用于告知特定芯片正在与它通信,否则它将忽略发送给它的数据。

93LC46 总共发送了九个命令(它们都是读取命令,但稍后会详细介绍)。CS 线总共变为高电平九次(第一个 CS “脉冲”非常长,因为 CS 线在 CueCat 上电后立即变为高电平),我以此为基线来查看 SK 时钟线上发生了什么(因为我的示波器只有两个通道,我无法一次查看每个引脚)。我注意到在每个 CS “脉冲”期间有 27 个时钟脉冲,并且我可以看到时钟脉冲之间的间隙,其中 CS 线变为高-低-高。我将 SK 和 DI 线连接到示波器,并查看了实际发送的位:CS “脉冲” 时钟输入数据

1 0110000001111111...2 0110000010111111...3 0110000011111111...4 0110000100111111...5 0110000101111111...6 0110000110111111...7 0110000111111111...8 0110001000111111...9 0110001001111111...

好的,现在首先要注意的是,前导 0 基本上是垃圾,因为第一个 1 实际上是一个起始位(还不是命令的开始)。此外,尾随的 1s 实际上并不是发送到 EEPROM 的位——这些是为 EEPROM 提供的时钟脉冲,用于在其 DO 线路上写出其数据。所以我们真正拥有的是像这样的命令

10000110

后跟一条高电平 DI 线。前两位是命令,后跟地址。在 93LC46 中,10 是读取命令。但是这是什么?我们只有六位来定义地址,并且在命令发送后还有超过八个时钟脉冲——EEPROM 必须组织为 64 个 16 位字!

因此,微控制器从地址 0x01 到 0x09 读取总共 9 个 16 位字(我不知道他们为什么不从 0x00 开始)。请注意在此扫描样本中,

.C3nZC3nZC3nYCNr2C3fWCNnY.fHmc.C3DZCxPWCNzWDNnX.<\n>
     000000001175023101      UPA     040293153502

序列 ID 字段为 18 个字符长(或 9 个 16 位字)。我想知道他们是否在其他 55 个字中隐藏了任何巧妙的东西?以及他们为什么要使用串行 EEPROM?我认为像 Dallas Semiconductor 的硅序列号这样的东西会是一种更小、更便宜、完全非易失性的替代方案,但也许这让 DC 更好地控制分配 ID(也许有一个“特殊”条形码可以扫描进来以重写 EEPROM?)。不过,我很高兴他们使用了 93LC46——你可以拆焊它们并将它们用于其他用途……

无论如何,我渴望通过切断到 93LC46 的一条走线来尝试禁用序列 ID——我没有一个全新的 CueCat 来尝试,但如果有人想试一试,切断图 5 中黄色切割标记指示的任何走线都应该禁用序列号(或给浮动电压以真正破坏微控制器读回的内容——你甚至可能能够以这种方式获得一些“随机”序列号)。

Dissecting the CueCat

图 5. 从上到下切割禁用 DI(数据输入)、SK(时钟)和 CS

或者,你可以切断图 6 中指示的微控制器到 DO(数据输出)线的线路(我倾向于自己尝试这个——浮动电压可能会很有趣)。记住——你只需要切断一条线即可禁用序列 ID——任你选择。

Dissecting the CueCat

图 6. 在此处切割以禁用 DO(数据输出)线。

如果有人决定试一试,请告诉我结果如何——你的 CueCat 应该仍然能够毫无问题地读取条形码。

我昨晚又买了一个 CueCat——这个是 68-1965-A 型号(据说是更常见的型号),而不是此处显示的 68-1965 型号。稍后我会拆开这个型号并发布内部结构。你怎么区分它们?A 型号有四个小螺丝固定在一起,旧型号有两个大螺丝。A 型号在猫屁股上的电线处有一个小索环,扫描窗口是一个大的黑色正方形,而不是 68-1965 型号上较小的矩形开口。

哦,如果任何代表 Digital Convergence 的律师想给我发威胁信、停止和终止令,或更多硬件来拆卸(当 USB CueCat 可用时,我会很感激)。但请预先注意,任何法律废话都会遭到礼貌的“去你的!”回应。

转载许可

Michael (mguslick@matrixpm.com) 毕业于威斯康星大学密尔沃基分校机械工程专业(他在那里首次接触到 UNIX,当然还有 Linux)。他喜欢计算机、电子产品,并与他的未婚妻 Kristin 共度时光。他还无可救药地沉迷于玩彩弹射击,并在这项运动上挥霍大量金钱。在网上,他使用 “Have Blue” 的绰号。

加载 Disqus 评论