Tassimo 咖啡机的逆向工程 T 盘条码

逆向工程 硬件
2021-06-12 01:06:59

希望这是合适的

我有一台使用 T-Disk 的 Bosch Tassimo TAS2002EE 咖啡机。那些包含咖啡/牛奶/其他东西,以及一个应该告诉机器如何处理磁盘的条形码。

我想要做的是了解条形码并提出一些不同的条形码,这些条形码将被接受为有效,并让我调整例如饮料量。

起初我没能找到有关这些条形码什么像样的信息,前谷歌命中了之类的东西之间的这种相当无用的咆哮。出人意料的是,在搜索 T 盘的图片时(为了研究更多条码),我偶然发现了这篇有用的帖子:Hacking the Tassimo - Part 2: Breaking the Code 存档,它也链接到这个 T 盘相关的专利,其中有一个解释控制位的表格。虽然这很有希望,但它没有任何结果,正如博客作者自己发现的那样第 3 部分存档


除了上面链接中的信息之外,这是我自己发现的。

条码使用Interleaved 2 of 5符号和 6 位数字。最后一位是根据UPC校验位规则计算的校验位
去除校验和的实际条形码:

条码 产品 产量,毫升 条码二进制
06409 咖啡奶油 150 00011001 00001001
06178 浓咖啡 80 00011000 00100010
63735 拿铁牛奶(大盘) ? 11111000 11110111
06182 卡布奇诺牛奶(小盘) ? 00011000 00100110
06665 热可可 ? 00011010 00001001
07879 服务盘 200 00011110 11000111

服务盘用于清洁,它使60°C的热水直接流过,无需任何冲泡时间。

使用条码打印机,我尝试修改 Coffe Créma 条码以提供 300 毫升(专利中的最大量)。我做了一些非常广泛的测试,打印出来并向机器输入一些条码,看起来条码中有 6 位,而不是 4 位来控制数量。该数据可在这里在谷歌文档。有问题的 6 位范围在中间:第一个字节的最后 3 位和第二个字节的前 3 位(大端)。由于 Google Docs 不支持单元格内颜色,因此Google Drive 上还上传一个颜色更漂亮的 Excel 文件

所以我确定了两个 6 位序列,它们为 Crema 产生了 300 ml。
出于兴趣,我将其中一个序列放入原始 Espresso 条形码的相应位置。就是这样,我喝了 300 毫升浓缩咖啡。

虽然这有点成功(我现在能够为我感兴趣的饮料制作正确体积的条形码),但我仍然完全不知道这是如何工作的。正如您从实验表中看到的那样,该模式相当模糊,并且有些条目从不同的位组合中给出了相同的音量。我也不确定我是否得到了与我制作的条形码相同的酿造参数。

请分享您对如何进一步理解这一点的想法。

4个回答

考虑您能够修改的代码。修改后的代码的十进制表示为 065375。

The checksum of 064095 =  3*0 + 6 + 3*4 + 0 + 3*9 + 5 = 50 (≡ 0 mod 10).
The checksum of 065375 =  3*0 + 6 + 3*5 + 3 + 3*7 + 5 = 50 (≡ 0 mod 10).

所以看起来这个磁盘被接受是因为校验和匹配,而你的其他磁盘因为错误的校验和而没有被接受。

现在,如果我从十进制数中删除校验和数字,并将它们转换为二进制:

06409 = 0001 1001 0000 1001
06537 = 0001 1001 1000 1001

不幸的是,这与专利体积表中的任何内容都不匹配,即使我比较了较大的体积(170 / 230 以考虑留在盘中的水)或较小的体积(130 / 190)。- 我的两个数字只有一位不同,表格中的每个组合都需要不止一个不同的位。但是,不能保证机器中的体积表与专利中的相同。

我会尝试采用上述代码,在每个代码中一个接一个翻转,计算十进制数,在校验和数字上粘贴,并将其打印到条形码,然后检查会发生什么:

$ ./bitflip 0001100100001001
1001100100001001 391771
0101100100001001 227933
0011100100001001 146012
0000100100001001 023139
0001000100001001 043618
0001110100001001 074339
0001101100001001 069212
0001100000001001 061537
0001100110001001 065375
0001100101001001 064736
0001100100101001 064415
0001100100011001 064255
0001100100000001 064019
0001100100001101 064132
0001100100001011 064118
0001100100001000 064088

如果所有这些条码都被接受,它们应该会产生不同的结果,这应该会提示哪个位具有哪个含义。

如果你想玩一些其他的位组合,这里是我的 bitflip 程序的源代码(它不是最干净的代码,如果你除了二进制数字之外的任何东西都会产生奇怪的结果,但它会完成这项工作):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int pos, pos2, binval, checksum;
    char oldbit;
    char buf[10];

    if (argc!=2 || strlen(argv[1]) != 16) {
            fprintf(stderr, "Need a 16 bit binary value\n");
            exit(1);
    }
    for (pos=0; pos<16; pos++) {
            oldbit=argv[1][pos];
            argv[1][pos]=(oldbit == '1' ? '0' : '1');
            binval=0;
            for (pos2=0; pos2<16; pos2++) {
                    binval=(binval<<1) | (argv[1][pos2]=='1');
            }
            sprintf(buf, "%05d", binval);
            checksum=
                     3*(buf[0]-'0')
                    +  (buf[1]-'0')
                    +3*(buf[2]-'0')
                    +  (buf[3]-'0')
                    +3*(buf[4]-'0');
            checksum=10-(checksum%10);
            if (checksum==10)
                    checksum=0;
            printf("%16s %5s%d\n", argv[1], buf, checksum);
            argv[1][pos]=oldbit;
    }
}

