有关 Fitbit Charge 固件更新机制的信息?

逆向工程 固件 嵌入式
2021-06-30 14:03:35

我一直在尝试获取我最近获得的 Fitbit Charge 的固件。由于设备是密封的,我一直在尝试查看是否可以让它更新其固件,然后对其进行分析。

使用 mitmproxy,我能够从 Mac 桌面应用程序捕获两个“检查更新的固件”请求。请求是通过将 base64 编码的 blob 发送到 URL 来发出的:

https://desktop-client.fitbit.com/1/devices/client/tracker/data/firmware.json

(注意:只有通过身份验证后才能访问)

到目前为止我看到的两个请求:

请求 #1:

MQIAAAEAOwoAANHJhDAaCIh2xT9OB1J2GpqN5SrNsKeydnOCgDG00HTd0RSBLBsRtcvJvjrwkelgU0McyKrswGUo3JJytwPTsG3zB73bA9lFomPwrMKZhXA+XqvsYYIULi82bZJFE/W3H5Wu5lNikw2LyIqUOI1D1ywXnRQDdAxvdofFix8Y034AAA==

十六进制转储:

0000000: 3102 0000 0100 3b0a 0000 d1c9 8430 1a08  1.....;......0..
0000010: 8876 c53f 4e07 5276 1a9a 8de5 2acd b0a7  .v.?N.Rv....*...
0000020: b276 7382 8031 b4d0 74dd d114 812c 1b11  .vs..1..t....,..
0000030: b5cb c9be 3af0 91e9 6053 431c c8aa ecc0  ....:...`SC.....
0000040: 6528 dc92 72b7 03d3 b06d f307 bddb 03d9  e(..r....m......
0000050: 45a2 63f0 acc2 9985 703e 5eab ec61 8214  E.c.....p>^..a..
0000060: 2e2f 366d 9245 13f5 b71f 95ae e653 6293  ./6m.E.......Sb.
0000070: 0d8b c88a 9438 8d43 d72c 179d 1403 740c  .....8.C.,....t.
0000080: 6f76 87c5 8b1f 18d3 7e00 00              ov......~..

请求#2:

MQIAAAEASQoAANHJhDAaCGm7Oe56jNmLQ6+5vNdvC17TaFGe/xQzYYN9+nZjwxvKFLKpfyI44tY9Pxt4jpqkzbaN5B88lxLhMbesFxkuKWgW7dF4QAH+ie8sM2szJ4rIjuCffp3yLpMAeiIychkQ0hviyjYniPGw2X8nAVUMKXDp1EeQMuP2MX4AAA==

十六进制转储:

0000000: 3102 0000 0100 490a 0000 d1c9 8430 1a08  1.....I......0..
0000010: 69bb 39ee 7a8c d98b 43af b9bc d76f 0b5e  i.9.z...C....o.^
0000020: d368 519e ff14 3361 837d fa76 63c3 1bca  .hQ...3a.}.vc...
0000030: 14b2 a97f 2238 e2d6 3d3f 1b78 8e9a a4cd  ...."8..=?.x....
0000040: b68d e41f 3c97 12e1 31b7 ac17 192e 2968  ....<...1.....)h
0000050: 16ed d178 4001 fe89 ef2c 336b 3327 8ac8  ...x@....,3k3'..
0000060: 8ee0 9f7e 9df2 2e93 007a 2232 7219 10d2  ...~.....z"2r...
0000070: 1be2 ca36 2788 f1b0 d97f 2701 550c 2970  ...6'.....'.U.)p
0000080: e9d4 4790 32e3 f631 7e00 00              ..G.2..1~..

不幸的是,这些请求的主体似乎以某种方式加密了(除了前 16 个字节和最后 3 个字节之外,相对统一的字节分布)。

我还尝试使用 mitmproxy 发送 base64 数据的稍微修改版本(在正文中翻转一点,更改一些标头数据等),但是任何更改都会导致服务器响应数据无效。

那么,有什么想法可以欺骗服务器向我发送固件更新吗?

2个回答

那么,有什么想法可以欺骗服务器向我发送固件更新吗?

对桌面应用程序进行逆向工程,找到它在何处提取您设备的固件编号(可能是 80,因为这是当前的固件版本),并在加密该数据并将查询发送到服务器之前将其更改为较低的编号。

这不是真正的答案,而是有关某人可能会觉得有用的主题的更多信息...

我反编译了适用于 android 的 fitbit apk 并发现了这个:

http://pastebin.com/2uxKd6WK

我以为我到了某个地方,可能是一种解码上面发布的服务器发送的字节的方法:

        byte[] b(byte abyte0[])
        {
            char ac[] = (new String(abyte0)).toCharArray();
            ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
            int i1 = ac.length;
            for (int j1 = 0; j1 < i1; j1 += 2)
            {
                Object aobj[] = new Object[2];
                aobj[0] = Character.valueOf(ac[j1]);
                aobj[1] = Character.valueOf(ac[j1 + 1]);
                bytearrayoutputstream.write(Integer.parseInt(String.format("%c%c", aobj), 16));
            }

            return bytearrayoutputstream.toByteArray();
        }

但这似乎没有任何意义,或者至少我不明白这部分如何生成有效的十六进制,然后从这两个字符中生成一个字节:

bytearrayoutputstream.write(Integer.parseInt(String.format("%c%c", aobj), 16));

我在这里放了一些可以在线运行的代码:http : //ideone.com/UaOzpI

如果有人能理解它,请回答!