首先是关于似乎没有对齐的卷的想法。Q 中第一个链接讨论了清除和充电部分 - 这些将有助于体积,并且体积表可能假设来自这些过程的一些贡献可能不是最小的

其次 - 为您提供更多数据:

我们有一个饮水机盘(它代替了出水口,所以它不是很有用;我用一个洗过的苏查德巧克力盘来盛水)。水盘有 4 个可选择的条形码,用于 4 种不同的容量(150、250、350 和 450 毫升)。不过,我无法在网上或 android 上获得任何东西来实际阅读这些愚蠢的东西。如果有人感兴趣,我可以张贴扫描件,我会继续尝试,但根据维基百科它似乎没有启动代码

编辑:扫描的饮水机光盘

热水T型盘

此外,在夏天,英国网站赠送了用冷水制作普通饮料的覆盖物。我还没有测试过它们,但根据维基百科,它们也不符合 ITF 规范。

╔============╦=====================╦========== ==╦===========================╗
║ 条码 ║ 产品 ║ 输出,毫升 ║ 二进制(不包括第一个/最后一个) ║
╠============╬=====================╬========= ==╬===========================╣
║ ?????? ║ 水 ║ 150 ║ ║
║ ?????? ║ 水 ║ 250 ║ ║
║ 0 690872 6 ║ 水 ║ 350 ║ 1010 1000 1010 1011 1000 ║
║ 0 191694 6 ║ 水 ║ 450 ║ 0010 1110 1100 1100 1110 ║
╚============╩=====================╩========= ==╩===========================╝

上述条码是使用 Android 条码扫描仪读取的。

科斯塔

  • Costa Americano (220ml) 297615(单T盘)
  • 歌诗达卡布奇诺 (215ml)
    • 卡布奇诺和拿铁咖啡的 Costa 浓缩咖啡022095
    • 奶精 (S) 卡布奇诺061827
  • 歌诗达焦糖拿铁(320ml)
    • 卡布奇诺和拿铁咖啡的 Costa 浓缩咖啡022095
    • 奶精 (L) 焦糖拿铁637350

吉百利

  • 吉百利热巧克力(265ml)
    • 吉百利热巧克力066655
    • 奶精 (S) 用于吉百利061827

杰瓦利亚

  • Gevalia Kaffe Espresso 849838(专业 T-Disc 显然与家庭酿酒商不兼容)
  • Gevalia 咖啡594912
  • Gevalia Kaffe 焦糖浓缩咖啡(60ml) 674270
  • Gevalia Kaffe Signature Blend 642262

麦克斯韦之家

  • Maxwell House Morning 648035(大号 12floz 份量 355ml?)

星巴克

  • 星巴克浓缩咖啡烘焙596831

黑卡

  • Carte Noire 卡布奇诺(190ml)
    • Carte Noire Expresso Intense 061780
    • 奶精 (S) 卡布奇诺061827
  • Carte Noire Petit Dejeuner Classic (215ml) 297615 (单T盘)
  • Carte Noire Espresso Classic (60ml) 061780 (单T盘)

第二杯

  • 第二杯巧克力糖浆(195ml) 676458
  • Second Cup Espresso Forte (65ml) 594592

富翁

  • 纳博早餐杜马丁 683050

米尔卡

  • Milka 热巧克力(245ml)
    • 米尔卡巧克力066655
    • 奶精 (S) 用于 Milka、Marabou 和Freia 061827

塔西莫品牌

  • 卡布奇诺奶精(215ml) 634793
  • 拿铁奶精(250ml) 636070
  • 甜拿铁奶精(200ml) 634793

其他

  • (双胞胎?)(奶油/牛奶)用于柴拿铁674478
  • Twinings 英式早餐茶 (195ml) 032872 (单T盘)
  • Corner Coffee House 薄荷巧克力糖浆676458
  • 茶吧桃子冰茶349130(这是未加热的水吗?)
  • 太祖醒红茶699556
  • 苏查德热巧克力(195ml)047852(单T盘)
  • Kenco 中烤(195ml)297615(单T盘)

笔记:

  1. Carte Noire Espresso Classic 60ml + Carte Noire Expresso Intense from Cappuccino 190ml 共享条形码,可能暗示 Cappuccino 的奶精 = 130ml?
  2. Kenco Medium Roast 195ml + Carte Noire Petit Dejeuner Classic 215ml 尽管有 20ml 的差异,但使用相同的条形码?
  3. Capuccino 的 Creamer 和 Cadbury 的 Creamer 具有相同的条形码,但箔标签不同。
  4. Costa Cappuccino 和 Costa Caramel Latte 使用相同的 Costa Espresso 制作卡布奇诺和拿铁 T 盘

我有先机!!

我查看了很多数据,我认为人们正被二进制文件的十进制表示分心。我们只需要关注二进制文件。我首先从对查普曼咨询帖子神秘而精确的评论中获得了这个想法看起来像是有一些内部知识的人,可能。

OP GSerg 发布了一个很棒的谷歌电子表格,其中包含二进制文件的实验。

我的假设是有专用于某些功能的位范围。例如,我已将液体体积隔离为特定的三位(8 个设置)。但是,我认为液体体积会根据不同的位范围而变化。

我认为有多种模式,每种模式都有自己的温度范围。

这是 OP 电子表格的副本,二进制文件上有间距以隔离重要体积位的位置。

https://docs.google.com/spreadsheets/d/1Qpj4KC9xK5Dr7VY5HoNWr9azHKRl94jKABDwTKTbUfg/edit?usp=sharing

我认为这是条形码与我们拥有的功能的第一个直接关联。

我们比以往任何时候都更接近破解这个问题!有了更多的数据,尤其是温度数据,我想我可以弄清楚。